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