home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c221 / 7.ddi / MWHC.007 / K3 < prev    next >
Encoding:
Text File  |  1990-11-11  |  11.2 KB  |  321 lines

  1. /*---------------------------------------
  2.    POPPAD.C -- Popup Editor
  3.                (c) Charles Petzold, 1990
  4.   ---------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "poppad.h"
  8. #define  EDITID 1
  9.  
  10. long FAR PASCAL WndProc (HWND, WORD, WORD, LONG);
  11.  
  12. BOOL ReadFile  (HANDLE, HWND, HWND, POFSTRUCT, char *, BOOL) ;
  13. BOOL WriteFile (HANDLE, HWND, HWND, POFSTRUCT, char *, BOOL) ;
  14. BOOL PrintFile (HANDLE, HWND, HWND, char *) ;
  15.  
  16. LPSTR lstrrchr (LPSTR, char) ;
  17.  
  18. char szAppName  [] = "PopPad" ;
  19. char szFileSpec [] = "*.TXT"  ;
  20. char szUntitled [] = "(untitled)" ;
  21.  
  22. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  23.                     LPSTR lpszCmdLine, int nCmdShow)
  24.      {
  25.      MSG      msg;
  26.      HWND     hwnd ;
  27.      HANDLE   hAccel ;
  28.      WNDCLASS wndclass ;
  29.  
  30.      if (!hPrevInstance) 
  31.           {
  32.           wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  33.           wndclass.lpfnWndProc   = WndProc ;
  34.           wndclass.cbClsExtra    = 0 ;
  35.           wndclass.cbWndExtra    = 0 ;
  36.           wndclass.hInstance     = hInstance ;
  37.           wndclass.hIcon         = LoadIcon (hInstance, szAppName) ;
  38.           wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  39.           wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;
  40.           wndclass.lpszMenuName  = szAppName ;
  41.           wndclass.lpszClassName = szAppName ;
  42.  
  43.           RegisterClass (&wndclass) ;
  44.           }
  45.  
  46.      hwnd = CreateWindow (szAppName, NULL,
  47.                           WS_OVERLAPPEDWINDOW,
  48.                           GetSystemMetrics (SM_CXSCREEN) / 4,
  49.                           GetSystemMetrics (SM_CYSCREEN) / 4,
  50.                           GetSystemMetrics (SM_CXSCREEN) / 2,
  51.                           GetSystemMetrics (SM_CYSCREEN) / 2,
  52.                           NULL, NULL, hInstance, lpszCmdLine) ;
  53.  
  54.      ShowWindow (hwnd, nCmdShow) ;
  55.  
  56.      UpdateWindow (hwnd); 
  57.  
  58.      hAccel = LoadAccelerators (hInstance, szAppName) ;
  59.  
  60.      while (GetMessage (&msg, NULL, 0, 0))
  61.           {
  62.           if (!TranslateAccelerator (hwnd, hAccel, &msg))
  63.                {
  64.                TranslateMessage (&msg) ;
  65.                DispatchMessage (&msg) ;
  66.                }
  67.           }
  68.      return msg.wParam ;
  69.      }
  70.  
  71. BOOL FAR PASCAL AboutDlgProc (HWND hDlg, WORD message, WORD wParam, LONG lParam)
  72.      {
  73.      switch (message)
  74.           {
  75.           case WM_INITDIALOG:
  76.                return TRUE ;
  77.  
  78.           case WM_COMMAND:
  79.                switch (wParam)
  80.                     {
  81.                     case IDOK:
  82.                          EndDialog (hDlg, 0) ;
  83.                          return TRUE ;
  84.                     }
  85.                break ;
  86.           }
  87.      return FALSE ;
  88.      }
  89.  
  90. void DoCaption (HWND hwnd, char *szFileName)
  91.      {
  92.      char szCaption [40] ;
  93.  
  94.      wsprintf (szCaption, "%s - %s", (LPSTR) szAppName,
  95.                (LPSTR) (szFileName [0] ? szFileName : szUntitled)) ;
  96.  
  97.      SetWindowText (hwnd, szCaption) ;
  98.      }
  99.  
  100. short AskAboutSave (HWND hwnd, char *szFileName)
  101.      {
  102.      char  szBuffer [40] ;
  103.      short nReturn ;
  104.  
  105.      wsprintf (szBuffer, "Save current changes: %s",
  106.                (LPSTR) (szFileName [0] ? szFileName : szUntitled)) ;
  107.  
  108.      if (IDYES == (nReturn = MessageBox (hwnd, szBuffer, szAppName,
  109.                                     MB_YESNOCANCEL | MB_ICONQUESTION)))
  110.  
  111.           if (!SendMessage (hwnd, WM_COMMAND, IDM_SAVE, 0L))
  112.                return IDCANCEL ;
  113.  
  114.      return nReturn ;
  115.      }
  116.  
  117. long FAR PASCAL WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  118.      {
  119.      static BOOL    bNeedSave = FALSE ;
  120.      static char    szRealFileName [16] ;
  121.      static FARPROC lpfnAboutDlgProc ;
  122.      static HANDLE  hInst ;
  123.      static HWND    hwndEdit ;
  124.      char           szFileName [16] ;
  125.      LONG           lSelect ;
  126.      OFSTRUCT       of ;
  127.      WORD           wEnable ;
  128.  
  129.      switch (message)
  130.           {
  131.           case WM_CREATE:
  132.                hInst = ((LPCREATESTRUCT) lParam)->hInstance ;
  133.                lpfnAboutDlgProc = MakeProcInstance (AboutDlgProc, hInst) ;
  134.  
  135.                hwndEdit = CreateWindow ("edit", NULL,
  136.                          WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
  137.                               WS_BORDER | ES_LEFT | ES_MULTILINE |
  138.                               ES_AUTOHSCROLL | ES_AUTOVSCROLL,
  139.                          0, 0, 0, 0,
  140.                          hwnd, EDITID, hInst, NULL) ;
  141.  
  142.                SendMessage (hwndEdit, EM_LIMITTEXT, 32000, 0L) ;
  143.  
  144.                if (lstrlen (((LPCREATESTRUCT) lParam)->lpCreateParams))
  145.                     {
  146.                     OpenFile (((LPCREATESTRUCT) lParam)->lpCreateParams,
  147.                                         &of, OF_PARSE) ;
  148.                     lstrcpy (szFileName,
  149.                               AnsiNext (lstrrchr (of.szPathName, '\\'))) ;
  150.  
  151.                     if (ReadFile (hInst, hwnd, hwndEdit, &of,
  152.                               szFileName, FALSE))
  153.                          lstrcpy (szRealFileName, szFileName) ;
  154.                     }
  155.                DoCaption (hwnd, szRealFileName) ;
  156.                return 0 ;
  157.  
  158.           case WM_SETFOCUS:
  159.                SetFocus (hwndEdit) ;
  160.                return 0 ;
  161.  
  162.           case WM_SIZE: 
  163.                MoveWindow (hwndEdit, 0, 0, LOWORD (lParam),
  164.                                            HIWORD (lParam), TRUE) ;
  165.                return 0 ;
  166.  
  167.           case WM_INITMENUPOPUP:
  168.                if (lParam == 1)
  169.                     {
  170.                     EnableMenuItem (wParam, IDM_UNDO,
  171.                          SendMessage (hwndEdit, EM_CANUNDO, 0, 0L) ?
  172.                               MF_ENABLED : MF_GRAYED) ;
  173.  
  174.                     EnableMenuItem (wParam, IDM_PASTE,
  175.                          IsClipboardFormatAvailable (CF_TEXT) ?
  176.                               MF_ENABLED : MF_GRAYED) ;
  177.  
  178.                     lSelect = SendMessage (hwndEdit, EM_GETSEL, 0, 0L) ;
  179.  
  180.                     if (HIWORD (lSelect) == LOWORD (lSelect))
  181.                          wEnable = MF_GRAYED ;
  182.                     else
  183.                          wEnable = MF_ENABLED ;
  184.  
  185.                     EnableMenuItem (wParam, IDM_CUT,   wEnable) ;
  186.                     EnableMenuItem (wParam, IDM_COPY,  wEnable) ;
  187.                     EnableMenuItem (wParam, IDM_CLEAR, wEnable) ;
  188.                     }
  189.                return 0 ;
  190.  
  191.           case WM_COMMAND :
  192.                if (LOWORD (lParam) && wParam == EDITID)
  193.                     {
  194.                     switch (HIWORD (lParam))
  195.                          {
  196.                          case EN_UPDATE:
  197.                               bNeedSave = TRUE ;
  198.                               return 0 ;
  199.  
  200.                          case EN_ERRSPACE:
  201.                               MessageBox (hwnd, "Edit control out of space.",
  202.                                         szAppName, MB_OK | MB_ICONSTOP) ;
  203.                               return 0 ;
  204.                          }
  205.                     break ;
  206.                     }
  207.  
  208.                switch (wParam)
  209.                     {
  210.                     case IDM_NEW:
  211.                          if (bNeedSave && IDCANCEL ==
  212.                                    AskAboutSave (hwnd, szRealFileName))
  213.                               return 0 ;
  214.  
  215.                          SetWindowText (hwndEdit, "\0") ;
  216.                          szRealFileName [0] = '\0' ;
  217.                          DoCaption (hwnd, szRealFileName) ;
  218.                          bNeedSave = FALSE ;
  219.                          return 0 ;
  220.  
  221.                     case IDM_OPEN:
  222.                          if (bNeedSave && IDCANCEL ==
  223.                                    AskAboutSave (hwnd, szRealFileName))
  224.                               return 0 ;
  225.  
  226.                          if (ReadFile (hInst, hwnd, hwndEdit, &of,
  227.                                         szFileName, TRUE))
  228.                               {
  229.                               lstrcpy (szRealFileName, szFileName) ;
  230.                               DoCaption (hwnd, szRealFileName) ;
  231.                               bNeedSave = FALSE ;
  232.                               }
  233.  
  234.                          return 0 ;
  235.  
  236.                     case IDM_SAVE:
  237.                          if (szRealFileName [0])
  238.                               {
  239.                               if (WriteFile (hInst, hwnd, hwndEdit, &of,
  240.                                              szRealFileName, FALSE))
  241.                                    {
  242.                                    bNeedSave = FALSE ;
  243.                                    return 1 ;
  244.                                    }
  245.                               return 0 ;
  246.                               }
  247.                                                   // fall through
  248.                     case IDM_SAVEAS:
  249.                          if (WriteFile (hInst, hwnd, hwndEdit, &of,
  250.                                         szFileName, TRUE))
  251.                               {
  252.                               lstrcpy (szRealFileName, szFileName) ;
  253.                               DoCaption (hwnd, szFileName) ;
  254.                               bNeedSave = FALSE ;
  255.                               return 1 ;
  256.                               }
  257.                          return 0 ;
  258.  
  259.                     case IDM_PRINT:
  260.                          PrintFile (hInst, hwnd, hwndEdit,
  261.                               szRealFileName [0] ? szRealFileName :
  262.                                                    szUntitled) ;
  263.                          return 0 ;
  264.  
  265.                     case IDM_EXIT:
  266.                          SendMessage (hwnd, WM_CLOSE, 0, 0L) ;
  267.                          return 0 ;
  268.  
  269.                     case IDM_ABOUT:
  270.                          DialogBox (hInst, "AboutBox", hwnd,
  271.                                    lpfnAboutDlgProc) ;
  272.                          return 0 ;
  273.  
  274.                     case IDM_UNDO:
  275.                          SendMessage (hwndEdit, WM_UNDO, 0, 0L) ;
  276.                          return 0 ;
  277.  
  278.                     case IDM_CUT:
  279.                          SendMessage (hwndEdit, WM_CUT, 0, 0L) ;
  280.                          return 0 ;
  281.  
  282.                     case IDM_COPY:
  283.                          SendMessage (hwndEdit, WM_COPY, 0, 0L) ;
  284.                          return 0 ;
  285.  
  286.                     case IDM_PASTE:
  287.                          SendMessage (hwndEdit, WM_PASTE, 0, 0L) ;
  288.                          return 0 ;
  289.  
  290.                     case IDM_CLEAR:
  291.                          SendMessage (hwndEdit, WM_CLEAR, 0, 0L) ;
  292.                          return 0 ;
  293.  
  294.                     case IDM_SELALL:
  295.                          SendMessage (hwndEdit, EM_SETSEL, 0,
  296.                                         MAKELONG (0, 32767)) ;
  297.                          return 0 ;
  298.                     }
  299.                break ;
  300.  
  301.           case WM_CLOSE:
  302.                if (!bNeedSave || IDCANCEL !=
  303.                          AskAboutSave (hwnd, szRealFileName))
  304.                     DestroyWindow (hwnd) ;
  305.  
  306.                return 0 ;
  307.  
  308.           case WM_QUERYENDSESSION:
  309.                if (!bNeedSave || IDCANCEL !=
  310.                          AskAboutSave (hwnd, szRealFileName))
  311.                     return 1L ;
  312.  
  313.                return 0 ;
  314.  
  315.           case WM_DESTROY:
  316.                PostQuitMessage (0) ;
  317.                return 0 ;
  318.           }
  319.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  320.      }
  321.