跳转到内容

Futurebasic/语言/参考/外观按钮

来自维基教科书,自由的教科书

外观按钮

[编辑 | 编辑源代码]

✔ 外观 χ 标准 χ 控制台

appearance button[#] [-] id&[, [state][, [value][, [min][, [max][, ¬
                     [title$][,[rect][, [type]]]]]]]

修订版

[编辑 | 编辑源代码]

2002 年 2 月(第 6 版)

外观 按钮 语句在当前输出窗口中放置一个新的控件,或更改现有控件的特性。创建按钮后,可以使用 对话框 函数来判断用户是否点击了它。如果要删除按钮而不关闭窗口,可以使用 按钮 关闭 语句。

第一次使用特定 ID 创建按钮(在给定窗口中)时,必须指定所有参数,包括 类型。如果以后要修改按钮的特性,请再次执行 外观 按钮,使用相同的 ID,并指定一个或多个其他参数(除 类型 外,无法修改)。按钮将使用您指定的新的特性重新绘制;任何未指定的参数都不会被修改。

id& 一个正数或负数整数,其绝对值在 1 到 2147483647 之间。分配的数字必须与该窗口中的所有其他滚动条或按钮不同。负值创建不可见的按钮。正值创建可见的按钮。
状态 状态可以是

_grayBtn (0/禁用)
_activebtn (1/默认/活动)
_markedBtn (2/选中)

最小值最大值 通常是控件的初始值、最小值和最大值的整数。
标题$ 一个字符串表达式。此参数不用于设置使用 _kControlStaticTextProc_kControlEditTextProc 定义的按钮的文本。有关如何实现此目的的信息,请参阅 def 设置按钮文本字符串

矩形

局部窗口坐标中的矩形。可以使用以下两种形式之一表示它

(x1,y1)-(x2,y2)
两个对角线相对的角点。

@矩形地址&
指向 8 字节结构体(例如 Rect 类型)的长整数表达式或 指针 变量。

类型 以下文本中列出的任何一种类型。

新的注意事项

[编辑 | 编辑源代码]

创建按钮时,为缺失参数(如果有)提供的默认值是

状态 _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

语言参考

华夏公益教科书