跳轉到內容

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

語言參考

華夏公益教科書