Windows窗口一般都带有一个菜单栏,包含了许多操作命令,这种菜单称为下拉式菜单,单击一个菜单会弹出一个下拉列表菜单项,单击菜单项就可以选择这个命令;
菜单栏中第一个一般是“文件”最后一个是“帮助”,我们通过一个例子来学习如何在自己的窗口中添加菜单;
1、菜单属于一种资源,因此在资源文件中定义,同时菜单是分级的,如果菜单项右侧带有一个小黒三角按钮,就表示包含下一级菜单;
2、启动VC,新建一个名为Menu的Win32 Application工程,再新建一个相同名称的头文件和源程序文件,
在头文件中输入函数的申明,在源程序中输入窗口框架代码(输好多遍了吧?)Menu.h代码如下:
//函数原型申明
LRESULT APIENTRY MainWndProc(HWND,UINT,WPARAM,LPARAM);
BOOL InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
//菜单标识符
#define IDM_NEW 201//新建
#define IDM_EXIT 202//退出
//"编辑菜单"
#define IDM_EDITCOPY 211//复制
#define IDM_EDITPASTE 212//粘贴
//帮助菜单
#define IDM_ABOUT 221//关于
在源程序Menu.cpp里的InitApplication函数中加入使用菜单代码,修改其中一句,加入资源文件中定义的菜单标识符wcexMenuApp.lpszMenuName ="MenuAppMenu";
3、启动记事本,单击保存命令,保存在Menu文件夹中,文件名为Menu.rc类型为“所有文件”,即新建一个资源文件,输入菜单的代码,菜单由一对BEGIN和END定义一个菜单列表,菜单列表的表头用POPUP定义,代码如下:
#include "Menu.h"//要用头文件中申明的标识符
// 下面定义菜单资源
MENUAPPMENU MENU DISCARDABLE //菜单标识符
BEGIN
POPUP "文件(&F)"
BEGIN
MENUITEM "新建(&N)", IDM_NEW
MENUITEM SEPARATOR//分隔条
MENUITEM "退出(&X)", IDM_EXIT
END
POPUP "编辑(&E)"
BEGIN
MENUITEM "复制(&C)", IDM_EDITCOPY
MENUITEM SEPARATOR
MENUITEM "粘贴(&P)", IDM_EDITPASTE, GRAYED
//开始是灰色的,不可用
END
POPUP "帮助(&H)"
BEGIN
MENUITEM "关于(&A)...tF1", IDM_ABOUT
END
END
保存一下文件,然后关闭记事本,在VC窗口中单击“工程”菜单选择“添加工程”-“Files...”,选择其中的资源文件Menu.rc单击“确定”,把资源文件加入工程当中;
4、单击菜单时会发送一个命令消息,下面再加入消息处理过程的代码(绿色双斜杠部分是注释),有的一行太长会自动折到下一行,代码如下:
LRESULT APIENTRY MainWndProc(
HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static CHAR szBuf[20];//标题文字字符串
HDC hdc;//设备描述表
PAINTSTRUCT ps;//绘图对象
static BOOL bNew=TRUE;//新建菜单的切换
switch(message)
{
case WM_PAINT://封面显示
{
CHAR szText[]="请选择一个菜单项。";
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,80,40,szText,lstrlen(szText));
TextOut(hdc,100,60,"美丽心情! ",lstrlen("美丽心情! "));
EndPaint(hWnd,&ps);
}
break;
case WM_COMMAND://处理菜单命令的消息
switch(LOWORD(wParam))//取低位字节判断
{
case IDM_NEW://新建命令
InvalidateRect(hWnd,NULL,TRUE);//更新整个屏幕区域
hdc=BeginPaint(hWnd,&ps);
SetTextColor(hdc, RGB(255,255,0));
SetBkMode(hdc,TRANSPARENT);//背景模式为透明背景;
if (bNew)//输出一句话
TextOut(hdc,80,60,"千山万水,在哪儿??",lstrlen("千山万水,在哪儿??"));
else
TextOut(hdc,80,60,"万水千山,在这里!!",lstrlen("万水千山,在这里!!"));
EndPaint(hWnd,&ps);
bNew=!bNew;//新建换一句话
break;
case IDM_EXIT://退出命令
DestroyWindow(hWnd);
break;
case IDM_EDITCOPY://复制命令
EnableMenuItem(GetMenu(hWnd),
IDM_EDITPASTE,MF_BYCOMMAND|MF_ENABLED);
break;
case IDM_EDITPASTE://粘贴命令
MessageBox(NULL,"“粘贴”命令的演示。" , "提示" , MB_OK|MB_ICONINFORMATION);
break;
case IDM_ABOUT://关于命令
MessageBox(hWnd,"n创建菜单的示范程序! nn编写:刘桂明 2004.8",
"关于",MB_OK|MB_ICONINFORMATION);//n是输入一个回车
break;
default:
return(DefWindowProc(hWnd,message,wParam,lParam));
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd,message,wParam,lParam));
}
return(0);
}
保存一下文件,单击编译条上的“构建”按钮,如果出现错误就仔细检查一下,然后单击“执行”按钮,看看前进中的的程序窗口;
本节学习了在程序窗口中加入菜单栏的代码设计,如果你成功地完成了练习,请继续学习下一课内容;