特殊说明:版权归个人所有,请勿转载,谢谢合作。
加速键(即热键,快捷键)。是产生WM_COMMAND消息时按键的组合,用于实现功能的快速启动。加速键添加方法如下:
第一步,在资源中加入加速键,在资源视图中,点击鼠标右键,在弹出的菜单中选择【Insert…】项,如图8.28所示。
- 图8.28 插入加速键
在弹出的插入资源界面中的资源列表中,选择【Accelerator】,并点击【New】按钮,如图8.29所示。
- 图8.29 选择加速键
添加完成后,如图8.30所示。
- 图8.30 添加完成
双击蓝色列表项,在弹出的加速键属性界面中,选择【ID】处的内容为菜单的响应ID,这里选择“ID_OPTION_START”,在【Key】处输入键值“F”,当然也可以点击【Next Key Typed】按钮,通过键盘的按键模拟来实现加速键的捕获。在【Modifiers】中选择“Ctrl”,说明程序中使用“Ctrl+F”键,来响应菜单开始功能(同时也可以选择其他项),如图8.31所示。
- 图8.31 设置加速键
设置完成事,如图8.32所示。
- 图8.32 加速键列表
第二步,添加加速键的处理。在创建的窗口的第五步,进入消息循环处,要加入加速键的响应代码。通过LoadAccelerators函数,将加速键列表加入到应用程序中,在消息循环处使用TranslateAccelerator函数,将返回值作为TranslateMessage函数的参数,发送到过程处理函数中(这里影响到了过程处理函数中的wParam的值)。【例8-3】代码如下所示(修改的位置已经加入底纹):
// 添加加速键 HACCEL hAccelTable; hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDR_ACCELERATOR1); // 5. 进入消息循环 while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); }//end if }//end while
第三步,修改菜单的处理方法。刚刚已经提到,TranslateAccelerator函数会影响到wParam参数的值,所以在过程处理函数中,需要将菜单的处理方法进行修改。如果不修改,在程序执行后,按加速键“Ctrl+F”,系统会关闭。【例8-4】修改代码如下(修改的位置已经加入底纹):
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; // 结构体包含了用于绘制窗口客户区的信息 HDC hdc; // 设备环境句柄 int wmId, wmEvent; // 消息处理 switch (message) { // 菜单响应事件 case WM_COMMAND: /* if(wParam == ID_OPTION_START) { //MessageBox(hWnd, "点击了开始菜单项。", "提示", MB_OK); DialogBox(g_hIns, (LPCTSTR)IDD_START_DLG, hWnd, (DLGPROC)DlgProc); } else if(wParam == ID_OPTION_END) { MessageBox(hWnd, "点击了结束菜单项。", "提示", MB_OK); } else { // 退出系统 DestroyWindow(hWnd); }//end if */ wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case ID_OPTION_START: //MessageBox(hWnd, "点击了开始菜单项。", "提示", MB_OK); DialogBox(g_hIns, (LPCTSTR)IDD_START_DLG, hWnd, (DLGPROC)DlgProc); break; case ID_OPTION_END: MessageBox(hWnd, "点击了结束菜单项。", "提示", MB_OK); break; case ID_OPTION_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); }//end switch break; // 图形绘制事件 case WM_PAINT: hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); break; // 窗口销毁消息,关闭窗口时响应。 case WM_DESTROY: PostQuitMessage(0); break; default: // 调用系统默认消息处理,即交给系统处理。 return DefWindowProc(hWnd, message, wParam, lParam); }//end switch return 0; }
至此,点击“Ctrl+F”键,即可弹出对话框。
8.4.4 光标
当在一个文本框或某种程序中输入文字时,总有一个光标来显示将要输入文字的位置,鼠标的光标由箭头形状变成一个小竖线(“I”字型)。Windows光标是一个图像,可以是动态的也可以是静态的(光标的句柄为HCURSOR,文件扩展名为“.cur”)。在Win32 SDK中,提供了一系列的系统默认光标,定义请参见表3.2查看。
自定义光标非常简单,只要在资源视图中创建光标,并做相应的修改即可,如图8.33所示,即为自定义的光标。
- 图8.33 自定义光标
自定义光标或系统光标设置方法相同,在窗口创建的第一步(设计一个窗口类中),将wcex.hCursor的参数设置为LoadCursor函数的返回值即可实现。当然也可以使用如表8.2所示的函数实现动态加载。
- 表8.1 光标操作函数
函数名称 | 描述 |
LoadCursor | 装载光标资源 |
SetCursor | 设置光标 |
SetCursorPos | 设置光标位置 |
GetCursorPo | 获得光标位置 |
ShowCursor | 显示光标 |
DestroyCursor | 销毁光标 |
下例是鼠标左键按下时,光标变为“光标”二字(刚刚设计的光标内容):
case WM_LBUTTONDOWN: { HCURSOR hCur = LoadCursor(g_hIns, MAKEINTRESOURCE(IDC_CURSOR1)); SetCursor(hCur); } break;
需要注意的是,在使用LoadCursor的地方,一定要使用DestroyCursor来销毁光标,销毁的位置可以在窗口关闭的消息内。“IDC_CURSOR1”为自定义光标。
8.4.5 图标
图标是具有明确含义的计算机图形。其中桌面图标是软件标识,界面中的图标是功能标识。用户可以Windows提供的图标(如表8.3所示),也可以使用资源的方式自定义图标。图标的句柄为HICON,文件扩展名为“.ico”。
- 表8.2 系统常用图标
值 | 描述 |
IDI_APPLICATION | 缺省图标 |
IDI_ASTERISK | 信息图标,与IDI_INFORMATION类似 |
IDI_EXCLAMATION | 惊叹号图标 |
IDI_HAND | 停止图标 |
IDI_QUESTION | 问号图标 |
IDI_WARNING | 警告图标 |
图标的应用大部分在程序启动后使用单一的图标,所以这种方法加载就非常简单了,只要在创建窗口时,将wcex.hIcon与wcex.hIconSm设置成相应的图标即可。当然也可以使用LoadIcon函数加载图标、DrawIcon函数绘制图标、DestroyIcon函数销毁图标。
8.4.6 字符串表
字符串表是字符串列表,它便于使用的格式保存。Windows程序经常以字符串表的方式存储提示信息或错误信息列表。通常使用LoadString函数实现字符串的加载工作。字符串表应用很简单,在资源中添加【String Table】即可,如图8.34所示。
- 图8.34 选择字符串表
点击鼠标右键,在弹出的菜单中选择【Properties】项。在弹出的字符串属性界面中的【ID】处修改ID值,并以【Caption】处输入ID所对应的字符串内容。本例ID为“IDS_MSG_STR”,字符串内容为“点击了结束菜单项。”,如图8.35所示。
- 图8.35 定义字符串内容
定义完成后,就可以使用LoadString函数进行加载并显示,如下给出了应用示例代码:
case ID_OPTION_END: LoadString(g_hIns, IDS_MSG_STR, szContext, 20); MessageBox(hWnd, szContext, "提示", MB_OK); break;
使用字符列表加载字符串的好处在于,应用程序可以随时更换提示信息,而不必去手动的更改代码。更改操作一次即可完成(只要更改字符列表中,对应ID的值即可)。
8.4.7 版本资源
在Win32 SDK开发中,版本资源主要用来描述版权信息、作者、研发时间等信息。在一些软件企业中,对于应用产品的开发版本要求很高,所以每次修改都需要做好版本声明。版本资源在插入资源界面中,选择【Version】项,并点击【New】按钮,即可创建,如图8.36所示。
- 图8.36 创建版本资源
创建完的版本信息,以字符列表的方式展示出来,如图8.37所示。
- 图8.37 版本列表
当创建完版本后,当鼠标放在可执行程序上时,就可以显示版本的相关信息,如图8.38所示。
- 图8.38 版本信息显示