赞
踩
包括:加速键,位图,光标,对话框,菜单,工具条等。在.rc文件中。
1、定义菜单
myMenuID MENU [MOVEABLE | PRELOAD ]
myMenuID为自定义1~65535的整数,用来标识特定的菜单。若自定义菜单名,则要注册:在头文件resource.h中定义宏。
定义菜单项:
①定义弹出式菜单
POPUP "菜单项名" [可选]
②MENUITEM项(用BEGIN END包含在弹出式菜单项中)
MENUITEM "新建 (&N)" ,IDM_NEW
同样,IDM_NEW要在Menu.h中定义宏。
- IDC_CREATEMENU MENU
- BEGIN
- POPUP "文件(&F)"
- BEGIN
- MENUITEM "创建统计计算菜单项(&P)\t Ctrl+P", IDM_ADDMENU
- MENUITEM "删除统计计算菜单项(&D)\t Ctrl+D", IDM_DELETEMENU
- MENUITEM SEPARATOR
- MENUITEM "退出(&X)", IDM_EXIT
- END
- POPUP "帮助(&H)"
- BEGIN
- MENUITEM "关于(&A) ...", IDM_ABOUT
- END
- 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
- case WM_COMMAND:
- {
- int wmId = LOWORD(wParam);
- // 分析菜单选择:
- switch (wmId)
- {
- case IDM_ADDMENU:
- hmenu = GetMenu(hWnd);
- haddmenu = CreateMenu();
- AppendMenu(haddmenu, MF_ENABLED, IDM_qiuhe, L"求和");
- AppendMenu(haddmenu, MF_ENABLED, IDM_fangcha, L"方差");
- AppendMenu(haddmenu, MF_ENABLED, IDM_pingjunzhi, L"平均值");
- AppendMenu(haddmenu, MF_ENABLED, IDM_junfanggen, L"均方根");
-
- InsertMenu(hmenu,2, MF_POPUP | MF_BYPOSITION, (UINT)haddmenu, L"统计计算(&c)");
-
- EnableMenuItem(hmenu, IDM_ADDMENU, MF_GRAYED);
- EnableMenuItem(hmenu, IDM_DELETEMENU, MF_ENABLED);
- DrawMenuBar(hWnd);
- break;
- case IDM_DELETEMENU:
- hmenu = GetMenu(hWnd);
- DeleteMenu(hmenu, 2, MF_BYPOSITION);
-
- EnableMenuItem(hmenu, IDM_ADDMENU, MF_ENABLED);
- EnableMenuItem(hmenu, IDM_DELETEMENU, MF_GRAYED);
- DrawMenuBar(hWnd);
- break;
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- }
- break;
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
加速键(如ctrl+c等,与快捷键不同)
创建加速键:
- IDC_CREATEMENU ACCELERATORS
- BEGIN
- "?", IDM_ABOUT, ASCII, ALT
- "/", IDM_ABOUT, ASCII, ALT
- "^P", IDM_ADDMENU, ASCII, NOINVERT
- "^D", IDM_DELETEMENU, ASCII, NOINVERT
- "^X", IDM_EXIT, ASCII, NOINVERT
- 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)定义对话框资源:(在资源视图中插入对话框,拖出所需控件即可)
格式为:
- 对话框名(整数) DIALOGEX [载入特性选项] X,Y,Width,Height
- [设置选项]
- Begin
- 控件定义
- End
实例:
- IDD_MFCDIALOGEE2_3_DIALOG DIALOGEX 0, 0, 320, 200
- STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
- EXSTYLE WS_EX_APPWINDOW
- FONT 9, "MS Shell Dlg", 0, 0, 0x1
- BEGIN
- DEFPUSHBUTTON "确定",IDOK,209,179,50,14
- PUSHBUTTON "取消",IDCANCEL,263,179,50,14
- PUSHBUTTON "红色",IDC_BUTTON1,33,43,50,14
- PUSHBUTTON "绿色",IDC_BUTTON2,98,43,50,14
- PUSHBUTTON "蓝色",IDC_BUTTON3,163,44,50,14
- PUSHBUTTON "确认",IDC_BUTTON4,231,45,50,14
- EDITTEXT IDC_EDIT1,90,110,146,14,ES_AUTOHSCROLL
- END
(2)调用DialogBox()函数显示对话框
(3)构造对话框消息处理函数DlgProc
- BOOL CALLBACK DlgProc(HWND hDlg,UNIT message,WPARAM wParam,LPARAM lParam)
- {
- switch(message)
- {
- case:WM_INITDIALOG:
- return 1;
- case:WM_COMMAND:
- switch(LOWORD(wParam))
- {
- ...
- }
- }
- }
(4)关闭对话框:EndDialog()
非模式对话框编程方法:
(1)定义对话框资源:必须有WS_VISIBLE
格式为:
- 对话框名(整数) DIALOGEX [载入特性选项] X,Y,Width,Height
- STYLE WS_POPUP|WS_CAPTION|WS_VISIBLE
- Begin
- 控件定义
- End
(2)创建对话框函数:CreateDialog()
(3)WinMain中消息循环处理:
- while(GetMessage(&Msg,NULL,0,0)
- {
- if(!IsDialogMessage(hdlg,&Msg))
- {
- TranslateMessage(&Msg);
- DispatchMessage(&Msg);
- }
- }
(4)关闭对话框:DestroyWindow();
对话框消息类型为WM_COMMAND
所以在WinProc函数中case WM_COMMAND:处理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。