菜单

  1. /*---------------------------------------------------------------------- 
  2.    POPMENU.C -- Popup Menu Demonstration 
  3.                                     (c) Charles Petzold, 1998 
  4. -------------------------------------------------------------------------*/  
  5.   
  6. #include <windows.h>  
  7. #include "resource.h"  
  8.   
  9. LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM) ;  
  10. HINSTANCE hInst ;  
  11. TCHAR           szAppName[] = TEXT ("PopMenu") ;  
  12.   
  13.   
  14. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  15.                                             PSTR szCmdLine, int iCmdShow)  
  16. {  
  17.         HWND                hwnd ;  
  18.         MSG                 msg ;  
  19.         WNDCLASS        wndclass ;  
  20.   
  21.         wndclass.style                  = CS_HREDRAW | CS_VREDRAW ;  
  22.         wndclass.lpfnWndProc            = WndProc ;  
  23.         wndclass.cbClsExtra             = 0 ;  
  24.         wndclass.cbWndExtra             = 0 ;  
  25.         wndclass.hInstance              = hInstance ;  
  26.         wndclass.hIcon                  = LoadIcon (NULL, szAppName) ;  
  27.         wndclass.hCursor                = LoadCursor (NULL, IDC_ARROW) ;  
  28.         wndclass.hbrBackground      = (HBRUSH) GetStockObject (WHITE_BRUSH) ;  
  29.         wndclass.lpszMenuName       = NULL ;  
  30.         wndclass.lpszClassName      = szAppName ;  
  31.   
  32.         if (!RegisterClass (&wndclass))  
  33.         {  
  34.             MessageBox (    NULL, TEXT ("This program requires Windows NT!"),  
  35.                                                 szAppName, MB_ICONERROR) ;  
  36.                 return 0 ;  
  37.      }  
  38.   
  39.         hInst = hInstance ;  
  40.         hwnd = CreateWindow (   szAppName, TEXT ("Popup Menu Demonstration"),  
  41.                      WS_OVERLAPPEDWINDOW,  
  42.                      CW_USEDEFAULT, CW_USEDEFAULT,  
  43.                      CW_USEDEFAULT, CW_USEDEFAULT,  
  44.                      NULL, NULL, hInstance, NULL) ;  
  45.         ShowWindow (hwnd, iCmdShow) ;  
  46.         UpdateWindow (hwnd) ;  
  47.   
  48.         while (GetMessage (&msg, NULL, 0, 0))  
  49.         {  
  50.                     TranslateMessage (&msg) ;  
  51.                     DispatchMessage (&msg) ;  
  52.         }  
  53.         return msg.wParam ;  
  54. }  
  55.   
  56. LRESULT CALLBACK WndProc (  HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)  
  57. {  
  58.         static HMENU    hMenu ;  
  59.         static int      idColor [5] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH,  
  60.                                         DKGRAY_BRUSH, BLACK_BRUSH } ;  
  61.         static int      iSelection  = IDM_BKGND_WHITE ;  
  62.         POINT                       point ;  
  63.   
  64.         switch (message)  
  65.      {  
  66.         case    WM_CREATE:  
  67.                 hMenu = LoadMenu (hInst, szAppName) ;  
  68.                 hMenu = GetSubMenu (hMenu, 0) ;  
  69.                 return 0 ;  
  70.   
  71.         case    WM_RBUTTONUP:  
  72.                 point.x = LOWORD (lParam) ;  
  73.                 point.y = HIWORD (lParam) ;  
  74.                 ClientToScreen (hwnd, &point) ;  
  75.   
  76.                 TrackPopupMenu (hMenu, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL) ;  
  77.                 return 0 ;  
  78.   
  79.         case    WM_COMMAND:  
  80.                 switch (LOWORD (wParam))  
  81.                 {  
  82.                 case    IDM_FILE_NEW:  
  83.                 case    IDM_FILE_OPEN:  
  84.                 case    IDM_FILE_SAVE:  
  85.                 case    IDM_FILE_SAVE_AS:  
  86.                 case    IDM_EDIT_UNDO:  
  87.                 case    IDM_EDIT_CUT:  
  88.                 case    IDM_EDIT_COPY:  
  89.                 case    IDM_EDIT_PASTE:  
  90.                 case    IDM_EDIT_CLEAR:  
  91.                             MessageBeep (0) ;  
  92.                             return 0 ;  
  93.   
  94.                 case    IDM_BKGND_WHITE:            // Note: Logic below  
  95.                 case    IDM_BKGND_LTGRAY:           //   assumes that IDM_WHITE  
  96.                 case    IDM_BKGND_GRAY:             //   through IDM_BLACK are  
  97.                 case    IDM_BKGND_DKGRAY:           //   consecutive numbers in  
  98.                 case    IDM_BKGND_BLACK:            //   the order shown here.  
  99.   
  100.                             CheckMenuItem (hMenu, iSelection, MF_UNCHECKED) ;  
  101.                             iSelection = LOWORD (wParam) ;  
  102.                             CheckMenuItem (hMenu, iSelection, MF_CHECKED) ;  
  103.   
  104.                             SetClassLong (hwnd, GCL_HBRBACKGROUND, (LONG)  
  105.                                                 GetStockObject  
  106.                             (idColor [LOWORD (wParam) - IDM_BKGND_WHITE])) ;  
  107.   
  108.                             InvalidateRect (hwnd, NULL, TRUE) ;  
  109.                             return 0 ;  
  110.   
  111.                 case    IDM_APP_ABOUT:  
  112.                             MessageBox (hwnd, TEXT ("Popup Menu Demonstration Program\n")  
  113.                            TEXT ("(c) Charles Petzold, 1998"),  
  114.                                 szAppName, MB_ICONINFORMATION | MB_OK) ;  
  115.                         return 0 ;  
  116.   
  117.                 case    IDM_APP_EXIT:  
  118.                             SendMessage (hwnd, WM_CLOSE, 0, 0) ;  
  119.                             return 0 ;  
  120.   
  121.                 case    IDM_APP_HELP:  
  122.                             MessageBox (hwnd, TEXT ("Help not yet implemented!"),  
  123.                             szAppName, MB_ICONEXCLAMATION | MB_OK) ;  
  124.                             return 0 ;  
  125.                 }  
  126.                 break ;  
  127.   
  128.         case    WM_DESTROY:  
  129.                 PostQuitMessage (0) ;  
  130.                 return 0 ;  
  131.     }  
  132.         return DefWindowProc (hwnd, message, wParam, lParam) ;  
  133. }  


       卷动列控件不向父窗口发送WM_COMMAND消息,而是像窗口卷动列那样发送WM_VSCROLL和WM_HSCROLL消息。在处理卷动消息时,您可以通过lParam参数来区分窗口卷动列与卷动列控件。对子窗口卷动列其值为0,对于卷动列控件其值为卷动列窗口代号。对窗口卷动列和卷动列控件来说,wParam参数的高字组和低字组的含义相同。

      选中了 Pop-up 复选框,该项目就会调用一个突现式菜单,并且没有ID与此项目相联系。如果没有选中 Pop-up 复选框,该项目被选中时就会产生带有特定ID的WM_COMMAND消息。这两类菜单项分别出现在资源描述档的POPUP和MENUITEM叙述中。


在程序中引用菜单

1.大多数Windows应用程序在资源描述文件中只有一个菜单。您可以给菜单起一个与程序名称相同的文字的名称。程序编写者经常将程序名用于菜单名称,以便相同的字符串可以用于窗口类别、程序的图标名称和菜单名称。然后,程序在窗口的定义中为菜单引用该名称:

wndclass.lpszMenuName = szAppName ;

2.Windows应用程序可以使用LoadMenu函数将菜单资源调入内存中,如同LoadIcon和LoadCursor函数一样。LoadMenu传回一个菜单代号。如果您在资源描述文件中为菜单使用了名称,叙述如下:

hMenu = LoadMenu (hInstance, TEXT ("MyMenu")) ; //命名id时加“MyMenu”

如果使用了数值,那么LoadMenu调用采用如下的形式:

hMenu = LoadMenu (hInstance, MAKEINTRESOURCE (ID_MENU)) ;

然后,您可以将这个菜单代号作为CreateWindow的第九个参数:

hwnd = CreateWindow (	TEXT ("MyClass"), TEXT ("Window Caption"),
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT,
    CW_USEDEFAULT, CW_USEDEFAULT,
    NULL, hMenu, hInstance, NULL) ;

在这种情况下,CreateWindow调用中指定的菜单可以覆盖窗口类别中指定的任何菜单。如果CreateWindow的第九个参数是NULL,那么您可以把窗口类别中的菜单看作是这种窗口类别的窗口内定使用的菜单。这样,您可以为依据同一窗口类别建立的几个窗口使用不同的菜单。

3.您也可以在窗口类别中指定NULL菜单,并且在CreateWindow调用中也指定NULL菜单,然后在窗口被建立后再给窗口指定一个菜单:

SetMenu (hwnd, hMenu) ;

这种形式使您可以动态地修改窗口的菜单。在本章后面的 NOPOPUPS程序 中我们将会看到这方面的例子。

当窗口被清除时,与窗口相关的所有菜单都将被清除。与窗口不相关的菜单在程序结束前通过调用DestroyMenu主动清除。


[cpp]  view plain copy
  1. /*-------------------------------------------------------------------------- 
  2.     ICONDEMO.C --       Icon Demonstration Program 
  3.                         (c) Charles Petzold, 1998 
  4. --------------------------------------------------------------------------*/  
  5.   
  6. #include <windows.h>  
  7. #include "resource.h"  
  8.   
  9. #define ID_TIMER 1  
  10. TCHAR   szAppName[] = TEXT("MENUDEMO");  
  11. HINSTANCE hlnst;  
  12. LRESULT CALLBACK WndProc (HWNDUINTWPARAMLPARAM) ;  
  13. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,  
  14.                                             PSTR szCmdLine, int iCmdShow)  
  15. {  
  16.  //     TCHAR               szAppName[]         = TEXT ("ICONDEMO") ;  
  17.         HWND                hwnd ;  
  18.         MSG                 msg ;  
  19.         WNDCLASS            wndclass ;  
  20.         HMENU               hMenu;  
  21.   
  22.         wndclass.style                  = CS_HREDRAW | CS_VREDRAW ;  
  23.         wndclass.lpfnWndProc            = WndProc ;  
  24.         wndclass.cbClsExtra             = 0 ;  
  25.         wndclass.cbWndExtra             = 0 ;  
  26.         wndclass.hInstance              = hInstance ;  
  27.         wndclass.hIcon                  = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON)) ;  
  28.         wndclass.hCursor                = LoadCursor (hInstance, MAKEINTRESOURCE(IDC_CURSOR));//IDC_ARROW) ;  
  29.         wndclass.hbrBackground      =(HBRUSH) GetStockObject (WHITE_BRUSH) ;  
  30.         wndclass.lpszMenuName       = NULL;//szAppName ;  
  31.         wndclass.lpszClassName      = szAppName ;  
  32.         if (!RegisterClass (&wndclass))  
  33.         {  
  34.                 MessageBox (    NULL, TEXT ("This program requires Windows NT!"),  
  35.                                                 szAppName, MB_ICONERROR) ;  
  36.                 return 0 ;  
  37.      }  
  38.        hlnst = hInstance;  
  39.        hwnd = CreateWindow (    szAppName, TEXT ("Icon Demo"),  
  40.                    WS_OVERLAPPEDWINDOW,  
  41.                    CW_USEDEFAULT, CW_USEDEFAULT,  
  42.                    CW_USEDEFAULT, CW_USEDEFAULT,  
  43.                    NULL, NULL//MAKEINTRESOURCE (MyMenu))    
  44.                    , hInstance, NULL) ;  
  45.   
  46.         //SetMenu(hwnd,  LoadMenu (hInstance, L"ICONDEMO"));  
  47.         ShowWindow (hwnd, iCmdShow) ;  
  48.         UpdateWindow (hwnd) ;  
  49.   
  50.         while (GetMessage (&msg, NULL, 0, 0))  
  51.         {  
  52.                 TranslateMessage (&msg) ;  
  53.                 DispatchMessage (&msg) ;  
  54.     }  
  55.         return msg.wParam ;  
  56. }  
  57.   
  58. LRESULT CALLBACK WndProc (  HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)  
  59. {  
  60.         static HICON hIcon ;  
  61.         static int   cxIcon, cyIcon, cxClient, cyClient ;  
  62.         HDC          hdc ;  
  63.         HINSTANCE    hInstance ;  
  64.         PAINTSTRUCT  ps ;  
  65.         int          x, y ;  
  66.         HMENU        hMenu;  
  67.         static int idColor[5]={ WHITE_BRUSH, LTGRAY_BRUSH,  
  68.                            GRAY_BRUSH, DKGRAY_BRUSH, BLACK_BRUSH };  
  69.         static int iSelection = IDM_BKGND_WHITE ;  
  70.         POINT      point;  
  71.   
  72.         switch (message)  
  73.         {  
  74.         case    WM_COMMAND:  
  75.                 hMenu = GetMenu(hwnd);  
  76.                 switch(LOWORD(wParam))  
  77.                 {  
  78.                 case IDM_FILE_NEW:  
  79.                 case IDM_FILE_OPEN:  
  80.                 case IDM_FILE_SAVE:  
  81.                 case IDM_FILE_SAVE_AS:  
  82.                       MessageBeep(0);  
  83.                       return 0;  
  84.                 case IDM_APP_EXIT:  
  85.                       SendMessage(hwnd, WM_CLOSE, 0, 0);  
  86.                       return 0;  
  87.                 case IDM_EDIT_UNDO:  
  88.                 case IDM_EDIT_CUT:  
  89.                 case IDM_EDIT_COPY:  
  90.                 case IDM_EDIT_PASTE:  
  91.                 case IDM_EDIT_CLEAR:  
  92.                          MessageBeep(0);  
  93.                          return 0;  
  94.                 case    IDM_BKGND_WHITE:            // Note: Logic below  
  95.                 case    IDM_BKGND_LTGRAY:           // assumes that IDM_WHITE  
  96.                 case    IDM_BKGND_GRAY:             // through IDM_BLACK are  
  97.                 case    IDM_BKGND_DKGRAY:           // consecutive numbers in  
  98.                 case    IDM_BKGND_BLACK:            // the order shown here.  
  99.                  
  100.                 CheckMenuItem(hMenu, iSelection, MF_UNCHECKED);  
  101.                 iSelection = LOWORD(wParam);  
  102.                 CheckMenuItem(hMenu, iSelection, MF_CHECKED);  
  103.                 SetClassLong(hwnd, GCL_HBRBACKGROUND, (LONG)  
  104.                      GetStockObject(idColor[LOWORD(wParam) - IDM_BKGND_WHITE])  
  105.                     );  
  106.                 InvalidateRect(hwnd, NULL, TRUE);  
  107.                  return 0;  
  108.   
  109.                 case IDM_TIMER_START:  
  110.                     if(SetTimer(hwnd, ID_TIMER, 10000,NULL))  
  111.                     {  
  112.                         EnableMenuItem(hMenu, IDM_TIMER_START, MF_GRAYED);  
  113.                         EnableMenuItem(hMenu, IDM_TIMER_STOP, MF_ENABLED);  
  114.                     }  
  115.                     return 0;  
  116.                 case IDM_TIMER_STOP:  
  117.                     KillTimer(hwnd, ID_TIMER);  
  118.                     EnableMenuItem(hMenu, IDM_TIMER_START, MF_ENABLED);  
  119.                     EnableMenuItem(hMenu, IDM_TIMER_STOP, MF_GRAYED);  
  120.                     return 0;  
  121.                 case IDM_APP_HELP:  
  122.                      MessageBox(hwnd, TEXT("Help not yet implemented"),  
  123.                           szAppName,MB_ICONEXCLAMATION | MB_OK );  
  124.                      return 0;  
  125.                 case IDM_APP_ABOUT:  
  126.                      MessageBox(hwnd, TEXT("MENU DEMONSTRATION")TEXT ("(c) Charles Petzold, 1998"),  
  127.                          szAppName, MB_ICONINFORMATION | MB_OK);  
  128.                      return 0;  
  129.   
  130.   
  131.                 }  
  132.                 break;  
  133.         case    WM_CREATE :  
  134.                 hInstance   = ((LPCREATESTRUCT) lParam)->hInstance ;  
  135.                 hIcon       = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON)) ;  
  136.                 cxIcon      = GetSystemMetrics (SM_CXICON) ;  
  137.                 cyIcon      = GetSystemMetrics (SM_CYICON) ;  
  138.   
  139.                 hMenu = LoadMenu(hlnst,szAppName);  
  140.                 hMenu = GetSubMenu(hMenu,0);  
  141.                 return 0 ;  
  142.   
  143.         case WM_RBUTTONUP:  
  144.             point.x = LOWORD(lParam);  
  145.             point.y = HIWORD(lParam);  
  146.             ClientToScreen(hwnd, &point);  
  147.             TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL) ;  
  148.             return 0;  
  149.   
  150.          case   WM_SIZE :  
  151.                 cxClient        = LOWORD (lParam) ;  
  152.                 cyClient        = HIWORD (lParam) ;  
  153.                 return 0 ;  
  154.   
  155.     /*case  WM_PAINT : 
  156.                 hdc = BeginPaint (hwnd, &ps) ; 
  157.  
  158.                 for (y = 0 ; y < cyClient ; y += cyIcon) 
  159.                             for (x = 0 ; x < cxClient ; x += cxIcon) 
  160.                                  DrawIcon (hdc, x, y, hIcon) ; 
  161.  
  162.                             EndPaint (hwnd, &ps) ; 
  163.                             return 0 ; 
  164.                             */  
  165.      case WM_TIMER:  
  166.           MessageBeep(0);  
  167.           return 0;  
  168.   
  169.         case    WM_DESTROY :  
  170.                 PostQuitMessage (0) ;  
  171.                 return 0 ;  
  172.         }  
  173.         return DefWindowProc (hwnd, message, wParam, lParam) ;  
  174. }  

你可能感兴趣的:(timer,windows,File,command,null,menu)