读书人

菜单跟其他资源(2)之创建自己的菜单

发布时间: 2012-08-21 13:00:22 作者: rapoo

菜单和其他资源(2)之创建自己的菜单

菜单可能是Windows程序提供的一致的用户界面中最重要的部分,而想程序中添加菜单是Windows编程中相对容易的布冯。当用户选择菜单单选时,Windows向你的程序发送了一个含有才菜单单选ID的WM_COMMAND消息

LOWORD(wParam)控件IDHIWORD(wParam)通知码lParam子窗口句柄

创建菜单有三种方法;

用WNDCLASS定义

wndclass.lpszMenuName=szAppName;//I don't konw what the fucking is?在VC++6.0和VS2008竟然不显示


2使用LoadMenu获取hMenu,然后在CreateWindow倒数第三个参数写上hMenu

hMenu=LoadMenu(hInstance,TEXT("MyMenu"));hwnd=CreateWindow(//倒数第三个参数hMenu)


3第三种方法和第二种方法一样:

hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(MENUID));hwnd=CreateWindow(//倒数第三个参数hMenu);


具体步骤跟创建自己的ICON差不多;
1新建Windows32项目,编写好自己的.cpp文件
2在项目名称那里右键添加资源(.rc),然后resource.h头文件也会自己创建
3在Resource文件夹右键,添加资源(Menu)

4然后在图形界面里面编辑选项和ID,重命名就行了
5运行


下面看一段简单的程序:

#include<windows.h>#include"resource.h"LRESULT CALLBACK WindowProc(  HWND hwnd,      // handle to window  UINT uMsg,      // message identifier  WPARAM wParam,  // first message parameter  LPARAM lParam   // second message parameter);int WINAPI WinMain(  HINSTANCE hInstance,      // handle to current instance  HINSTANCE hPrevInstance,  // handle to previous instance  LPSTR lpCmdLine,          // command line  int nCmdShow              // show state){static TCHAR szAppName[]=TEXT("MENUDEMO");HWND hwnd;WNDCLASS wndclass;MSG msg;HMENU hMenu;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);wndclass.hInstance=hInstance;wndclass.lpfnWndProc=WindowProc;wndclass.lpszClassName=szAppName;wndclass.lpszMenuName=NULL;wndclass.style=CS_HREDRAW|CS_VREDRAW;if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("the program require the window nt"),TEXT("TIPS "),MB_ICONERROR);return 0;}hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(MENUDEMO));hwnd=CreateWindow(  szAppName,  // registered class name  TEXT("this is title"), // window name  WS_OVERLAPPEDWINDOW,        // window style  CW_USEDEFAULT,                // horizontal position of window  CW_USEDEFAULT,                // vertical position of window  CW_USEDEFAULT,           // window width  CW_USEDEFAULT,          // window height  NULL,      // handle to parent or owner window  hMenu,          // menu handle or child identifier  hInstance,  // handle to application instance  NULL       // window-creation data);//SetMenu(hwnd,hMenu);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}LRESULT CALLBACK WindowProc(  HWND hwnd,      // handle to window  UINT uMsg,      // message identifier  WPARAM wParam,  // first message parameter  LPARAM lParam   // second message parameter){HDC hdc;PAINTSTRUCT ps;RECT rect;switch(uMsg){case WM_CREATE:return 0;case WM_PAINT:GetClientRect(hwnd,&rect);hdc=BeginPaint(hwnd,&ps);EndPaint(hwnd,&ps);return 0;case WM_COMMAND:switch(LOWORD(wParam)){case ID_FILE_NEW:MessageBox(NULL,TEXT("你选择了new"),TEXT("提示"),MB_OK);break;case ID_FILE_EXIT:MessageBeep(MB_ICONEXCLAMATION);SendMessage(hwnd,WM_CLOSE,0,0);break;case ID_FILE_OPEN:MessageBox(NULL,TEXT("你选择了Open"),TEXT("提示"),MB_OK);break;case ID_FILE_SAVE:MessageBox(NULL,TEXT("你选择了Save"),TEXT("提示"),MB_OK);break;case ID_FILE_SAVEAS:MessageBox(NULL,TEXT("你选择了Save_As"),TEXT("提示"),MB_OK);break;}return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,uMsg,wParam,lParam);}


效果如下

菜单跟其他资源(2)之创建自己的菜单

还有一段:

/*-----------------------------------------   MENUDEMO.C -- Menu Demonstration                 (c) Charles Petzold, 1998  -----------------------------------------*/ #include <windows.h>#include "resource.h"#define ID_TIMER 1LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;TCHAR szAppName[] = TEXT ("MenuDemo") ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,                    PSTR szCmdLine, int iCmdShow){     HWND     hwnd ;     MSG      msg ;     WNDCLASS wndclass ;          wndclass.style         = CS_HREDRAW | CS_VREDRAW ;     wndclass.lpfnWndProc   = WndProc ;     wndclass.cbClsExtra    = 0 ;     wndclass.cbWndExtra    = 0 ;     wndclass.hInstance     = hInstance ;     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;     wndclass.lpszMenuName  = szAppName ;     wndclass.lpszClassName = szAppName ;          if (!RegisterClass (&wndclass))     {          MessageBox (NULL, TEXT ("This program requires Windows NT!"),                      szAppName, MB_ICONERROR) ;          return 0 ;     }          hwnd = CreateWindow (szAppName, TEXT ("Menu Demonstration"),                          WS_OVERLAPPEDWINDOW,                          CW_USEDEFAULT, CW_USEDEFAULT,                          CW_USEDEFAULT, CW_USEDEFAULT,                          NULL, NULL, hInstance, NULL) ;          ShowWindow (hwnd, iCmdShow) ;     UpdateWindow (hwnd) ;          while (GetMessage (&msg, NULL, 0, 0))     {          TranslateMessage (&msg) ;          DispatchMessage (&msg) ;     }     return msg.wParam ;}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){     static int idColor [5] = { WHITE_BRUSH,  LTGRAY_BRUSH, GRAY_BRUSH,                                DKGRAY_BRUSH, BLACK_BRUSH } ;     static int iSelection = IDM_BKGND_WHITE ;     HMENU      hMenu ;          switch (message)     {     case WM_COMMAND:          hMenu = GetMenu (hwnd) ;                    switch (LOWORD (wParam))          {          case IDM_FILE_NEW:          case IDM_FILE_OPEN:          case IDM_FILE_SAVE:          case IDM_FILE_SAVE_AS:               MessageBeep (0) ;               return 0 ;                         case IDM_APP_EXIT:               SendMessage (hwnd, WM_CLOSE, 0, 0) ;               return 0 ;                         case IDM_EDIT_UNDO:          case IDM_EDIT_CUT:          case IDM_EDIT_COPY:          case IDM_EDIT_PASTE:          case IDM_EDIT_CLEAR:               MessageBeep (0) ;               return 0 ;                         case IDM_BKGND_WHITE:         // Note: Logic below          case IDM_BKGND_LTGRAY:        //   assumes that IDM_WHITE          case IDM_BKGND_GRAY:          //   through IDM_BLACK are          case IDM_BKGND_DKGRAY:        //   consecutive numbers in          case IDM_BKGND_BLACK:         //   the order shown here.                              CheckMenuItem (hMenu, iSelection, MF_UNCHECKED) ;               iSelection = LOWORD (wParam) ;               CheckMenuItem (hMenu, iSelection, MF_CHECKED) ;                              SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)                     GetStockObject                              (idColor [LOWORD (wParam) - IDM_BKGND_WHITE])) ;                              InvalidateRect (hwnd, NULL, TRUE) ;               return 0 ;                         case IDM_TIMER_START:               if (SetTimer (hwnd, ID_TIMER, 1000, NULL))               {                    EnableMenuItem (hMenu, IDM_TIMER_START, MF_GRAYED) ;                    EnableMenuItem (hMenu, IDM_TIMER_STOP,  MF_ENABLED) ;               }               return 0 ;                         case IDM_TIMER_STOP:               KillTimer (hwnd, ID_TIMER) ;               EnableMenuItem (hMenu, IDM_TIMER_START, MF_ENABLED) ;               EnableMenuItem (hMenu, IDM_TIMER_STOP,  MF_GRAYED) ;               return 0 ;                         case IDM_APP_HELP:               MessageBox (hwnd, TEXT ("Help not yet implemented!"),                           szAppName, MB_ICONEXCLAMATION | MB_OK) ;               return 0 ;                         case IDM_APP_ABOUT:               MessageBox (hwnd, TEXT ("Menu Demonstration Program\n")                                 TEXT ("(c) Charles Petzold, 1998"),                           szAppName, MB_ICONINFORMATION | MB_OK) ;               return 0 ;          }          break ;               case WM_TIMER:          MessageBeep (0) ;          return 0 ;                    case WM_DESTROY:          PostQuitMessage (0) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}


效果:

菜单跟其他资源(2)之创建自己的菜单

浮动菜单,请关注我的下一篇博客

读书人网 >编程

热点推荐