Futurebasic/Language/Reference/外观按钮
✔ Appearance χ Standard χ Console
appearance button[#] [-] id&[, [state][, [value][, [min][, [max][, ¬ [title$][,[rect][, [type]]]]]]]
2002年2月(版本6)
appearance button
语句在当前输出窗口中放置一个新控件,或更改现有控件的特性。创建按钮后,您可以使用 dialog
函数来确定用户是否点击了它。您可以使用 button close
语句,如果您想在不关闭窗口的情况下处理按钮。
当您首次使用特定 ID(在给定窗口中)创建按钮时,您必须指定所有参数,直到并包括 type
。如果您以后想修改该按钮的特性,请再次执行 appearance button
,使用相同的 ID,并指定一个或多个其他参数(除了 type
,它不能更改)。按钮将使用您指定的新的特性重新绘制;您没有指定的任何参数都不会更改。
id& |
一个正整数或负整数,其绝对值在 1 到 2147483647 之间。您分配的数字必须与该窗口中的所有其他滚动条或按钮不同。负值构建不可见按钮。正值构建可见按钮。 |
state |
状态可能是
|
value , min , max |
通常是控件的初始值、最小值和最大值的整数。 |
title$ |
一个字符串表达式。此参数不用于设置使用 _kControlStaticTextProc 或 _kControlEditTextProc 定义的按钮的文本。有关如何实现这一点的信息,请参见 def SetButtonTextString 。 |
|
局部窗口坐标中的矩形。您可以使用两种形式之一来表达它
|
type |
以下文本中列出的任何类型。 |
在按钮创建时,为缺少的参数提供的默认值为
state |
_activeBtn |
value |
1 |
min |
0 |
max |
1 |
title$ |
空字符串 |
您可以使用 button -1
或 appearance button
-1
隐藏控件,也可以使用 button 1
、_grayBtn
或 appearance button 1, _grayBtn
禁用控件。按钮通常会在选项卡窗格显示或隐藏时隐藏和显示。对于响应项目(如组弹出式标语)而更改的窗格也是如此。要读取外观按钮的值,请使用 x = button( id )
或 x = button( id, _FBGetCtlRawValue )
以下实用程序例程将帮助您访问有关新外观按钮的信息
actualSize = fn ButtonDataSize( btnID, part, tagName )
def GetButtonData( btnID, part, tagName, maxSize,¬ theData, actualSize )
def SetButtonTextString( btnID, theString )
theString = fn ButtonTextString$( btnID )
def SetButtonFocus( btnID )
def GetButtonTextSelection( btnID, selStart, selEnd )
def SetButtonTextSelection( btnID, selStart, selEnd )
外观管理器引入了许多新的控件定义。虽然我们无意完全记录所有 Apple 的新按钮,但以下显示了几个可能的类型以及每个类型如何实现的示例。
由于外观管理器在 System 9 和 OS X 中都可以使用,您将看到每个控件的呈现方式存在重大差异。下面显示了两个版本中常见的按钮。
<img src="a/appearancebutton01.gif" alt="appearancebuttonhtm01" height="496" width="328" border="0"> | <img src="a/appearancebutton02.gif" alt="appearancebuttonhtm02" height="473" width="312" border="0"> |
OS X 中的按钮
|
System 9 中的按钮
|
为了让您看到每个按钮的显示方式,以下代码显示了用于生成显示的源代码。
/* appearance button [#] [-] id&[, [state][, [value][,¬ [min][, [max][, [title$][,[rect][, [type]]]]]]] */ appearance button bRef,_activeBtn,0,0,1,¬ "_kControlPushButtonProc",@r,_kControlPushButtonProc appearance button bRef,_activeBtn,0,0,1,¬ "_kControlBevelButtonSmallBevelProc",@r,¬ _kControlBevelButtonSmallBevelProc appearance button bRef,_activeBtn,0,0,1,¬ "_kControlBevelButtonNormalBevelProc",@r,¬ _kControlBevelButtonNormalBevelProc appearance button bRef,_activeBtn,0,0,1,¬ "_kControlBevelButtonLargeBevelProc",@r,¬ _kControlBevelButtonLargeBevelProc // "value" is menu ID appearance button bRef,_activeBtn,101,0,1,¬ "Bevel+_kControlBevelButtonMenuOnRight",@r,¬ _kControlBevelButtonSmallBevelProc + ¬ _kControlBevelButtonMenuOnRight // max value is cicn ID appearance button bRef,_activeBtn,0,0,256,¬ "_kControlPushButRightIconProc",@r, ¬ _kControlPushButRightIconProc appearance button bRef,_activeBtn,0,0,256,¬ "_kControlPushButLeftIconProc",@r,¬ _kControlPushButLeftIconProc // get rect from pict to determine button size h = fn GetPicture( 256 ) long if h pR;8 = @h..picFrame% OffsetRect( pR, -pR.left, -pR.top ) OffsetRect( pR, r.left, r.top ) // control "value" is pict ID appearance button bRef,_activeBtn,256,0,1,¬ "_kControlPictureProc",@pR,_kControlPictureProc end if
这里没有显示所有可能的按钮(及其变体)。例如,用于显示箭头以指示菜单存在的控件是用一个小斜面构建的。如果使用 _kControlBevelButtonLargeBevelProc + _kControlBevelButtonMenuOnRight
,它将用一个大斜面创建。
您可能想调查的其他按钮类型是
_kControlIconProc _kControlIconNoTrackProc _kControlIconSuiteProc _kControlIconSuiteNoTrackProc _kControlPictureNoTrackProc
FB 按钮(是 Control Manager 控件)可以分组在一起,放置在标语中或用线条分隔。以下示例在纯白色背景上创建按钮,以便您可以更轻松地看到控件定义所实现的绘图。我们从用于创建按钮的源代码语句开始。
appearance button bRef,_activeBtn,0,0,1,¬ "_kControlGroupBoxTextTitleProc",@r,¬ _kControlGroupBoxTextTitleProc appearance button bRef,_activeBtn,0,0,1,¬ "_kControlGroupBoxSecondaryTextTitleProc",@r,¬ _kControlGroupBoxSecondaryTextTitleProc appearance button bRef,_activeBtn,1,0,1,¬ "_kControlGroupBoxCheckBoxProc",@r,¬ _kControlGroupBoxCheckBoxProc appearance button bRef,_activeBtn,1,0,1,¬ "_kControlGroupBoxSecondaryCheckBoxProc",@r,¬ _kControlGroupBoxSecondaryCheckBoxProc // min value is menu ID appearance button bRef,_activeBtn,1,101,1,¬ "",@r,_kControlGroupBoxPopUpButtonProc appearance button bRef,_activeBtn,1,101,1,¬ "",@r,_kControlGroupBoxSecondaryPopUpButtonProc appearance button bRef,_activeBtn,1,0,1,¬ "",@r,_kControlPlacardProc appearance button bRef,_activeBtn,1,0,1,¬ "",@r,_kControlSeparatorLineProc
<img src="a/appearancebutton03.gif" alt="appearancebuttonhtm03" height="435" width="346" border="0"> | <img src="a/appearancebutton04.gif" alt="appearancebuttonhtm04" height="429" width="349" border="0"> |
OS X 中的分组和分隔符
|
System 9 中的分组和分隔符 |
外观管理器按钮的优势之一是,一个按钮可以嵌入另一个按钮中。通过禁用或隐藏父按钮(称为超级控件),所有嵌入式控件将自动被禁用或隐藏。每个窗口都有一个称为根控件的主控件。以下示例构建一个窗口,其中包含一个父单选按钮组。在该父组内部是三个单选按钮。我们可以通过获取父按钮的值(通过 button()
函数)来确定三个按钮中的哪一个被选中。
dim r as Rect dim pR as Rect dim h as handle dim bRef as long dim err as OSErr // setup _btnHt = 20 _btnWd = 80 _btnMargin = 8 bRef = 1 |
<img src="a/appearancebutton05.gif" alt="appearancebuttonhtm05" height="152" width="103" border="0"> |
// create a window SetRect( r, 0, 0, _btnWd_btnMargin_btnMargin, 120 ) appearance window 1,,@r err = fn SetThemeWindowBackground( window( _wndPointer ),¬ _kThemeActiveDialogBackgroundBrush, _zTrue ) // button #1 is the papa button // note that the parent button has sufficient space so that // it holds all embedded buttons within its own rectangle SetRect( r ,_btnMargin, _btnMargin,¬ _btnMargin_btnWd, (_btnMargin_btnHt)*3 ) appearance button bRef, _activeBtn, 0, 0, 1,¬ "", @r, _kControlRadioGroupProc bRef ++ SetRect( r, _btnMargin, _btnMargin, _btnMargin_btnWd,¬ _btnMargin_btnHt ) appearance button bRef, _activeBtn, 0, 0, 1,¬ "Radio 1", @r, _kControlRadioButtonProc def EmbedButton( bRef, 1 ) bRef ++ : OffsetRect( r, 0, _btnHt_btnMargin ) appearance button bRef, _activeBtn, 0, 0, 1,¬ "Radio 2", @r, _kControlRadioButtonProc def EmbedButton( bRef, 1 ) bRef ++ : OffsetRect( r, 0, _btnHt_btnMargin ) appearance button bRef, _activeBtn, 0, 0, 1,¬ "Radio 3", @r, _kControlRadioButtonProc def EmbedButton( bRef, 1 ) local fn HandleDialog dim as long action,reference action = dialog( 0 ) reference = dialog( action ) long if action = _btnclick MoveTo( 8, 100 ) print "Current Button "; button( 1 ); end if end fn on dialog fn HandleDialog do HandleEvents until gFBQuit
除了外觀上的明顯差異外,複選框通常遵循與多年來相同的指南。此規則的一個顯著例外是創建混合複選框的能力。此框包含一個短劃線而不是勾選標記,以顯示當前選項的一部分,但不是全部,具有特定功能。這為控制範圍添加了新的最大可能值 2 (_kControlCheckBoxMixedValue = 2
)。
可能的複選框值現在包括
_kControlCheckBoxUncheckedValue
_kControlCheckBoxCheckedValue
_kControlCheckBoxMixedValue
<img src="a/appearancebutton06.gif" alt="appearancebuttonhtm04" height="136" width="207" border="0"> |
复选框 |
上面屏幕截圖中的按鈕使用以下代碼行創建
appearance button bRef, _activeBtn,¬ _kControlCheckBoxUncheckedValue, 0,¬ _kControlCheckBoxMixedValue,¬ "Unchecked Check Box", @r, _kControlCheckBoxProc appearance button bRef, _activeBtn,¬ _kControlCheckBoxMixedValue, 0,¬ _kControlCheckBoxMixedValue,¬ "Mixed Value Check Box", @r, _kControlCheckBoxProc appearance button bRef, _activeBtn,¬ _kControlCheckBoxCheckedValue, 0,¬ _kControlCheckBoxMixedValue,¬ "Checked Check Box", @r, _kControlCheckBoxProc
注意:您不能使用 button bRef, state
來勾選和取消勾選類型為 _kControlGroupBoxCheckBoxProc
和 _kControlGroupBoxSecondaryCheckBoxProc
的組按鈕。請改用 appearance button bRef,,state-1
。(button bRef,0
和 button bRef,1
然而會分別停用和啟用按鈕)。
時間和日期按鈕
[edit | edit source]除了更常見的控件外,Appearance Manager 可以創建管理日期和時間的按鈕。維護特殊的數據結構以訪問這些控件的信息,但通過遵循一些簡單的示例,您可以快速掌握這些技能。
增強的 button
函數對於從控件中提取複雜數據很有用。兩個特定的項目開始發揮作用
ignored = button( btnRef, _FBGetControlDate ) ignored = button( btnRef, _FBGetControlTime )
引用這兩個函數中的任何一個將填充一個名為 gFBControlLongDate
的全局日期/時間記錄和另一個名為 gFBControlSeconds
的記錄。名為 gFBControlSeconds
的變量是一個帶符號的 64 位變量,可以保存在文件中或用於任何需要壓縮存儲的變量中。
gFBControlLongDate
的格式是 LongDateRec
的格式,它遵循以下結構的佈局
begin record LongDateRec dim era as short dim year as short dim month as short dim day as short dim hour as short dim minute as short dim second as short dim dayOfWeek as short dim dayOfYear as short dim weekOfYear as short dim pm as short dim res1 as short dim res2 as short dim res3 as short end record
在調用 button
函數檢查控件的內容後,您可以提取日期/時間的部分內容,如下所示
dayOfMonth = gFBControlLongDate.day thisYear = gFBControlLongDate.year
另一個變量用於保存特定日期/時間控件的文本。gFBControlText
(一個 Pascal 字符串)的內容由第二個 button
函數參數決定。當使用 _FBGetControlDate
時,它是控件的日期。當使用 _FBGetControlTime
時,它是控件的時間。
<img src="a/appearancebutton07.gif" alt="" height="283" width="442" border="0"> |
Date/Time Buttons |
除了在創建日期/時間控件時設置特定類型外,您還必須設置以下內容之一的初始值
_kControlClockNoFlags _kControlClockIsDisplayOnly _kControlClockIsLive
創建時間/日期示例的特定語句如下所示
appearance button bRef, _activeBtn, 0, 0, 1,, @r,¬ _kControlClockTimeProc appearance button bRef, _activeBtn, _kControlClockIsLive, 0, 1,,¬ @r ,_kControlClockTimeSecondsProc appearance button bRef, _activeBtn, _kControlClockNoFlags,¬ 0, 1,, @r, _kControlClockDateProc appearance button bRef, _activeBtn, _kControlClockNoFlags,¬ 0, 1,, @r, _kControlClockMonthYearProc appearance button bRef, _activeBtn, ¬ _kControlClockIsLive_kControlClockIsDisplayOnly,¬ 0, 1,, @r, _kControlClockTimeSecondsProc
要提取和顯示控件的內容,創建了以下語句
err = button( bRef, _FBgetControlTime ) edit field bRef, gFBControlText, @r
等待狀態
[edit | edit source]Appearance Manager 提供了幾種方法來告訴用戶您的應用程序正在忙於一項任務。這些方法包括追逐箭頭以及有限和不確定的進度條。
<img src="a/appearancebutton10.gif" alt="IMAGE imgs/appearancebutton.htm15.gif" height="144" width="120"> |
等待狀態 |
追逐箭頭控件易於創建,並且是自維護的。每次程序掃描事件時,箭頭都會動畫顯示。以下語句創建一個追逐箭頭控件
appearance button bRef, _activeBtn, 0, 0, 1,, @r,¬ _kControlChasingArrowsProc
進度條也很容易創建,但您需要記住幾件事。首先,進度條在 -32,768 到 +32,767 的範圍內運作。如果您的任務涉及更多步驟,您將不得不計算一個比率以將事物保持在範圍內。其次,進度條由您的程序更新。這就像為按鈕設置一個新值一樣容易,但這段代碼必須由您編寫。
控件的最小值和最大值變為進度條的最小值和最大值。初始值和當前值顯示當前進度率。在上面的示例中,按鈕是使用以下源代碼創建的
appearance button bRef, _activeBtn, 50, 0, 100,, @r,¬ _kControlProgressBarProc
最小值為零;最大值為 100。在創建時,控件值為 50,因此指示器顯示橫跨條形的一半的着色。如果我們想指示下一步已完成,我們將使用以下代碼
appearance button bRef,, 51
不確定的進度條更加複雜。在創建按鈕後,您必須將控件的內部數據設置為新值。以下代碼顯示了如何操作
appearance button bRef, _activeBtn, 1, 0, 1,, @r,¬ _kControlProgressBarProc dim b as boolean dim err as OSErr b = _true err = fn SetControlData( bRef, 0,¬ _kControlProgressBarIndeterminateTag, sizeof( boolean ), @b )
範圍選擇器(滑塊和箭頭)
[edit | edit source]<img src="a/appearancebutton08.gif" alt="appearancebuttonhtm02" height="349" width="146" border="0">滑塊有很多變體。每個滑塊都以 _kControlSliderProc
的簡單類型常量開始。將額外的參數添加到此常量以向控件添加功能。以下常量可用于滑塊變體
_kControlSliderLiveFeedback _kControlSliderHasTickMarks _kControlSliderReverseDirection _kControlSliderNonDirectional
要創建一個使用向上指針指示器並帶有刻度的滑塊,將使用以下類型
_kControlSliderProc + ¬ _kControlSliderHasTickMarks + ¬ _kControlSliderReverseDirection
垂直滑塊是通過使用垂直尺寸大於水平尺寸來構建按鈕來創建的。控件定義會自動處理新的方向。
範圍選擇器滑塊和小箭頭
以下源代碼行顯示了如何創建此顯示
appearance button bRef, _activeBtn, 1, 1, 10,, @r,¬ _kControlSliderProc appearance button bRef, _activeBtn, 10, 1, 10,, @r,¬ _kControlSliderProc_kControlSliderHasTickMarks appearance button, _activeBtn, 1, 1, 10,, @r,¬ _kControlSliderProc_kControlSliderNondirectional appearance button bRef, _activeBtn, 1, 1, 10,, @r,¬ _kControlSliderProc_kcontrolSliderReverseDirection appearance button bRef, _activeBtn, 10, 1, 10,, @r,¬ _kControlSliderProc_kControlSliderHasTickMarks +¬ _kcontrolSliderReverseDirection // vert orientation appearance button bRef, _activeBtn, 10, 1, 10,, @r,¬ _kControlSliderProc appearance button bRef, _activeBtn, 10, 1, 10,, @r,¬ _kControlSliderProc_kControlSliderNondirectional appearance button bRef, _activeBtn, 10, 1, 10,, @r,¬ _kControlSliderProc_kControlSliderHasTickMarks +¬ _kcontrolSliderReverseDirection appearance button bRef, _activeBtn, 0, 0, 1,, @r,¬ _kControlLittleArrowsProc
創建滑塊時,刻度數由控件的初始值設置。在創建控件後,值將重置為控件的最小值。滑塊的範圍從 -32,768 的最小值到 +32,767 的最大值。刻度數是您需要根據控件的大小和控件的最小/最大值的範圍來決定的。
小箭頭(如上面的屏幕截圖所示)用於增加和減少相關的可視計數器(通常是具有特定數字範圍的編輯字段)。當前版本的 OS X 控件定義不允許此類控件高度值的變體。我們的測試表明,它必須恰好 22 像素高。其他值會將箭頭偏移到斜角區域內部,或者在更極端的情況下,會將箭頭完全放置在斜角區域之外。
彈出菜單
[edit | edit source]有兩種截然不同的彈出菜單:斜角和標準。兩者都是有效的類型,在實際使用中,應根據您的個別應用程序和 Apple's Human Interface Guidelines 來決定使用哪一種。斜角按鈕的創建方式如下
appearance button bRef, _activeBtn, menuID, 0, 1,¬ "Bevel+_kControlBevelButtonMenuOnRight",¬ @r, _kControlBevelButtonSmallBevelProc + ¬ _kControlBevelButtonMenuOnRight
創建斜角按鈕菜單時,控件的初始值是菜單的資源 ID 號。可以使用三個特定的 button
函數命令從控件中提取信息。
handle = button( bRef, _FBgetBevelControlMenuHandle ) currentItem = button( bRef, _FBgetBevelControlMenuVal ) previousItem = button( bRef, _FBgetBevelControlLastMenu )
<img src="a/appearancebutton11.gif" alt="" height="237" width="283"> |
彈出菜單按鈕 |
標準彈出按鈕遵循略有不同的語法。在創建時,最小值指定菜單資源 ID,最大值是菜單標題的寬度。傳入 -12345 的菜單 ID 會導致彈出窗口不嘗試從資源中獲取菜單。相反,您可以構建菜單並稍後在彈出數據信息中填充菜單句柄字段(使用 def SetButtonData( id&, _kControlMenuPart, _kControlPopupButtonMenuHandleTag, sizeof( handle ), @yourMenuHndl )
)。您可以將 -1 傳遞給 max
參數,讓控件自行計算標題的寬度,而不是猜測然後調整以使其正確。它在標題和彈出窗口之間添加了適當的間距。最大值為零表示“不要顯示標題”。
創建後,您可能需要使用以下命令將值、最小值和最大值更改為彈出菜單的正確設置
appearance button id&,, value, min, max
上面插圖中的標準彈出按鈕菜單是使用以下代碼創建的
appearance button bRef, _activeBtn, 0, 101, -1, "Pop Title:"¬ ,@r, _kControlPopUpButtonProc
單個 button
函數提供對菜單句柄的訪問。請記住:標準和斜角彈出菜單不使用相同的 button
函數常量。
menuHandle = button( bRef, _FBgetControlMenuHandle )
您可以使用以下命令檢索當前的彈出菜單項
mItem = button( bRef )
列表框
[edit | edit source]列表通常使用辅助资源来定义其格式。使用的资源类型为“ldes”,可以使用 Resourcerer 2.4 或更高版本创建其定义,或在任何资源编辑器中创建模板。您也可以格式化一个句柄以匹配_"ldes"
记录,并将该句柄保存为资源。创建控件时,会将 ldes 的资源 ID 传递给“value
”参数。您可以传递零作为值,这将告诉列表框控件不使用资源。列表将使用默认值创建,并将使用标准的LDEF (0)
。您可以通过获取列表句柄来更改列表。可以使用以下标签(_kControlListBoxLDEFTag
)与def SetButtonData
结合使用来设置 LDEF。
列表框资源的定义如下:
begin record ldes dim versionNumber as short dim numberOfRows as short dim numberOfColumns as short dim cellHeight as short dim cellWidth as short dim hasVertScroll as boolean dim filler1 as byte dim hasHorizScroll as boolean dim filler2 as byte dim LDEFresID as short dim hasSizeBox as boolean dim reserved as byte end record
以下示例从 ID 为 256 的资源创建列表框。然后,它用项目文本填充列表。
为了简化此示例,Resourcerer 用于创建列表框资源。
<img src="a/appearancebutton12.gif" alt="IMAGE imgs/appearancebutton.htm18.gif" height="282" width="329"> |
创建 ldes 资源 |
appearance button bRef, _activeBtn, 256, 0, 1,¬ "List Box", @r, _kControlListBoxProc dim cH as handle //control handle dim @bufferSize as long dim @lH as handle //list handle dim y,t$ dim @celly,cellX //cell "point" record cH = button&( bRef ) err = fn GetControlData( cH, 0,¬ _kControlListBoxListHandleTag, ¬ sizeof( handle ), lH, bufferSize ) cellX = 0 for cellY = 0 to 9 t$ = "Item #" + mid$( str$( cellY + 1 ), 2 ) LSetCell( @t$[1], t$[0], celly, lH ) next
<img src="a/appearancebutton09.gif" alt="" height="148" width="166" border="0"> |
列表框 |
选项卡按钮比其他控件需要更多的工作。这源于选项卡实际上是几个协同工作的控件。首先是主选项卡控件。创建它时,通过设置控件的最大值来指定将存在的选项卡数量。通常最好以不可见的方式创建选项卡按钮(使用负按钮引用号),然后通过使用引用号的正版本发出button
语句来显示它。
为选项卡构建初始外壳后,必须使用def SetButtonData
设置每个选项卡的标题。然后,为每个选项卡插入一个用户窗格。这些窗格使用def EmbedButton
嵌入到选项卡外壳中。将在每个用户窗格中驻留的按钮被创建并嵌入到用户窗格中。
当遇到对话框事件时,选项卡外壳按钮的值对应于选项卡列表中单击的选项卡的位置。您的程序必须循环遍历每个用户窗格,并显示或隐藏它们,以使显示与单击的选项卡匹配。
研究以下示例以了解如何创建一个工作选项卡按钮。请务必注意用于维护按钮的简单dialog
处理程序。
<img src="a/appearancebutton13.gif" alt="" height="233" width="312" border="0"> |
选项卡按钮 |
有许多种类的选项卡按钮
_kControlTabLargeProc _kControlTabSmallProc _kControlTabLargeNorthProc _kControlTabSmallNorthProc _kControlTabLargeSouthProc _kControlTabSmallSouthProc _kControlTabLargeEastProc _kControlTabSmallEastProc _kControlTabLargeWestProc _kControlTabSmallWestProc
此示例使用_kControlTabSmallProc
,但您应该尝试使用其他类型以查看结果。
dim r as Rect dim x as long dim bRef as long dim infoRec as ControlTabInfoRec // Names of the individual tabs _tabCount = 3 dim tabTitles$(_tabCount) tabTitles$(1) = "One" tabTitles$(2) = "Two" tabTitles$(3) = "Three" // create a window SetRect( r, 0, 0, 300, 200 ) appearance window 1, "Tabs", @r, _kDocumentWindowClass def SetWindowBackground( _kThemeActiveDialogBackgroundBrush,¬ _zTrue ) /* Button 100 is the tab 'shell'. In this example, it is made to be the full size of the window, less a small margin. Buttons 1, 2, & 3 will be the embedded user panes that contain information to be displayed for each tab. A tab control is usually built as invisible. This is because the information contained in the tabs will be modified as the control is being constructed. Making it visible after all modifications have been completed provides a cleaner window build. */ _tabBtnRef = 100 _btnMargin = 8 InsetRect( r, _btnMargin, _btnMargin ) appearance button -_tabBtnRef, 0, 0, 2, _tabCount,, @r,¬ _kControlTabSmallNorthProc /* Fix the tab to use a small font. This is not a requirement, but it is information which many will find useful. */ dim cfsRec as ControlFontStyleRec cfsRec.flags = _kControlUseSizeMask cfsRec.size = 9 def SetButtonFontStyle( _tabBtnRef, cfsRec ) /* Adapt a rectangle that can be used for the content area of each tab. */ InsetRect( r, _btnMargin, _btnMargin ) r.top += 20 // Loop thru the tabs and set up individual panes for x = 1 to _tabCount infoRec.version = _kControlTabInfoVersionZero infoRec.iconSuiteID = 0 infoRec.Name = tabTitles$(x) def SetButtonData( _tabBtnRef, x, _kControlTabInfoTag, ¬ sizeof( infoRec ), infoRec ) /* Each of these panes is a button that is embedded in the tab button. The first one will be visible. All others will be invisible because information from only one tab at a time can be viewed. Remember: negative button reference numbers make invisible buttons. Once a new pane button (_kControlUserPaneProc) is created, it is embedded into the larger tab button. */ if x != 1 then bRef = -x else bRef = x appearance button bRef,,¬ _kControlSupportsEmbedding,,,, @r,¬ _kControlUserPaneProc def EmbedButton( x, _tabBtnRef ) next /* Now we have a tab shell (_tabBtnRef = 100) and in it we have embedded three tab panes (1,2, and 3). To demonstrate how these can contain separate info, we will place a simple button in each of the three panes. Button 10 in pane 1 Button 20 in pane 2 Button 30 in pane 3 */ InsetRect( r, 32, 32 ) r.bottom = r.top + 24 r.right = r.left + 128 appearance button 10, _activeBtn,,,,¬ "Pane #1", @r, _kControlPushButtonProc def EmbedButton( 10, 1 ) OffsetRect( r, 8, 8 ) appearance button 20, _activeBtn,,,,¬ "Pane #2", @r, _kControlPushButtonProc def EmbedButton( 20, 2 ) OffsetRect( r, 8, 8 ) appearance button 30, _activeBtn,,,,¬ "Pane #3", @r, _kControlPushButtonProc def EmbedButton( 30, 3 ) button _tabBtnRef, 1 // make visible /* Only one event (a button click in the tab shell button) gets a response from out dialog routine. The value returned (1,2, or 3) corresponds to buttons 1,2, or 3 that were embedded into the tab parent. Our only action is to show (BUTTON j) or hide (BUTTON -j) the proper tab pane. All controls embedded in those panes will automatically be shown or hidden. */ local fn doDialog dim as long action, reference, j action = dialog( 0 ) reference = dialog( action ) long if action == _btnClick and reference == _tabBtnRef for j = 1 to _tabCount long if j == button( _tabBtnRef ) button j xelse button -j end ifF next end if end fn on dialog fn doDialog do HandleEvents until gFBQuit
无特殊说明。
button&; 按钮函数; 按钮关闭; 滚动按钮; 对话框函数; def EmbedButton; def SetButtonData