跳轉到內容

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

語言參考

華夏公益教科書