当前位置:   article > 正文

可视化:资源在windows编程中的应用_windows可视化资源编辑器

windows可视化资源编辑器

资源

包括:加速键,位图,光标,对话框,菜单,工具条等。在.rc文件中。

  • windows可执行文件中,资源是独立于代码的,可以单独用resource compiler编译,并嵌入到可执行文件。
  • vs提供可视化资源编辑器帮助开发,但是自动生成的代码结构复杂,比较不好懂,作为程序员手动编写资源脚本是必须滴。

菜单与加速键

  • 菜单的创建

1、定义菜单
myMenuID MENU [MOVEABLE | PRELOAD ]
myMenuID为自定义1~65535的整数,用来标识特定的菜单。若自定义菜单名,则要注册:在头文件resource.h中定义宏。
定义菜单项:
①定义弹出式菜单
POPUP "菜单项名"  [可选]
②MENUITEM项(用BEGIN END包含在弹出式菜单项中)
MENUITEM "新建 (&N)" ,IDM_NEW
同样,IDM_NEW要在Menu.h中定义宏。

  1. IDC_CREATEMENU MENU
  2. BEGIN
  3. POPUP "文件(&F)"
  4. BEGIN
  5. MENUITEM "创建统计计算菜单项(&P)\t Ctrl+P", IDM_ADDMENU
  6. MENUITEM "删除统计计算菜单项(&D)\t Ctrl+D", IDM_DELETEMENU
  7. MENUITEM SEPARATOR
  8. MENUITEM "退出(&X)", IDM_EXIT
  9. END
  10. POPUP "帮助(&H)"
  11. BEGIN
  12. MENUITEM "关于(&A) ...", IDM_ABOUT
  13. END
  14. END


2、加载菜单资源
三种方法:1':在窗口类的定义中加载:
WNDCLASSEX wndclass;
wndclass.lpszMenuName=menuName;
2'在调用函数CreateWindow()创建窗口前创建:
HWND hwnd;
HMENU hmenu;

hmenu=LoadMenu(hInstance,"my_menu");
hwnd=CreateWindow(,,,,,,,,hmenu,,,);该参数为NULL时表示用默认菜单。
3'动态加载菜单:
通过SetMenu()函数,在程序运行过程中可修改菜单:
HWND hwnd;
HMENU hmenu;

hmenu1=LoadMenu(hInstance,"my_menu");
hwnd=CreateWindow(,,,,,,,,hmenu1,,,);

hmenu2=LoadMenu(hInstance,"my_menu2");
SetMenu(hwnd,hmenu2);

菜单实例:

 WndProc函数中的switch

  1. case WM_COMMAND:
  2. {
  3. int wmId = LOWORD(wParam);
  4. // 分析菜单选择:
  5. switch (wmId)
  6. {
  7. case IDM_ADDMENU:
  8. hmenu = GetMenu(hWnd);
  9. haddmenu = CreateMenu();
  10. AppendMenu(haddmenu, MF_ENABLED, IDM_qiuhe, L"求和");
  11. AppendMenu(haddmenu, MF_ENABLED, IDM_fangcha, L"方差");
  12. AppendMenu(haddmenu, MF_ENABLED, IDM_pingjunzhi, L"平均值");
  13. AppendMenu(haddmenu, MF_ENABLED, IDM_junfanggen, L"均方根");
  14. InsertMenu(hmenu,2, MF_POPUP | MF_BYPOSITION, (UINT)haddmenu, L"统计计算(&c)");
  15. EnableMenuItem(hmenu, IDM_ADDMENU, MF_GRAYED);
  16. EnableMenuItem(hmenu, IDM_DELETEMENU, MF_ENABLED);
  17. DrawMenuBar(hWnd);
  18. break;
  19. case IDM_DELETEMENU:
  20. hmenu = GetMenu(hWnd);
  21. DeleteMenu(hmenu, 2, MF_BYPOSITION);
  22. EnableMenuItem(hmenu, IDM_ADDMENU, MF_ENABLED);
  23. EnableMenuItem(hmenu, IDM_DELETEMENU, MF_GRAYED);
  24. DrawMenuBar(hWnd);
  25. break;
  26. case IDM_EXIT:
  27. DestroyWindow(hWnd);
  28. break;
  29. default:
  30. return DefWindowProc(hWnd, message, wParam, lParam);
  31. }
  32. }
  33. break;


加速键(如ctrl+c等,与快捷键不同)

创建加速键:

  1. IDC_CREATEMENU ACCELERATORS
  2. BEGIN
  3. "?", IDM_ABOUT, ASCII, ALT
  4. "/", IDM_ABOUT, ASCII, ALT
  5. "^P", IDM_ADDMENU, ASCII, NOINVERT
  6. "^D", IDM_DELETEMENU, ASCII, NOINVERT
  7. "^X", IDM_EXIT, ASCII, NOINVERT
  8. END

加载加速键资源

HACCEL hAccel; ... hAccel=LoadAcceleratord(hInstance,IpAcceIname);

翻译加速键:

在消息循环中

TranslateAccelerator(hWid,hAccel,&Mag);

在MFC中创建菜单资源步骤:

①创建基于单文档MFC文件

②资源视图|menu中找到IDR_MAINFRAME,从中添加新菜单

③对于非弹出式菜单,为菜单控件添加command消息响应。

command消息是在用户单击菜单项时产生的。

位图

位图的操作包括定义、加载、选入内存设备环境和输出。

(1 ) 定义位图句柄

定义位图句柄的方式如下:

HBI TMAP hBi tmap;

(2 ) 加载位图

调用函数 hBitmap = LoadBitMap( . . .) 加载位图,获得位图的句柄。

(3 ) 选入设备环境

调用函数 CreateCompatibleDC 向系统申请内存设备句柄, 获取了内存设备句柄后,

调用函数 SelectObject 将位图选入内存设备环境。此时即可对其进行编辑。

(4 ) 输出位图

应用程序调用函数 BitBlt 将位图从内存设备环境中输出到指定的设备上。

对话框

两类:

  1. 模式对话框:这种类型对话框弹出后,则只能关闭该对话框后再切换到其它窗口。模式对话框的对话框消息循环将处理消息,并不返回给WinProc()
  2. 非模式对话框:从WinProc()的消息循环中接受输入。

模式对话框编程方法:

(1)定义对话框资源:(在资源视图中插入对话框,拖出所需控件即可)

格式为:

  1. 对话框名(整数) DIALOGEX [载入特性选项] X,Y,Width,Height
  2. [设置选项]
  3. Begin
  4. 控件定义
  5. End

实例:

  1. IDD_MFCDIALOGEE2_3_DIALOG DIALOGEX 0, 0, 320, 200
  2. STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
  3. EXSTYLE WS_EX_APPWINDOW
  4. FONT 9, "MS Shell Dlg", 0, 0, 0x1
  5. BEGIN
  6. DEFPUSHBUTTON "确定",IDOK,209,179,50,14
  7. PUSHBUTTON "取消",IDCANCEL,263,179,50,14
  8. PUSHBUTTON "红色",IDC_BUTTON1,33,43,50,14
  9. PUSHBUTTON "绿色",IDC_BUTTON2,98,43,50,14
  10. PUSHBUTTON "蓝色",IDC_BUTTON3,163,44,50,14
  11. PUSHBUTTON "确认",IDC_BUTTON4,231,45,50,14
  12. EDITTEXT IDC_EDIT1,90,110,146,14,ES_AUTOHSCROLL
  13. END

(2)调用DialogBox()函数显示对话框

(3)构造对话框消息处理函数DlgProc

  1. BOOL CALLBACK DlgProc(HWND hDlg,UNIT message,WPARAM wParam,LPARAM lParam)
  2. {
  3. switch(message)
  4. {
  5. case:WM_INITDIALOG:
  6. return 1;
  7. case:WM_COMMAND:
  8. switch(LOWORD(wParam))
  9. {
  10. ...
  11. }
  12. }
  13. }

(4)关闭对话框:EndDialog()

非模式对话框编程方法:

(1)定义对话框资源:必须有WS_VISIBLE

格式为:

  1. 对话框名(整数) DIALOGEX [载入特性选项] X,Y,Width,Height
  2. STYLE WS_POPUP|WS_CAPTION|WS_VISIBLE
  3. Begin
  4. 控件定义
  5. End

(2)创建对话框函数:CreateDialog()

(3)WinMain中消息循环处理:

  1. while(GetMessage(&Msg,NULL,0,0)
  2. {
  3. if(!IsDialogMessage(hdlg,&Msg))
  4. {
  5. TranslateMessage(&Msg);
  6. DispatchMessage(&Msg);
  7. }
  8. }

(4)关闭对话框:DestroyWindow();

对话框消息类型为WM_COMMAND

所以在WinProc函数中case WM_COMMAND:处理

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/857318
推荐阅读
相关标签
  

闽ICP备14008679号