//窗口的消息处理函数 LRESULT CALLBACK WindowProc(HWND hWnd,/窗口标识 UINT message,/消息标识 NPARAM wParam,/消息的参数1 LPARAM IParam)/消息的参数2 switch (message) { case WM KEYDOWN: .wParam../wParam为按键在键盘上的位置(扫描码) case WM_CHAR:/字符键消息 .wParam../wParam是按键字符的编码 case WM_COMMAND:/菜单消息 switch(wParam)/wParam是菜单项的标识 case ID FILE OPEN: case ID START TIMER: SetTimer(hWnd,1,1000,NULL);
//窗口的消息处理函数 LRESULT CALLBACK WindowProc(HWND hWnd, //窗口标识 UINT message, //消息标识 WPARAM wParam, //消息的参数1 LPARAM lParam ) //消息的参数2 { switch (message) { case WM_KEYDOWN: ...wParam... //wParam为按键在键盘上的位置(扫描码) ...... case WM_CHAR: //字符键消息 ...wParam... //wParam是按键字符的编码 ...... case WM_COMMAND: //菜单消息 switch (wParam) //wParam是菜单项的标识 { case ID_FILE_OPEN: ...... case ID_START_TIMER: SetTimer(hWnd,1,1000,NULL); ...... ...... }
case WM LBUTTONDOWN:/鼠标左键按下消息 ..IParam../Param为鼠标在窗口中的位置 case WM_PAINT:/窗口刷新消息 case WM_TIMER:/定时器消息 case WM._CLOSE:/请求关闭窗口消息 DestroyWindow(hWnd);/撤销窗▣ break; case WM_DESTROY:/窗口被关闭消息 PostQuitMessage(O);/往本应用的消息队列中放入WM_QUIT break; default:/由系统作默认的消息处理 return DefWindowProc(hWnd,message,wParam,IParam); return O;
case WM_LBUTTONDOWN: //鼠标左键按下消息 ...lParam... //lParam为鼠标在窗口中的位置 ...... case WM_PAINT: //窗口刷新消息 ...... case WM_TIMER: //定时器消息 ...... case WM_CLOSE: //请求关闭窗口消息 DestroyWindow(hWnd); //撤销窗口 break; case WM_DESTROY: //窗口被关闭消息 PostQuitMessage(0); //往本应用的消息队列中放入WM_QUIT break; default: //由系统作默认的消息处理 return DefWindowProc(hWnd,message,wParam, lParam); } return 0; }
■消息处理函数中还可以生成新的消息,方式有 两种: ·PostMesaage ▣消息放入消息队列 SendMessage 直接调用消息处理函数 ■ PostMesaage和SendMesaagel的参数为: HWND hWnd:接收消息的窗口标识 UINT Msg:消息标识 WPARAM wParam:消息的参数1 ●LPARAM IParam:消息的参数2
◼ 消息处理函数中还可以生成新的消息,方式有 两种: • PostMesaage ◼ 消息放入消息队列 • SendMessage ◼ 直接调用消息处理函数 ◼ PostMesaage和SendMesaage的参数为: • HWND hWnd:接收消息的窗口标识 • UINT Msg:消息标识 • WPARAM wParam:消息的参数1 • LPARAM lParam:消息的参数2
消息处理函数应是可再入的 由于消息处理函数在处理一条消息时可能会主动产 生一些新消息,这些消息并不放入消息队列,而是 直接调用消息处理函数来处理这些消息,这样, 。就有可能导致消息处理函数的一次执行还未结束,另 次执行就开始的现象,这可能会引起数据的不一致 错误。 因此,消息处理函数应该是一个可再(重)入函数 (reentrant function),即,函数的调用者要自 带工作区(数据空间): 函数需要的数据要通过参数来传递 函数不能有static存储类的局部变量。 在函数中访问全局变量也可能导致函数不可再入
◼ 由于消息处理函数在处理一条消息时可能会主动产 生一些新消息,这些消息并不放入消息队列,而是 直接调用消息处理函数来处理这些消息,这样, • 就有可能导致消息处理函数的一次执行还未结束,另 一次执行就开始的现象,这可能会引起数据的不一致 错误。 ◼ 因此,消息处理函数应该是一个可再(重)入函数 (reentrant function),即,函数的调用者要自 带工作区(数据空间): • 函数需要的数据要通过参数来传递 • 函数不能有static存储类的局部变量。 • 在函数中访问全局变量也可能导致函数不可再入。 消息处理函数应是可再入的
资源(Resource) 每个Vindows应用程序,除了程序代码外,还包 含一些资源描述: ·菜单:菜单ID、菜单项ID/显示文字。 对话框:对话框ID和尺寸;对话框中各个控件的ID、 类型、尺寸与位置等。 资源描述有规定的格式,存储在相应的资源文件 (.rc)中,经编译后将作为Windows应用程序的 一 部分被链接到应用程序的目标文件中。 资源可以用VC++的资源编辑器来进行可视化编辑
资源(Resource) ◼ 每个Windows应用程序,除了程序代码外,还包 含一些资源描述: • 菜单:菜单ID、菜单项ID/显示文字。 • 对话框:对话框ID和尺寸;对话框中各个控件的ID、 类型、尺寸与位置等。 • ...... ◼ 资源描述有规定的格式,存储在相应的资源文件 (.rc)中,经编译后将作为Windows应用程序的 一部分被链接到应用程序的目标文件中。 ◼ 资源可以用VC++的资源编辑器来进行可视化编辑