home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / msj / msjv1_2 / wsz.c next >
Encoding:
C/C++ Source or Header  |  1989-02-28  |  10.4 KB  |  339 lines

  1. /*
  2. ==============================================================================
  3. ==============================================================================
  4. Figure 5: WinMain  Function for WSZ
  5. ==============================================================================
  6. */
  7.  
  8. /*  whatsize -- Windows application in C */
  9.  
  10. #include <windows.h>
  11. #include "wsz.h"
  12.  
  13. long FAR PASCAL MainWndProc (HWND, unsigned, WORD, LONG) ;
  14. BOOL FAR PASCAL AboutWndProc (HWND, unsigned, WORD, LONG) ;
  15. BOOL FAR PASCAL UnitsWndProc (HWND, unsigned, WORD, LONG) ;
  16.  
  17. FARPROC lpAbout ;
  18. FARPROC lpUnits ;
  19. HANDLE  hInst;
  20. int     CurrentUnits = ID_PIXELS ;
  21. int     CurrentColor = ID_BLACK ;
  22.  
  23. int PASCAL WinMain (hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
  24.     HANDLE hInstance, hPrevInstance;
  25.     LPSTR  lpszCmdLine;
  26.     int    nCmdShow;
  27.     {
  28.     MSG    msg;
  29.  
  30.     if (!Initialize (hInstance, hPrevInstance, lpszCmdLine, nCmdShow))
  31.         return FALSE ;
  32.  
  33.     while (GetMessage ((LPMSG)&msg, NULL, 0, 0))
  34.         {
  35.         TranslateMessage ((LPMSG)&msg) ;
  36.         DispatchMessage ((LPMSG)&msg) ;
  37.         }
  38.     return (msg.wParam) ;
  39.     }
  40.  
  41. /*
  42. ==============================================================================
  43. ==============================================================================
  44.  
  45. Figure 6: Initialization Function for WSZ
  46. ==============================================================================
  47. */
  48.  
  49. BOOL Initialize (hInstance, hPrevInst, lpszCmdLine, nCmdShow)
  50.     HANDLE   hInstance, hPrevInst ;
  51.     LPSTR    lpszCmdLine ;
  52.     int      nCmdShow ;
  53.     {
  54.     char     *szAppName [10] ;
  55.     char     *szAbout [10] ;
  56.     char     *szTitle [30] ;
  57.     WNDCLASS wndclass ;
  58.     HWND     hWnd;
  59.     HMENU    hMenu;
  60.  
  61.     LoadString (hInstance, IDS_NAME, (LPSTR) szAppName, 10) ;
  62.     LoadString (hInstance, IDS_ABOUT, (LPSTR) szAbout, 10) ;
  63.     LoadString (hInstance, IDS_TITLE, (LPSTR) szTitle, 30 ) ;
  64.  
  65.     if (!hPrevInst)
  66.         {
  67.         wndclass.style        = CS_HREDRAW | CS_VREDRAW;
  68.         wndclass.lpfnWndProc  = MainWndProc;
  69.         wndclass.cbClsExtra   = 0;
  70.         wndclass.cbWndExtra   = 0;
  71.         wndclass.hInstance    = hInstance ;
  72.         wndclass.hIcon        = LoadIcon (hInstance, (LPSTR) szAppName);
  73.         wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW);
  74.         wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH);
  75.         wndclass.lpszMenuName = (LPSTR) szAppName;
  76.         wndclass.lpszClassName= (LPSTR) szAppName;
  77.  
  78.         if (!RegisterClass ((LPWNDCLASS) &wndclass))
  79.             return FALSE;
  80.         }
  81.     else
  82.         {
  83.         GetInstanceData(hPrevInst,(NPSTR)&CurrentUnits,sizeof(int));
  84.         GetInstanceData(hPrevInst,(NPSTR)&CurrentColor,sizeof(int));
  85.         }
  86.  
  87.     hWnd = CreateWindow (
  88.             (LPSTR) szAppName,  /* class name       */
  89.             (LPSTR) szTitle,    /* caption title    */
  90.             WS_TILEDWINDOW,     /* windows style    */
  91.             0,                  /* x (ignored)      */
  92.             0,                  /* y (ignored)      */
  93.             0,                  /* width (ignored)  */
  94.             0,                  /* height (ignored) */
  95.             (HWND) NULL,        /* parent (none)    */
  96.             (HMENU) NULL,       /* menu (use class) */
  97.             (HANDLE) hInstance, /* instance handle  */
  98.             (LPSTR) NULL) ;     /* parameters       */
  99.  
  100.     hInst = hInstance ;
  101.  
  102.     lpAbout = MakeProcInstance ((FARPROC) AboutWndProc, hInstance) ;
  103.     lpUnits = MakeProcInstance ((FARPROC) UnitsWndProc, hInstance) ;
  104.  
  105.     hMenu = GetSystemMenu (hWnd, FALSE) ;
  106.     ChangeMenu (hMenu, 0, NULL, 999, MF_APPEND | MF_SEPARATOR) ;
  107.     ChangeMenu (hMenu, 0, (LPSTR) szAbout, IDM_ABOUT, 
  108.       MF_APPEND | MF_STRING) ;
  109.  
  110.     hMenu = GetMenu (hWnd) ;
  111.     CheckMenuItem (hMenu, CurrentColor, MF_CHECKED) ;
  112.  
  113.     ShowWindow (hWnd, nCmdShow) ;
  114.     UpdateWindow (hWnd) ;
  115.  
  116.     return TRUE ;
  117.     }
  118.  
  119. /*
  120. ==============================================================================
  121. ==============================================================================
  122.  
  123. Figure 7: MainWndProc Procedure for WSZ
  124. ==============================================================================
  125. */
  126.  
  127. long FAR PASCAL MainWndProc (hWnd, message, wParam, lParam)
  128.     HWND       hWnd;
  129.     unsigned   message;
  130.     WORD       wParam;
  131.     LONG       lParam;
  132.     {
  133.     HMENU      hMenu ;
  134.     static int CharHorzPix, CharVertPix ;
  135.     static int ScrnHorzPix, ScrnVertPix ;
  136.     static int ScrnHorzMil, ScrnVertMil ;
  137.     static int WindHorzPix, WindVertPix ;
  138.  
  139.     switch (message)
  140.         {
  141.         case WM_CREATE:
  142.             {
  143.             TEXTMETRIC tm ;
  144.             HDC        hDC = GetDC (hWnd) ;
  145.  
  146.             GetTextMetrics (hDC, (LPTEXTMETRIC) &tm) ;
  147.             CharHorzPix = tm.tmAveCharWidth ;
  148.             CharVertPix = tm.tmHeight ;
  149.  
  150.             ScrnHorzPix = GetDeviceCaps (hDC, HORZRES) ;
  151.             ScrnVertPix = GetDeviceCaps (hDC, VERTRES) ;
  152.             ScrnHorzMil = GetDeviceCaps (hDC, HORZSIZE) ;
  153.             ScrnVertMil = GetDeviceCaps (hDC, VERTSIZE) ;
  154.  
  155.             ReleaseDC (hWnd, hDC) ;
  156.             }
  157.             break ;
  158.  
  159.         case WM_SIZE:
  160.             WindHorzPix = LOWORD (lParam) ;
  161.             WindVertPix = HIWORD (lParam) ;
  162.             break ;
  163.  
  164.         case WM_ERASEBKGND:
  165.             return TRUE ;
  166.  
  167.         case WM_PAINT:
  168.             {
  169.             PAINTSTRUCT ps ;
  170.             char        szFormat [20] ;
  171.             char        szUnits [20] ;
  172.             char        szBuffer [60] ;
  173.             float       nHorz = (float) WindHorzPix ;
  174.             float       nVert = (float) WindVertPix ;
  175.             RECT        rect ;
  176.  
  177.             if (CurrentUnits != ID_PIXELS)
  178.                 {
  179.                 nHorz *= (float) ScrnHorzMil / ScrnHorzPix ;
  180.                 nVert *= (float) ScrnVertMil / ScrnVertPix ;
  181.                 }
  182.             if (CurrentUnits == ID_INCHES)
  183.                 {
  184.                 nHorz /= 25.4 ;
  185.                 nVert /= 25.4 ;
  186.                 }
  187.  
  188.             BeginPaint (hWnd, (LPPAINTSTRUCT) &ps) ;
  189.  
  190.             PatBlt (ps.hdc, 0, 0, WindHorzPix, WindVertPix,
  191.                (CurrentColor == ID_WHITE) ? BLACKNESS : WHITENESS) ;
  192.  
  193.             if (CurrentColor == ID_WHITE)
  194.                 {
  195.                 SetTextColor (ps.hdc, RGB (255, 255, 255)) ;
  196.                 SetBkColor (ps.hdc, RGB (0, 0, 0)) ;
  197.                 }
  198.             LoadString (hInst, IDS_FORMAT, (LPSTR) szFormat, 20) ;
  199.             LoadString (hInst, CurrentUnits, (LPSTR) szUnits, 20) ;
  200.  
  201.             rect.bottom = WindVertPix - (rect.top  = CharVertPix) ;
  202.             rect.right  = WindHorzPix - (rect.left = CharHorzPix) ;
  203.  
  204.             DrawText (ps.hdc, (LPSTR) szBuffer,
  205.                 sprintf(szBuffer,szFormat,nHorz,szUnits,nVert,szUnits),
  206.                 (LPRECT) &rect, DT_CENTER | DT_WORDBREAK) ;
  207.  
  208.             EndPaint (hWnd, (LPPAINTSTRUCT) &ps) ;
  209.             }
  210.             break;
  211.  
  212.         case WM_SYSCOMMAND:
  213.             switch (wParam)
  214.                 {
  215.                 case IDM_ABOUT:
  216.                     DialogBox(hInst,(LPSTR)"AboutBox",hWnd,lpAbout);
  217.                     break;
  218.  
  219.                 default:
  220.                     return DefWindowProc(hWnd,message,wParam,lParam);
  221.                 }
  222.             break;
  223.  
  224.         case WM_COMMAND :
  225.             switch (wParam)
  226.                 {
  227.                 case ID_BLACK:
  228.                 case ID_WHITE:
  229.                     hMenu = GetMenu (hWnd) ;
  230.                     CheckMenuItem(hMenu,CurrentColor,MF_UNCHECKED);
  231.                     CheckMenuItem (hMenu, CurrentColor = wParam, 
  232.                          MF_CHECKED) ;
  233.                     InvalidateRect (hWnd, (LPRECT) NULL, TRUE) ;
  234.                     break ;
  235.  
  236.                 case IDM_UNITS:
  237.                     if (DialogBox (hInst, (LPSTR) "UnitsBox", hWnd, 
  238.                               lpUnits))
  239.                          InvalidateRect (hWnd, (LPRECT) NULL, TRUE) ;
  240.                     break ;
  241.  
  242.                 default :
  243.                     return DefWindowProc (hWnd, message, wParam, lParam) ;
  244.                 }
  245.             break ;
  246.  
  247.         case WM_DESTROY:
  248.             PostQuitMessage (0) ;
  249.             break;
  250.  
  251.         default:
  252.             return DefWindowProc (hWnd, message, wParam, lParam) ;
  253.             break;
  254.         }
  255.     return (0L) ;
  256.     }
  257.  
  258. /*
  259. ==============================================================================
  260. ==============================================================================
  261.  
  262. Figure 8: AboutWndProc Procedure for WSZ
  263. ==============================================================================
  264. */
  265.  
  266. BOOL FAR PASCAL AboutWndProc (hDlg, message, wParam, lParam)
  267.     HWND     hDlg ;
  268.     unsigned message ;
  269.     WORD     wParam ;
  270.     LONG     lParam ;
  271.     {
  272.     switch (message)
  273.         {
  274.         case WM_INITDIALOG :
  275.             return TRUE ;
  276.  
  277.         case WM_COMMAND :
  278.             EndDialog (hDlg, TRUE) ;
  279.             return TRUE ;
  280.  
  281.         default:
  282.             return FALSE ;
  283.         }
  284.     }
  285.  
  286. /*
  287. ==============================================================================
  288. ==============================================================================
  289.  
  290. Figure 9: UnitsWndProc Procedure for WSZ
  291. ==============================================================================
  292. */
  293.  
  294. BOOL FAR PASCAL UnitsWndProc (hDlg, message, wParam, lParam)
  295.     HWND       hDlg ;
  296.     unsigned   message ;
  297.     WORD       wParam ;
  298.     LONG       lParam ;
  299.     {
  300.     static int NewUnits ;
  301.  
  302.     switch (message)
  303.         {
  304.         case WM_INITDIALOG :
  305.             CheckRadioButton (hDlg,ID_PIXELS,ID_INCHES,CurrentUnits);
  306.             SetFocus (GetDlgItem (hDlg, NewUnits = CurrentUnits)) ;
  307.             return FALSE ;
  308.  
  309.         case WM_COMMAND :
  310.             switch (wParam)
  311.                 {
  312.                 case ID_MILLIM:
  313.                 case ID_INCHES:
  314.                 case ID_PIXELS:
  315.                     NewUnits = wParam ;
  316.                     CheckRadioButton (hDlg,ID_PIXELS,ID_INCHES,NewUnits);
  317.                     break ;
  318.  
  319.                 case IDOK:
  320.                     CurrentUnits = NewUnits ;
  321.                     EndDialog (hDlg, TRUE) ;
  322.                     break ;
  323.  
  324.                 case IDCANCEL:
  325.                     EndDialog (hDlg, FALSE) ;
  326.                     break ;
  327.  
  328.                 default:
  329.                     return FALSE ;
  330.                 }
  331.             break ;
  332.  
  333.         default:
  334.             return FALSE ;
  335.         }
  336.     return TRUE ;
  337.     }
  338.  
  339.