Futurebasic/语言/参考/外观按钮
✔ 外观 χ 标准 χ 控制台
appearance button[#] [-] id&[, [state][, [value][, [min][, [max][, ¬ [title$][,[rect][, [type]]]]]]]
2002 年 2 月(第 6 版)
外观 按钮
语句在当前输出窗口中放置一个新的控件,或更改现有控件的特性。创建按钮后,可以使用 对话框
函数来判断用户是否点击了它。如果要删除按钮而不关闭窗口,可以使用 按钮 关闭
语句。
第一次使用特定 ID 创建按钮(在给定窗口中)时,必须指定所有参数,包括 类型
。如果以后要修改按钮的特性,请再次执行 外观 按钮
,使用相同的 ID,并指定一个或多个其他参数(除 类型
外,无法修改)。按钮将使用您指定的新的特性重新绘制;任何未指定的参数都不会被修改。
id& |
一个正数或负数整数,其绝对值在 1 到 2147483647 之间。分配的数字必须与该窗口中的所有其他滚动条或按钮不同。负值创建不可见的按钮。正值创建可见的按钮。 |
状态 |
状态可以是
|
值 、最小值 、最大值 |
通常是控件的初始值、最小值和最大值的整数。 |
标题$ |
一个字符串表达式。此参数不用于设置使用 _kControlStaticTextProc 或 _kControlEditTextProc 定义的按钮的文本。有关如何实现此目的的信息,请参阅 def 设置按钮文本字符串 。 |
|
局部窗口坐标中的矩形。可以使用以下两种形式之一表示它
|
类型 |
以下文本中列出的任何一种类型。 |
创建按钮时,为缺失参数(如果有)提供的默认值是
状态 |
_activeBtn |
值 |
1 |
最小值 |
0 |
最大值 |
1 |
标题$ |
空字符串 |
可以使用 按钮 -1
或 外观 按钮
-1
隐藏控件,可以使用 按钮 1
、_grayBtn
或 外观 按钮 1, _grayBtn
禁用控件。按钮通常在标签窗格被添加或从视图中移除时被隐藏和显示。同样,响应于项目(例如组弹出通知)而更改的窗格也是如此。要读取外观按钮的值,可以使用 x = 按钮( id )
或 x = 按钮( id, _FBGetCtlRawValue )
以下实用程序例程将帮助访问有关新外观按钮的信息
实际大小 = fn ButtonDataSize( btnID, 部分, 标签名称 )
def GetButtonData( btnID, 部分, 标签名称, 最大大小,¬ theData, 实际大小 )
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 中均可使用,因此您将看到每个控件的呈现方式存在较大差异。以下显示了 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` 将分别使按钮失效和激活)。
除了更常见的控件之外,外观管理器还可以创建管理日期和时间的按钮。维护特殊的数据结构来访问这些控件的信息,但通过遵循一些简单的示例,您可以快速掌握这些技能。
增强型 `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
外观管理器提供了多种方法来告诉用户您的应用程序正在处理任务。这些方法包括追逐箭头,以及有限和无限进度条。
<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 )
<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 像素高。其他值会使箭头在斜角区域内偏移,或者在更极端的情况下,会将箭头完全放置在斜角区域之外。
弹出菜单有两种不同的类型:斜角和标准。两者都是有效的类型,具体使用哪一种应由您的个人应用程序以及 Apple 的人机界面指南 指导。斜角按钮的创建方式如下
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 )
列表通常使用辅助资源来定义其格式。使用的资源类型是 'ldes',可以使用 Resourcerer 2.4 或更高版本创建其定义,或者在任何资源编辑器中创建模板。您还可以格式化句柄以匹配 _"ldes"
记录并将其保存为资源。ldes 的资源 ID 在创建控件时通过 'value
' 参数传递。您可以在 value 中传递零,这将告诉 List Box 控件不使用资源。列表将使用默认值创建,并将使用标准 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