8.4.3 加速键

特殊说明:版权归个人所有,请勿转载,谢谢合作。

加速键(即热键,快捷键)。是产生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 版本信息显示

 

 

 

转载请附上原文出处链接及本声明
李老师的博客 » 8.4.3 加速键

发表评论

提供最优质的文章集合

立即查看 了解详情