《windows程序设计 第五版》实例

//MENUDEMO.C
#include <windows.h>
#include "resource.h"
#define ID_TIMER 1
LRESULT 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) ;  //获取主菜单句柄
          //LOWORD(wParam)表示菜单ID
          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) ;           //菜单ID
               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
")
                                 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) ;
}
//Resource.h
#include <windows.h>
#include "resource.h"
#define ID_TIMER 1
LRESULT 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) ;  //获取主菜单句柄
          //LOWORD(wParam)表示菜单ID
          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) ;           //菜单ID
               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
")
                                 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) ;
}
//menudemo.rc
#include "resource.h"
#include "afxres.h"
MENUDEMO MENU DISCARDABLE
BEGIN
   POPUP "&File"
   BEGIN
      MENUITEM "&New", IDM_FILE_NEW
      MENUITEM "&Open", IDM_FILE_OPEN
      MENUITEM "&Save", IDM_FILE_SAVE
      MENUITEM "&Save &AS", IDM_FILE_SAVE_AS
      MENUITEM SEPARATOR
      MENUITEM "E&xit",   IDM_APP_EXIT
   END
   POPUP "&Edit"
   BEGIN
      MENUITEM "&Undo", IDM_EDIT_UNDO
      MENUITEM SEPARATOR
      MENUITEM "C&ut",IDM_EDIT_CUT
      MENUITEM "&Copy",IDM_EDIT_COPY
      MENUITEM "&Paste",IDM_EDIT_PASTE
      MENUITEM "De&lete",IDM_EDIT_CLEAR
  END
  POPUP "&Background"
  BEGIN
     MENUITEM "&White",IDM_BKGND_WHITE,CHECKED
     MENUITEM "&Light Gray",IDM_BKGND_LTGRAY
     MENUITEM "&Gray",IDM_BKGND_GRAY
     MENUITEM "&Dark Gray",IDM_BKGND_DKGRAY
     MENUITEM "&Black"  ,IDM_BKGND_BLACK
  END
  POPUP "&Timer"
  BEGIN
     MENUITEM "&Start",  IDM_TIMER_START
     MENUITEM "S&top",IDM_TIMER_STOP,GRAYED
  END
  POPUP "&Help"
  BEGIN
   MENUITEM "&Help",      IDM_APP_HELP
   MENUITEM "&About MenuDemo...",IDM_APP_ABOUT
  END
END

原文地址:https://www.cnblogs.com/coding365/p/12872364.html