Mac OS X Programming读书笔记5 - Controls

来源:互联网 发布:淘宝轮播图片怎么制作 编辑:程序博客网 时间:2024/05/16 09:41

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);

 

 
原创粉丝点击