轻松实现SINDOWS 98动态菜单
在WINDOWS 98中,当你第一次使用动态菜单时,一定感到非常奇妙。其实在WINDOWS 98中,较容易动态地建立整个弹出式菜单,并可将其加到一个已存在的菜单中。
首先,用API函数CreatePopMenu()建立菜单,函数原型如下:
HMENU CreatePopupMenu(void);
该函数建立一个空菜单并返回菜单句柄。建立菜单后,使用AppendMenu()来增加菜单项目。菜单构造完成后即可将其用AppendMenu()增加到已存在的菜单中。使用CreatePopupMenu()函数建立的菜单必须被废弃。若菜单连接到一个窗口,将自动废弃。当调用DeleteMenu()函数将菜单从父菜单中清除时,也将被废弃。动态菜单也可以通过调用DestroyMenu()函数废弃。
本程序在中文版WINDOWS 98系统中,采用VISUAL C++ 6.0编译连接通过。运行后,若你多次点击文件菜但中的″增加菜单”子项目时,你一定会有惊奇的发现。附源程序DMENU.C、资源描述文件DMENU.RC和头文件DMENU.H。
// Windows98 动态菜单源程序
——dmenu.c
#include<windows.h>
#include<string.h>
#include<stdio.h>
#include″dmenu.h″
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
char *szWinName=″Win98Main″; //winclass name
int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,
PSTR pszCmdLine,int nCmdShow)
{
HWND hwnd;
MSG uMsg;
WNDCLASS wndclass;
HACCEL hAccel;
// 定义窗口类
wndclass.style=0;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hThisInst;
wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=″SampleMenu″;
wndclass.lpszClassName=szWinName;
//注册窗口类
RegisterClass(&wndclass);
//创建窗口
hwnd=CreateWindow(szWinName,″Windows 98 动态菜单″,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,HWND_DESKTOP,NULL,hThisInst,NULL);
//加载加速键表
hAccel=LoadAccelerators(hThisInst,″SampleMenu″);
// 显示窗口
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
// 创建消息循环
while(GetMessage(&uMsg,NULL,0,0)){
if(!TranslateAccelerator(hwnd,hAccel,&uMsg))
TranslateMessage(&uMsg);
DispatchMessage(&uMsg);
}
}
return uMsg.wParam;
}
//窗口函数处理各种消息,由WINDOWS系统调用
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
HMENU hmenu,hsubmenu,hpopup;
int return_value;
switch(message){
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDM_EXIT:
MessageBox(hwnd,″退出程序″,″退出″,MB_OK);
PostQuitMessage(0);
break;
case IDM_ADDITEM://增加菜单
hmenu=GetMenu(hwnd); //主菜单薄句柄
hsubmenu=GetSubMenu(hmenu,0); //弹出式菜单句柄
//创建新的弹出菜单
hpopup=CreatePopupMenu();
//添加新菜单项
AppendMenu(hpopup,MF_ENABLED,IDM_NEW,″动态菜单1″);
AppendMenu(hpopup,MF_ENABLED,IDM_NEW,″dynamic menu 2″);
//把新菜单加到文件菜单中
AppendMenu(hsubmenu,MF_SEPARATOR,0,″″);
AppendMenu(hsubmenu,MF_POPUP,(UINT)hpopup,″动态菜单(&D)″);
break;
case IDM_ABOUT:
MessageBox(hwnd,″Windows 98 动态菜单\n\n 2000.4.27\n\n
计算机软件\n″,″关于″,MB_OK);
break;
}
break;
case WM_DESTROY:
return_value=MessageBox(hwnd,″退出程序?″,″退出″,MB_OK);
if(return_value=IDOK)
{
PostQuitMessage(0);
break;
}
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
资源描述文件DMENU.RC内容如下:
#include<windows.h>
#include″dmenu.h″
SampleMenu MENU
{
POPUP ″文件(&F)″
{
MENUITEM ″退出(&x)\t ALT-x″,
IDM_EXIT
MENUITEM ″添加菜单(&A)″,
IDM_ADDITEM
}
MENUITEM″关于(&A)″,IDM_ABOUT
}
SampleMenu ACCELERATORS
{
″x″, IDM_EXIT, ALT
VK-F1,IDM-ABOUT,
VIRTKEY,ALT
}
头文件DMENU.H内容如下:
#define IDM_EXIT 101
#define IDM_ABOUT 102
#define IDM_ADDITEM 103
#define IDM_NEW 104 (安徽 王翌)