轻松实现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 (安徽 王翌)

|