Mac OS X Programming讀書筆記5 - Controls

ATField發表於2007-03-11

Chapter 5 Controls

1 Command Signatures and Control IDs

1.     可以將CommandControl聯絡起來,但是當你收到事件的時候,你並不知道當時是哪個Control被按下了。事實上,你也不需要關心,因為Command本來被設計成代表命令,至於是點選Button還是選擇選單都沒有關係

2.     當你需要知道Control究竟發生了什麼事情的時候,你需要給Control分配一個Control ID,包括:

a.     Signature:一個4Char的標記,一般來說應該是程式的Creator Code,也就是Application本身的Signature。大部分情況下,單一程式的所有Control IDSignature都是一樣的

b.     ID:一個整數,真正的獨立在此程式中標記該ControlID

2 Buttons

1.     Bevel Button

2.     ImageWell

3 Radio Buttons

系統負責維護Radio Button的狀態,不需要自己程式設計處理。

1: ControlHandle numBeepsRadioButtonGroup;

2: ControlID numBeepsControlID = { kControlSignature, kRadioGroupControlID };

 

3: GetControlByID( window, &numBeepsControlID,

       &numBeepsRadioButtonGroup );

 

SInt32 numBeepsValue;

4: numBeepsValue = GetControl32BitValue( numBeepsRadioButtonGroup );

1.     宣告一個ControlHandle

2.     宣告ControlControl  ID,也就是這個Radio Button GroupID

3.     通過Control ID獲得ControlHandle

4.     通過Handle獲得Control32-bit整數值,表示哪一個Radio Button被按下了

4 Checkboxes

和上面的非常類似,GetControl32BitValue返回0說明沒有Check1則為Checked

5 Text Input Fields

應該使用GetcontrolData來獲得Text Input Fields所對應的字串:

OSErr GetControlData(

       ControlRef inControl,

       ControlPartCode inPart,

       ResType inTagName,

       Size inBufferSize,

       void * inBuffer,

       Size * outActualSize );

1.     ControlRef inControlControlRef也就是ControlHandle,所以直接傳遞用GetControlByID的返回值即可

2.     ControlPartCode inPart:指定訪問Control的哪一部分,部分Control由多個Control組成,由不同的常量代表不同的子控制元件。如果沒有子控制元件,可以傳遞kControlEntireControl代表整個控制元件本身

3.     ResType inTagName:資料的型別,對於Text Input Field應該傳遞kControlEditTextCFStringTag

4.     Size inBufferSize:緩衝區大小

5.     Void *inBuffer:緩衝區本身

6.     Size *outActualSize:實際大小

舉例如下:

CFStringRef theString;

 

GetControlData(

       stringInTextEdit,

       kControlEntireControl,

       kControlEditTextCFStringTag,

       sizeof( CFStringRef ),

       &theString,

       NULL );

 

同樣的,可以用SetControlData來設定Text Input Field的字串:

OSErr SetControlData(

       ControlRef inControl,

       ControlPartCode inPart,

       ResType inTagName,

       Size inSize,

       void * inData);

 

 

相關文章