资源
包括:加速键,位图,光标,对话框,菜单,工具条等。在.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中定义宏。
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;
加速键(如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 将位图从内存设备环境中输出到指定的设备上。
对话框
两类:
- 模式对话框:这种类型对话框弹出后,则只能关闭该对话框后再切换到其它窗口。模式对话框的对话框消息循环将处理消息,并不返回给WinProc()
- 非模式对话框:从WinProc()的消息循环中接受输入。
模式对话框编程方法:
(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:处理