home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / progwin / chap09 / poppad2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-11-12  |  6.7 KB  |  194 lines

  1. /*-----------------------------------------------------
  2.    POPPAD2.C -- Popup Editor Version 2 (includes menu)
  3.                 (c) Charles Petzold, 1990
  4.   -----------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "poppad2.h"
  8.  
  9. long FAR PASCAL WndProc (HWND, WORD, WORD, LONG);
  10.  
  11. char szAppName [] = "PopPad2" ;
  12.  
  13. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  14.                     LPSTR lpszCmdLine, int nCmdShow)
  15.      {
  16.      HANDLE   hAccel ;
  17.      HWND     hwnd ;
  18.      MSG      msg;
  19.      WNDCLASS wndclass ;
  20.  
  21.      if (!hPrevInstance) 
  22.           {
  23.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  24.           wndclass.lpfnWndProc   = WndProc ;
  25.           wndclass.cbClsExtra    = 0 ;
  26.           wndclass.cbWndExtra    = 0 ;
  27.           wndclass.hInstance     = hInstance ;
  28.           wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;
  29.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  30.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  31.           wndclass.lpszMenuName  = szAppName ;
  32.           wndclass.lpszClassName = szAppName ;
  33.  
  34.           RegisterClass (&wndclass) ;
  35.           }
  36.  
  37.      hwnd = CreateWindow (szAppName, szAppName,
  38.                           WS_OVERLAPPEDWINDOW,
  39.                           GetSystemMetrics (SM_CXSCREEN) / 4,
  40.                           GetSystemMetrics (SM_CYSCREEN) / 4,
  41.                           GetSystemMetrics (SM_CXSCREEN) / 2,
  42.                           GetSystemMetrics (SM_CYSCREEN) / 2,
  43.                           NULL, NULL, hInstance, NULL) ;
  44.  
  45.      ShowWindow (hwnd, nCmdShow) ;
  46.      UpdateWindow (hwnd); 
  47.  
  48.      hAccel = LoadAccelerators (hInstance, szAppName) ;
  49.  
  50.      while (GetMessage (&msg, NULL, 0, 0))
  51.           {
  52.           if (!TranslateAccelerator (hwnd, hAccel, &msg))
  53.                {
  54.                TranslateMessage (&msg) ;
  55.                DispatchMessage (&msg) ;
  56.                }
  57.           }
  58.      return msg.wParam ;
  59.      }
  60.  
  61. AskConfirmation (HWND hwnd)
  62.      {
  63.      return MessageBox (hwnd, "Really want to close PopPad2?",
  64.                         szAppName, MB_YESNO | MB_ICONQUESTION) ;
  65.      }
  66.  
  67. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  68.      {
  69.      static HWND hwndEdit ;
  70.      LONG        lSelect ;
  71.      WORD        wEnable ;
  72.  
  73.      switch (message)
  74.           {
  75.           case WM_CREATE:
  76.                hwndEdit = CreateWindow ("edit", NULL,
  77.                          WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
  78.                               WS_BORDER | ES_LEFT | ES_MULTILINE |
  79.                               ES_AUTOHSCROLL | ES_AUTOVSCROLL,
  80.                          0, 0, 0, 0,
  81.                          hwnd, 1, ((LPCREATESTRUCT) lParam)->hInstance, NULL) ;
  82.                return 0 ;
  83.  
  84.           case WM_SETFOCUS:
  85.                SetFocus (hwndEdit) ;
  86.                return 0 ;
  87.  
  88.           case WM_SIZE: 
  89.                MoveWindow (hwndEdit, 0, 0, LOWORD (lParam),
  90.                                            HIWORD (lParam), TRUE) ;
  91.                return 0 ;
  92.  
  93.           case WM_INITMENUPOPUP:
  94.                if (lParam == 1)
  95.                     {
  96.                     EnableMenuItem (wParam, IDM_UNDO,
  97.                          SendMessage (hwndEdit, EM_CANUNDO, 0, 0L) ?
  98.                               MF_ENABLED : MF_GRAYED) ;
  99.  
  100.                     EnableMenuItem (wParam, IDM_PASTE,
  101.                          IsClipboardFormatAvailable (CF_TEXT) ?
  102.                               MF_ENABLED : MF_GRAYED) ;
  103.  
  104.                     lSelect = SendMessage (hwndEdit, EM_GETSEL, 0, 0L) ;
  105.  
  106.                     if (HIWORD (lSelect) == LOWORD (lSelect))
  107.                          wEnable = MF_GRAYED ;
  108.                     else
  109.                          wEnable = MF_ENABLED ;
  110.  
  111.                     EnableMenuItem (wParam, IDM_CUT,   wEnable) ;
  112.                     EnableMenuItem (wParam, IDM_COPY,  wEnable) ;
  113.                     EnableMenuItem (wParam, IDM_CLEAR, wEnable) ;
  114.  
  115.                     return 0 ;
  116.                     }
  117.                break ;
  118.  
  119.           case WM_COMMAND :
  120.                if (LOWORD (lParam))
  121.                     {
  122.                     if (wParam == 1 && HIWORD (lParam) == EN_ERRSPACE)
  123.                          MessageBox (hwnd, "Edit control out of space.",
  124.                                      szAppName, MB_OK | MB_ICONSTOP) ;
  125.  
  126.                     return 0 ;
  127.                     }
  128.  
  129.                else switch (wParam)
  130.                          {
  131.                          case IDM_NEW:
  132.                          case IDM_OPEN:
  133.                          case IDM_SAVE:
  134.                          case IDM_SAVEAS:
  135.                          case IDM_PRINT:
  136.                               MessageBeep (0) ;
  137.                               return 0 ;
  138.  
  139.                          case IDM_EXIT:
  140.                               SendMessage (hwnd, WM_CLOSE, 0, 0L) ;
  141.                               return 0 ;
  142.  
  143.                          case IDM_ABOUT:
  144.                               MessageBox (hwnd,
  145.                                    "POPPAD2 (c) Charles Petzold, 1990",
  146.                                    szAppName, MB_OK | MB_ICONINFORMATION) ;
  147.                               return 0 ;
  148.  
  149.                          case IDM_UNDO:
  150.                               SendMessage (hwndEdit, WM_UNDO, 0, 0L) ;
  151.                               return 0 ;
  152.  
  153.                          case IDM_CUT:
  154.                               SendMessage (hwndEdit, WM_CUT, 0, 0L) ;
  155.                               return 0 ;
  156.  
  157.                          case IDM_COPY:
  158.                               SendMessage (hwndEdit, WM_COPY, 0, 0L) ;
  159.                               return 0 ;
  160.  
  161.                          case IDM_PASTE:
  162.                               SendMessage (hwndEdit, WM_PASTE, 0, 0L) ;
  163.                               return 0 ;
  164.  
  165.                          case IDM_CLEAR:
  166.                               SendMessage (hwndEdit, WM_CLEAR, 0, 0L) ;
  167.                               return 0 ;
  168.  
  169.                          case IDM_SELALL:
  170.                               SendMessage (hwndEdit, EM_SETSEL, 0,
  171.                                            MAKELONG (0, 32767)) ;
  172.  
  173.                               return 0 ;
  174.                          }
  175.                break ;
  176.  
  177.           case WM_CLOSE:
  178.                if (IDYES == AskConfirmation (hwnd))
  179.                     DestroyWindow (hwnd) ;
  180.                return 0 ;
  181.  
  182.           case WM_QUERYENDSESSION:
  183.                if (IDYES == AskConfirmation (hwnd))
  184.                     return 1L ;
  185.                else
  186.                     return 0 ;
  187.  
  188.           case WM_DESTROY :
  189.                PostQuitMessage (0) ;
  190.                return 0 ;
  191.           }
  192.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  193.      }
  194.