`
lovnet
  • 浏览: 6920808 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Mac OS X Programming读书笔记3 - 事件处理

阅读更多

Chapter 3 Events and the Carbon Event Manager

1 Events

Carbon Event Manager所支持的事件有两个属性:

1. Event Class,表示事件的类别,如鼠标消息:kEventClassMouse

2. Event Kind,事件的具体类型,如鼠标按键按下消息:kEventMouseDown

kEventClassMousekEventMouseDown的定义如下:

KEventClassMouse = FOUR_CHAR_CODE('mous');

KEventMouseDown = 1;

一般情况下,使用EventTypeSpec结构来指定Event ClassEvent Kind

struct EventTypeSpec

{

UInt32 eventClass;

UInt32 eventKind;

};

比如,命令事件(类似WM_COMMAND)可以这么定义:

EventTypeSpec eventType = { kEventClassCommand,kEventProcessCommand };

2 Installing Events

调用InstallEventHandler函数“安装事件处理函数,接收从Event Target发来的事件:

OSStatus InstallEventHandler( EventTargetRef target,

EventHandlerUPP handlerProc,

UInt32 numTypes,

const EventTypeSpec* typeList,

void* userData,

EventHandlerRef* handlerRef );

1. EventTargetRef target:指定Event Target,也就是事件所挂接的对象。可以用GetWindowEventTargetGetMenuEventTargetGetControlEventTarget等函数来获得Event Target,不能直接用窗口/菜单/控件本身

WindowRef window;

EventTargetRef target;

target = GetWindowEventTarget( window );

2. EventHandlerUPP handlerProc:指定消息处理回调函数。UPP的意思是Universal Procedure Pointer,即统一过程指针,也就是指向回调函数的指针。可以用下面的代码来创建一个EventHandlerUPP对象:

EventHandlerUPP handlerUPP; // Universal procedure pointer

handlerUPP = NewEventHandlerUPP( MyEventHandler );

注意这里MyEventHandler才是回调函数,而handlerUPP指向它。

3. UInt32 numTypes:事件处理的类型个数,可以一个事件处理函数对应多个事件(EventTypeSpec

4. Const EventTypeSpec *typeList:和前面对应,是一个数组,中有numTypesEventTypeSpec,指定了numTypes个事件

5. Void *userData:用户自定义的数据,最终会作为参数传入到事件处理函数中,一般会把Event Target所对应的对象(如Window)传入,如果不需要的话则NULL

6. EventHandlerRef *handlerRef:返回一个对Event Handler对象的指针

3 Event Handler Prototypes

事件处理函数的原型如下:

pascal OSStatus routineName( EventHandlerCallRef nextHandler,

EventRef theEvent,

void* userData );

1. EventHandlerCallRef nextHandler:在事件连接中的下一个事件处理对象,你有时候也许需要先调用其他的处理函数(如缺省的消息处理),然后在这之后再进行处理,可以调用CallNextEventHandler来事先调用下一个事件

2. EventRef theEvent:事件对象的Ref,主要用来获得事件的Parameters

3. Void *userData:之前在InstallEventHandler函数中传入的用户数据指针

4. 返回noErr表示没有错误,而返回eventNotHandledErr则表明使用系统缺省的消息处理(如同DefWindowProc API

4 Event Parameters

事件本身会带很多参数。Mac OS X并不是在事件处理函数的参数里面传入这些参数,而是把这些参数绑定到事件对象本身,然后通过GetEventParameter来获得参数:

OSStatus GetEventParameter( EventRef inEvent,

EventParamName inName,

EventParamType inDesiredType,

EventParamType * outActualType,

UInt32 inBufferSize,

UInt32 * outActualSize,

void * outData);

1. EventParamName inNameEventParamType inDesiredType:事件参数有着名字和类型,比如对kEventMouseDown事件来说,该事件有下面的参数:

Name

Type

Information

kEventParamMouseLocation

typeQDPoint

鼠标位置

kEventParamMouseButton

typeMouseButton

鼠标按键

kEventParamKeyModifiers

typeUInt32

键盘按键

kEventParamClickCount

typeUInt32

按键次数

2. EventParamType *outActualType:返回实际的类型,大部分情况下直接添NULL即可

3. Uint32 inBufferSize:缓冲区大小

4. Uint32 *outActualSize:返回实际需要的缓冲区大小,可以添NULL

5. Void *outData:缓冲区

5 A Sample

下面的事件处理函数负责处理kThisCommand/kThatCommand菜单项,分别作出不同处理:

#define kThisCommand 'this'

#define kThatCommand 'that'

pascal OSStatus MyEventHandler( EventHandlerCallRef handlerRef,

EventRef event,

void * userData )

{

OSStatus result = eventNotHandledErr;

HICommand command;

GetEventParameter( event,

kEventParamDirectObject,

typeHICommand, NULL,

sizeof (HICommand), NULL,

&command );

switch ( command.commandID )

{

case kThisCommand:

MyThisCommandHandler( (WindowRef)userData );

result = noErr;

break;

case kThatCommand:

MyThatCommandHandler( (WindowRef)userData );

result = noErr;

break;

}

return result;

}

分享到:
评论

相关推荐

    NDS开发学习笔记2-常用NDS开发资源.pdf

    4. **DeSmuME**:这是一个开源的NDS模拟器,支持Windows、Linux、Mac OS X等多个操作系统。它提供了一种方便的方式来测试和调试NDS应用程序,具有丰富的调试工具。 5. **DLDI驱动**:NDS的外部存储设备需要DLDI驱动...

    C++ GUI Programming with Qt 4 学习笔记

    Qt是一个跨平台的应用程序和用户界面框架,广泛应用于Linux、Windows、Mac OS X、Android和iOS等操作系统上。它使用C++语言进行开发,并提供了丰富的库以及工具来创建图形用户界面。 学习使用Qt进行GUI编程对初学者...

    teaching-programming-for-gis:Jupyter笔记本讲授GIS编程入门,包括Python核心概念和可用于矢量,栅格和网络数据的软件包

    这些笔记本电脑是在Mac OS Big Sur和Windows 10上开发和测试的。Python版本:3.9。内容每套包括3个笔记本,分别称为内容,练习和解决方案。 这些是相应的Python包所涵盖的主题: 01:数据类型和变量(Python) 02:...

    Springer.The Mathematica Guidebook Programming

    在硬件和软件方面,本书强调了Mathematica可以运行在多种操作系统上,包括Windows、Mac OS和Linux等。这些操作系统下的软件需求略有不同,但Mathematica都能很好地适应。 读者先决条件部分强调了使用本书需要具备的...

    Arduino 实战及学习笔记

    2. 跨平台支持:Arduino IDE支持Windows、Mac OS X、Linux等多种操作系统,便利性极高。 3. 简单易学的编程环境:为初学者提供了易上手的编程界面,同时也具备足够深度,以适应高级用户的需要。 4. 开源的软硬件:...

    C语言学习笔记.docx

    - **Mac OS**:安装Apple的Xcode开发环境,其中包括GCC。 - **Windows**:需要安装MinGW,下载MinGW安装程序后,添加其bin子目录到PATH环境变量中。 【C程序结构】 C程序的基本组成部分包括: 1. **预处理器指令*...

    python的编程工具(IDE)大全.pdf-教程与笔记习题

    IDLE的主循环通过Tkinter进行事件处理,其版本历史可以追溯到Guido van Rossum,即Python的创始人。 2. BlackAdder BlackAdder是一款专门为Windows和Linux操作系统设计的IDE。它由***提供,支持多种编程语言,包括...

    taichi:生产和便携式编程语言,用于在CPU和GPU上进行高性能,稀疏和差异化计算

    支持的操作系统:Windows,Linux,Mac OS X; Python :3.6 / 3.7 / 3.8(仅限64位); 后端:x64 CPU,CUDA,Apple Metal,OpenGL Compute Shaders。 请从源代码构建其他配置(例如,您的CPU是ARM,或者您想试用...

    屏幕提醒_C_atnotes.rar

    3. GUI编程:窗口和控件的创建,事件处理等。 4. API调用:掌握如何正确地使用系统提供的API函数,如`MessageBox`。 5. 异步编程:了解如何在C语言中处理异步事件,例如在用户点击按钮后执行特定操作。 这个压缩包...

    计算机专业英语词汇

    1. **Operating System (OS)**:操作系统是管理计算机硬件与软件资源的计算机程序。它为其他应用程序提供了一个平台来执行任务。 - **重要性**:在计算机系统中扮演着核心角色,负责协调所有软硬件资源。 2. **...

    计算机专业英语词组.pdf

    3. **Trigonometry Function (三角函数)**:在计算中用于处理角度和三角形关系的函数,如正弦、余弦和正切。 4. **Square Root (平方根)**:一个数的非负平方根是另一个数,使得它的平方等于原数。 5. **Floating ...

    linux环境下学习51单片机1

    首先,SDCC是一个完全免费且开源的编译器,可以在Linux、Windows和Mac OS等多个操作系统上运行。通过SDCC,开发者可以在Linux环境下编写和编译针对51单片机的C代码,这为开发者提供了跨平台的编程能力,不再局限于...

    CH341下载线 PCB+驱动(代替PL2303)

    对于Linux或Mac OS用户,可能需要查找相应的开源驱动或社区支持。 五、学习与应用: 对于希望用笔记本进行单片机开发的同学,CH341下载线提供了便捷的编程和调试环境。配合对应的编程软件,如Proteus、Keil、Atmel ...

Global site tag (gtag.js) - Google Analytics