跳转到内容

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 状态可能是

_grayBtn (0/disabled)
_activebtn (1/default/active)
_markedBtn (2/selected)

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

rect

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

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

@rectAddr&
指向 8 字节结构体(如 Rect 类型)的长整型表达式或 pointer 变量。

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

新的注意事项

[编辑 | 编辑源代码]

在按钮创建时,为缺少的参数提供的默认值为

state _activeBtn
value 1
min 0
max 1
title$ 空字符串

您可以使用 button -1appearance button -1 隐藏控件,也可以使用 button 1_grayBtnappearance 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,0button 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

语言参考

华夏公益教科书