home *** CD-ROM | disk | FTP | other *** search
/ Phoenix CD 2.0 / Phoenix_CD.cdr / 01e / msjall.zip / MSJV1-2.ZIP / WHATSIZE.ALL
Text File  |  1987-10-30  |  15KB  |  506 lines

  1. Microsoft Systems Journal
  2. Volume 1; Issue 2; December, 1986
  3.  
  4. Code Listings For:
  5.  
  6.     Whatsize
  7.     pp. 13-24
  8.  
  9. Author(s): Charles Petzold
  10. Title:     A Step-by-Step Guide to Building Your First Windows Application
  11.  
  12.  
  13.  
  14. ==============================================================================
  15. ==============================================================================
  16.  
  17. Figure 2: WSZ.RC
  18. ==============================================================================
  19.  
  20. #include <windows.h>
  21. #include "WSZ.h"
  22.  
  23. WhatSize ICON WSZ.ico
  24.  
  25. STRINGTABLE
  26.     BEGIN
  27.         IDS_NAME,   "WhatSize"
  28.         IDS_ABOUT,  "About..."
  29.         IDS_TITLE,  "What Size is the Window?"
  30.         IDS_FORMAT, "%.3G %s by %.3G %s"
  31.         ID_MILLIM,  "millimeters"
  32.         ID_INCHES,  "inches"
  33.         ID_PIXELS,  "pixels"
  34.     END
  35.  
  36. WhatSize MENU
  37.     BEGIN
  38.         POPUP "Colors"
  39.             BEGIN
  40.                 MENUITEM "Black on White", ID_BLACK
  41.                 MENUITEM "White on Black", ID_WHITE
  42.             END
  43.         MENUITEM "Units", IDM_UNITS
  44.     END
  45.  
  46. AboutBox DIALOG 20, 20, 144, 75
  47.     STYLE WS_POPUP | WS_DLGFRAME
  48.     BEGIN
  49.         CTEXT "What Size?",             -1, 37,  5,  68,  8
  50.         ICON  "WhatSize",               -1,  9, 23,   0,  0
  51.         CTEXT "A Windows Application",  -1,  0, 14, 144,  8
  52.         CTEXT "Version 1.00",           -1, 38, 34,  64,  8
  53.         DEFPUSHBUTTON "Ok",           IDOK, 53, 59,  32, 14, WS_GROUP
  54.     END
  55.  
  56. UnitsBox DIALOG 20, 20, 100, 90
  57.     STYLE WS_POPUP | WS_BORDER
  58.     CAPTION "What Size Units"
  59.     BEGIN
  60.         RADIOBUTTON "Pixels",ID_PIXELS,20,5,60,15,WS_GROUP | WS_TABSTOP
  61.         RADIOBUTTON "Millimeters", ID_MILLIM, 20, 25, 60, 15
  62.         RADIOBUTTON "Inches",      ID_INCHES, 20, 45, 60, 15
  63.         DEFPUSHBUTTON "Ok",        IDOK,      10, 70, 32, 15, WS_GROUP
  64.         PUSHBUTTON "Cancel",       IDCANCEL,  58, 70, 32, 15
  65.     END
  66. ==============================================================================
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75. ==============================================================================
  76. ==============================================================================
  77. Figure 4: WSZ.H Header File
  78. ==============================================================================
  79.  
  80. #define IDS_NAME        101
  81. #define IDS_ABOUT       102
  82. #define IDS_TITLE       103
  83. #define IDS_FORMAT      104
  84.  
  85. #define ID_PIXELS       105
  86. #define ID_MILLIM       106
  87. #define ID_INCHES       107
  88. #define ID_BLACK        108
  89. #define ID_WHITE        109
  90.  
  91. #define IDM_ABOUT       110
  92. #define IDM_UNITS       111
  93. ==============================================================================
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102. ==============================================================================
  103. ==============================================================================
  104. Figure 5: WinMain  Function for WSZ
  105. ==============================================================================
  106.  
  107. /*  whatsize -- Windows application in C */
  108.  
  109. #include <windows.h>
  110. #include "wsz.h"
  111.  
  112. long FAR PASCAL MainWndProc (HWND, unsigned, WORD, LONG) ;
  113. BOOL FAR PASCAL AboutWndProc (HWND, unsigned, WORD, LONG) ;
  114. BOOL FAR PASCAL UnitsWndProc (HWND, unsigned, WORD, LONG) ;
  115.  
  116. FARPROC lpAbout ;
  117. FARPROC lpUnits ;
  118. HANDLE  hInst;
  119. int     CurrentUnits = ID_PIXELS ;
  120. int     CurrentColor = ID_BLACK ;
  121.  
  122. int PASCAL WinMain (hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
  123.     HANDLE hInstance, hPrevInstance;
  124.     LPSTR  lpszCmdLine;
  125.     int    nCmdShow;
  126.     {
  127.     MSG    msg;
  128.  
  129.     if (!Initialize (hInstance, hPrevInstance, lpszCmdLine, nCmdShow))
  130.         return FALSE ;
  131.  
  132.     while (GetMessage ((LPMSG)&msg, NULL, 0, 0))
  133.         {
  134.         TranslateMessage ((LPMSG)&msg) ;
  135.         DispatchMessage ((LPMSG)&msg) ;
  136.         }
  137.     return (msg.wParam) ;
  138.     }
  139. ==============================================================================
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147. ==============================================================================
  148. ==============================================================================
  149.  
  150. Figure 6: Initialization Function for WSZ
  151. ==============================================================================
  152.  
  153. BOOL Initialize (hInstance, hPrevInst, lpszCmdLine, nCmdShow)
  154.     HANDLE   hInstance, hPrevInst ;
  155.     LPSTR    lpszCmdLine ;
  156.     int      nCmdShow ;
  157.     {
  158.     char     *szAppName [10] ;
  159.     char     *szAbout [10] ;
  160.     char     *szTitle [30] ;
  161.     WNDCLASS wndclass ;
  162.     HWND     hWnd;
  163.     HMENU    hMenu;
  164.  
  165.     LoadString (hInstance, IDS_NAME, (LPSTR) szAppName, 10) ;
  166.     LoadString (hInstance, IDS_ABOUT, (LPSTR) szAbout, 10) ;
  167.     LoadString (hInstance, IDS_TITLE, (LPSTR) szTitle, 30 ) ;
  168.  
  169.     if (!hPrevInst)
  170.         {
  171.         wndclass.style        = CS_HREDRAW | CS_VREDRAW;
  172.         wndclass.lpfnWndProc  = MainWndProc;
  173.         wndclass.cbClsExtra   = 0;
  174.         wndclass.cbWndExtra   = 0;
  175.         wndclass.hInstance    = hInstance ;
  176.         wndclass.hIcon        = LoadIcon (hInstance, (LPSTR) szAppName);
  177.         wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW);
  178.         wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH);
  179.         wndclass.lpszMenuName = (LPSTR) szAppName;
  180.         wndclass.lpszClassName= (LPSTR) szAppName;
  181.  
  182.         if (!RegisterClass ((LPWNDCLASS) &wndclass))
  183.             return FALSE;
  184.         }
  185.     else
  186.         {
  187.         GetInstanceData(hPrevInst,(NPSTR)&CurrentUnits,sizeof(int));
  188.         GetInstanceData(hPrevInst,(NPSTR)&CurrentColor,sizeof(int));
  189.         }
  190.  
  191.     hWnd = CreateWindow (
  192.             (LPSTR) szAppName,  /* class name       */
  193.             (LPSTR) szTitle,    /* caption title    */
  194.             WS_TILEDWINDOW,     /* windows style    */
  195.             0,                  /* x (ignored)      */
  196.             0,                  /* y (ignored)      */
  197.             0,                  /* width (ignored)  */
  198.             0,                  /* height (ignored) */
  199.             (HWND) NULL,        /* parent (none)    */
  200.             (HMENU) NULL,       /* menu (use class) */
  201.             (HANDLE) hInstance, /* instance handle  */
  202.             (LPSTR) NULL) ;     /* parameters       */
  203.  
  204.     hInst = hInstance ;
  205.  
  206.     lpAbout = MakeProcInstance ((FARPROC) AboutWndProc, hInstance) ;
  207.     lpUnits = MakeProcInstance ((FARPROC) UnitsWndProc, hInstance) ;
  208.  
  209.     hMenu = GetSystemMenu (hWnd, FALSE) ;
  210.     ChangeMenu (hMenu, 0, NULL, 999, MF_APPEND | MF_SEPARATOR) ;
  211.     ChangeMenu (hMenu, 0, (LPSTR) szAbout, IDM_ABOUT, 
  212.       MF_APPEND | MF_STRING) ;
  213.  
  214.     hMenu = GetMenu (hWnd) ;
  215.     CheckMenuItem (hMenu, CurrentColor, MF_CHECKED) ;
  216.  
  217.     ShowWindow (hWnd, nCmdShow) ;
  218.     UpdateWindow (hWnd) ;
  219.  
  220.     return TRUE ;
  221.     }
  222. ==============================================================================
  223.  
  224.  
  225.  
  226.  
  227.  
  228.  
  229. ==============================================================================
  230. ==============================================================================
  231.  
  232. Figure 7: MainWndProc Procedure for WSZ
  233. ==============================================================================
  234.  
  235. long FAR PASCAL MainWndProc (hWnd, message, wParam, lParam)
  236.     HWND       hWnd;
  237.     unsigned   message;
  238.     WORD       wParam;
  239.     LONG       lParam;
  240.     {
  241.     HMENU      hMenu ;
  242.     static int CharHorzPix, CharVertPix ;
  243.     static int ScrnHorzPix, ScrnVertPix ;
  244.     static int ScrnHorzMil, ScrnVertMil ;
  245.     static int WindHorzPix, WindVertPix ;
  246.  
  247.     switch (message)
  248.         {
  249.         case WM_CREATE:
  250.             {
  251.             TEXTMETRIC tm ;
  252.             HDC        hDC = GetDC (hWnd) ;
  253.  
  254.             GetTextMetrics (hDC, (LPTEXTMETRIC) &tm) ;
  255.             CharHorzPix = tm.tmAveCharWidth ;
  256.             CharVertPix = tm.tmHeight ;
  257.  
  258.             ScrnHorzPix = GetDeviceCaps (hDC, HORZRES) ;
  259.             ScrnVertPix = GetDeviceCaps (hDC, VERTRES) ;
  260.             ScrnHorzMil = GetDeviceCaps (hDC, HORZSIZE) ;
  261.             ScrnVertMil = GetDeviceCaps (hDC, VERTSIZE) ;
  262.  
  263.             ReleaseDC (hWnd, hDC) ;
  264.             }
  265.             break ;
  266.  
  267.         case WM_SIZE:
  268.             WindHorzPix = LOWORD (lParam) ;
  269.             WindVertPix = HIWORD (lParam) ;
  270.             break ;
  271.  
  272.         case WM_ERASEBKGND:
  273.             return TRUE ;
  274.  
  275.         case WM_PAINT:
  276.             {
  277.             PAINTSTRUCT ps ;
  278.             char        szFormat [20] ;
  279.             char        szUnits [20] ;
  280.             char        szBuffer [60] ;
  281.             float       nHorz = (float) WindHorzPix ;
  282.             float       nVert = (float) WindVertPix ;
  283.             RECT        rect ;
  284.  
  285.             if (CurrentUnits != ID_PIXELS)
  286.                 {
  287.                 nHorz *= (float) ScrnHorzMil / ScrnHorzPix ;
  288.                 nVert *= (float) ScrnVertMil / ScrnVertPix ;
  289.                 }
  290.             if (CurrentUnits == ID_INCHES)
  291.                 {
  292.                 nHorz /= 25.4 ;
  293.                 nVert /= 25.4 ;
  294.                 }
  295.  
  296.             BeginPaint (hWnd, (LPPAINTSTRUCT) &ps) ;
  297.  
  298.             PatBlt (ps.hdc, 0, 0, WindHorzPix, WindVertPix,
  299.                (CurrentColor == ID_WHITE) ? BLACKNESS : WHITENESS) ;
  300.  
  301.             if (CurrentColor == ID_WHITE)
  302.                 {
  303.                 SetTextColor (ps.hdc, RGB (255, 255, 255)) ;
  304.                 SetBkColor (ps.hdc, RGB (0, 0, 0)) ;
  305.                 }
  306.             LoadString (hInst, IDS_FORMAT, (LPSTR) szFormat, 20) ;
  307.             LoadString (hInst, CurrentUnits, (LPSTR) szUnits, 20) ;
  308.  
  309.             rect.bottom = WindVertPix - (rect.top  = CharVertPix) ;
  310.             rect.right  = WindHorzPix - (rect.left = CharHorzPix) ;
  311.  
  312.             DrawText (ps.hdc, (LPSTR) szBuffer,
  313.                 sprintf(szBuffer,szFormat,nHorz,szUnits,nVert,szUnits),
  314.                 (LPRECT) &rect, DT_CENTER | DT_WORDBREAK) ;
  315.  
  316.             EndPaint (hWnd, (LPPAINTSTRUCT) &ps) ;
  317.             }
  318.             break;
  319.  
  320.         case WM_SYSCOMMAND:
  321.             switch (wParam)
  322.                 {
  323.                 case IDM_ABOUT:
  324.                     DialogBox(hInst,(LPSTR)"AboutBox",hWnd,lpAbout);
  325.                     break;
  326.  
  327.                 default:
  328.                     return DefWindowProc(hWnd,message,wParam,lParam);
  329.                 }
  330.             break;
  331.  
  332.         case WM_COMMAND :
  333.             switch (wParam)
  334.                 {
  335.                 case ID_BLACK:
  336.                 case ID_WHITE:
  337.                     hMenu = GetMenu (hWnd) ;
  338.                     CheckMenuItem(hMenu,CurrentColor,MF_UNCHECKED);
  339.                     CheckMenuItem (hMenu, CurrentColor = wParam, 
  340.                          MF_CHECKED) ;
  341.                     InvalidateRect (hWnd, (LPRECT) NULL, TRUE) ;
  342.                     break ;
  343.  
  344.                 case IDM_UNITS:
  345.                     if (DialogBox (hInst, (LPSTR) "UnitsBox", hWnd, 
  346.                               lpUnits))
  347.                          InvalidateRect (hWnd, (LPRECT) NULL, TRUE) ;
  348.                     break ;
  349.  
  350.                 default :
  351.                     return DefWindowProc (hWnd, message, wParam, lParam) ;
  352.                 }
  353.             break ;
  354.  
  355.         case WM_DESTROY:
  356.             PostQuitMessage (0) ;
  357.             break;
  358.  
  359.         default:
  360.             return DefWindowProc (hWnd, message, wParam, lParam) ;
  361.             break;
  362.         }
  363.     return (0L) ;
  364.     }
  365. ==============================================================================
  366.  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373. ==============================================================================
  374. ==============================================================================
  375.  
  376. Figure 8: AboutWndProc Procedure for WSZ
  377. ==============================================================================
  378.  
  379. BOOL FAR PASCAL AboutWndProc (hDlg, message, wParam, lParam)
  380.     HWND     hDlg ;
  381.     unsigned message ;
  382.     WORD     wParam ;
  383.     LONG     lParam ;
  384.     {
  385.     switch (message)
  386.         {
  387.         case WM_INITDIALOG :
  388.             return TRUE ;
  389.  
  390.         case WM_COMMAND :
  391.             EndDialog (hDlg, TRUE) ;
  392.             return TRUE ;
  393.  
  394.         default:
  395.             return FALSE ;
  396.         }
  397.     }
  398. ==============================================================================
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406. ==============================================================================
  407. ==============================================================================
  408.  
  409. Figure 9: UnitsWndProc Procedure for WSZ
  410. ==============================================================================
  411.  
  412. BOOL FAR PASCAL UnitsWndProc (hDlg, message, wParam, lParam)
  413.     HWND       hDlg ;
  414.     unsigned   message ;
  415.     WORD       wParam ;
  416.     LONG       lParam ;
  417.     {
  418.     static int NewUnits ;
  419.  
  420.     switch (message)
  421.         {
  422.         case WM_INITDIALOG :
  423.             CheckRadioButton (hDlg,ID_PIXELS,ID_INCHES,CurrentUnits);
  424.             SetFocus (GetDlgItem (hDlg, NewUnits = CurrentUnits)) ;
  425.             return FALSE ;
  426.  
  427.         case WM_COMMAND :
  428.             switch (wParam)
  429.                 {
  430.                 case ID_MILLIM:
  431.                 case ID_INCHES:
  432.                 case ID_PIXELS:
  433.                     NewUnits = wParam ;
  434.                     CheckRadioButton (hDlg,ID_PIXELS,ID_INCHES,NewUnits);
  435.                     break ;
  436.  
  437.                 case IDOK:
  438.                     CurrentUnits = NewUnits ;
  439.                     EndDialog (hDlg, TRUE) ;
  440.                     break ;
  441.  
  442.                 case IDCANCEL:
  443.                     EndDialog (hDlg, FALSE) ;
  444.                     break ;
  445.  
  446.                 default:
  447.                     return FALSE ;
  448.                 }
  449.             break ;
  450.  
  451.         default:
  452.             return FALSE ;
  453.         }
  454.     return TRUE ;
  455.     }
  456. ==============================================================================
  457.  
  458.  
  459.  
  460.  
  461.  
  462.  
  463. ==============================================================================
  464. ==============================================================================
  465.  
  466. Figure 10: WSZ.DEF Definition File
  467. ==============================================================================
  468.  
  469. NAME    WhatSize
  470.  
  471. DESCRIPTION 'A Windows Application'
  472.  
  473. STUB    'WINSTUB.EXE'
  474.  
  475. CODE    MOVEABLE
  476. DATA    MOVEABLE MULTIPLE
  477.  
  478. HEAPSIZE  1024
  479. STACKSIZE 4096
  480.  
  481. EXPORTS
  482.         MainWndProc     @1
  483.         AboutWndProc    @2
  484.         UnitsWndProc    @3
  485. ==============================================================================
  486.  
  487.  
  488.  
  489.  
  490. ==============================================================================
  491. ==============================================================================
  492.  
  493. Figure 11: Make-File for WSZ
  494. ==============================================================================
  495. wsz.res: wsz.rc wsz.ico wsz.h
  496.     rc -r wsz.rc
  497.  
  498. wsz.obj: wsz.c wsz.h
  499.     cl -d -c -W2 -AS -Gs -Gw -Oas -Zpd -FPa wsz.c
  500.  
  501. wsz.exe: wsz.obj wsz.res wsz.def
  502.     link4 wsz, wsz/align:16, wsz/map, slibw, wsz.def
  503.     mapsym wsz
  504.     rc wsz.res
  505. ==============================================================================
  506.