VC动态添加资源项

图标的代码相当简单,调用LoadImage()两次,装入了16*16和32*32两种大小的图标.我们这里不能用LoadIcon()因为它只能装入资源,而不能装入文件.我们把实例句柄参数写成了NULL因为我们不是从我们的模块装入资源,而且我们不用资源的标识而使用了我们要装入的图标文件名.最后我们传入了LR_LOADFROMFILE这个标志来指示我们需要这个函数将我们传入的字符串当作文件名而不是资源名字.
  如果所有的调用都成功了我们就我在WM_SETICON的消息处理中把图标的句柄赋给我们的窗口,如果失败了则弹出一个对话框告诉我们出错了.
注意:如果我们要装入的图标文件不在程序现在的当前目錄则LoadImage()调用失败.如果你用VC++从IDE来运行程序的话,当前目錄就是你工程文件所在的目錄.如果你从Debug或Release目錄下用文件管理器或命令行运行的话,你就需要把你的图标文件拷进去样以使你的程序找到它.如果怎样还是出错,就在你的调用中指明图标的全路径,"c:\\path\\to\\icon.ico".
  好的,现在我们有菜单了,我们让它做点事情.这很简单,我们就需要响应WM_COMMAND消息就行.我们也需要我们得到了哪个消息并做出相应的动作.现在我们的

WndProc()应该看起来像这样.

[cpp] view plaincopyprint?
  1. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  2. {
  3. switch(msg)
  4. {
  5. case WM_CREATE:
  6. {
  7. HMENU hMenu, hSubMenu;
  8. HICON hIcon, hIconSm;
  9. hMenu = CreateMenu();
  10. hSubMenu = CreatePopupMenu();
  11. AppendMenu(hSubMenu, MF_STRING, ID_FILE_EXIT, "E&xit");
  12. AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&File");
  13. hSubMenu = CreatePopupMenu();
  14. AppendMenu(hSubMenu, MF_STRING, ID_STUFF_GO, "&Go");
  15. AppendMenu(hMenu, MF_STRING | MF_POPUP, (UINT)hSubMenu, "&Stuff");
  16. SetMenu(hwnd, hMenu);
  17. hIcon = (HICON)LoadImage(NULL, "icon1.ico", IMAGE_ICON, 32, 32,
  18. LR_LOADFROMFILE);
  19. if(hIcon)
  20. SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
  21. else
  22. MessageBox(hwnd, "Could not load large icon!""Error", MB_OK |
  23. MB_ICONERROR);
  24. hIconSm = (HICON)LoadImage(NULL, "icon1.ico", IMAGE_ICON, 16, 16,
  25. LR_LOADFROMFILE);
  26. if(hIconSm)
  27. SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
  28. else
  29. MessageBox(hwnd, "Could not load small icon!""Error", MB_OK |
  30. MB_ICONERROR);
  31. }
  32. break;
  33. case WM_COMMAND:
  34. switch(LOWORD(wParam))
  35. {
  36. case ID_FILE_EXIT:
  37. PostMessage(hwnd,WM_CLOSE,NULL,NULL);
  38. break;
  39. case ID_STUFF_GO:
  40. MessageBox(hwnd,"you click the GO","Menu MessageBox",MB_OK | MB_ICONEXCLAMATION);
  41. break;
  42. }
  43. break;
  44. case WM_LBUTTONDOWN:
  45. {
  46. char szFileName[MAX_PATH];
  47. HINSTANCE hInstance = GetModuleHandle(NULL);
  48. GetModuleFileName(hInstance, szFileName, MAX_PATH);
  49. MessageBox(hwnd, szFileName, "This program is:", MB_OK |
  50. MB_ICONINFORMATION);
  51. }
  52. break;
  53. case WM_CLOSE:
  54. DestroyWindow(hwnd);
  55. break;
  56. case WM_DESTROY:
  57. PostQuitMessage(0);
  58. break;
  59. default:
  60. return DefWindowProc(hwnd, msg, wParam, lParam);
  61. }
  62. return 0;
  63. }

  你可以看到我们把WM_COMMAND消息响应了,并且它还有自己的一个switch()在其中.这个switch()由wParm的低字来決定,因为可能WM_COMMAND消息包含了发送消息的菜单或控件的标识.
  我们显然想要Exit菜单来关闭程序.所以在WM_COMMAND,ID_FILE_EXIT消息的处理程序中你可以使用下面的代码来做到这一点.PostMessage(hwnd,WM_CLOSE ,0, 0);
  你的WM_COMMAND处理代码现在看起来应该像样: 

[cpp] view plaincopyprint?
  1. case WM_COMMAND:
  2. switch(LOWORD(wParam))
  3. {
  4. case ID_FILE_EXIT:
  5. PostMessage(hwnd, WM_CLOSE, 0, 0);
  6. break;
  7. case ID_STUFF_GO:
  8. break;
  9. }
  10. break;

函数LoadImage

函数功能:装载图标,光标,或位图。

函数原型:HANDLE LoadImage(NINSTANCE hinst,LPCTSTR lpszName,UINT uType,int

cxDesired,int CyDesired,UINT fuLoad);

(HBITMAP) LoadImage ( AfxGetInstanceHandle() , TEXT("c://*.bmp"), IMAGE_BITMAP,

0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE));

参数:

hinst:包含被装载图像模块的实例句柄。若要装载OEM图像,则设此参数值为0。

lpszName:如果hinst非NULL,而且参数fuLoad不包括LR_LOADFROMFILE时,那么lpszName是一个保留在hinst模块中的图像资源ID。

如果参数hinst为NULL,并且LR_LOADFROMFILE被指定,那么这个参数是被装载的OEM的图像标识。

如果参数fuLoad包含LR_LOADFROMFILE值,那么参数lpszName是图像文件路径。

uType:指定被装载图像类型 IMAGE_BITMAP IMAGE_CURSOR IMAGE_ICON 。

cx ,cy:图标或光标的宽度高度,如果参数为0,则fuLoad不设LR_DEFAULTSIZE,那么函数使用目前的资源高度。对静态位图来说,参数cx ,cy 为零。

fuLoad:LR_DEFAULTCOLOR:缺省标志;

LR_CREATEDIBSECTION:装载位图时,返回一个DIB部分位图,而不是DDB位图是装载位图,而不是映射位图到显示设备时用它;

LRDIFAULTSIZE:若装载光标或图标,cxDesired或cyDesired未被设为零,使用它;

LR_LOADFROMFILE:图像来自文件。若未标定,图像来自资源ID;

LR_MONOCHROME:装载黑白图;

LR_SHARED:共享内存,多次调用同一资源时不会再重新装载图像入内存。

注意:当使用完资源后,最好释放加速器表、位图、光标、图标以及菜单所占的内存资源。

加速器表:DesteoyAcceleratorTable;位图:DeleteObject;光标:DestroyCursor;

图标:Destroylcon;菜单:DestroyMenu


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC2017中,您可以通过以下步骤来设置备注的快捷键: 1. 新建一个加速键资源(Accelerator),并保持加速键默认的资源ID号。在这个资源中,添加您想要设置快捷键的菜单的ID,并设置您喜欢的快捷键。确保您要添加快捷键的菜单已经存在。 2. 响应您需要添加快捷键的菜单的COMMAND消息。在这个消息中,添加您需要测试的代码,以实现您期望的结果。 3. 在VC2017的“Commands”tab页和“Keyboard”tab页中,选择Category选为Macros,然后选中CommentOut。接下来切换到“Press new shortcut key”选,您可以自定义一个快捷键,例如ctrl+T。通过这样的设置,您就可以给VC2017添加备注的快捷键了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [在VC或是VS中添加快捷键](https://blog.csdn.net/huang578141611/article/details/38751105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [VC/VS 注释快捷键](https://blog.csdn.net/xufeichen/article/details/5772858)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值