home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 / Programming Windows 95.iso / code / CHAP12 / PROPERTY.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-01  |  8.3 KB  |  255 lines

  1. /*--------------------------------------
  2.    PROPERTY.C -- Property sheet example
  3.                  (c) Paul Yao, 1996
  4.   --------------------------------------*/
  5. #include <windows.h>
  6. #include <windowsx.h>
  7. #include <commctrl.h>
  8. #include "comcthlp.h"
  9. #include "property.h"
  10.  
  11. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  12.  
  13. char szAppName[]  = "Property Sheet" ;
  14. HINSTANCE hInst ;
  15. HWND hwndMain = NULL ;
  16. HWND hwndChild = NULL ;
  17. HWND hwndModeless = NULL ;
  18.  
  19. HICON hiconApp ;  // Application icon
  20. BOOL bWizard ;    // Flag whether PSH_WIZARD is set
  21.  
  22. // Values modified by property sheet
  23. DWORD dwChildStyle = WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CAPTION ;
  24. DWORD dwChildExStyle = 0L ;
  25.  
  26. // Value modified by menu item selection
  27. DWORD dwSheetStyles = PSH_PROPTITLE ;
  28.  
  29. //-------------------------------------------------------------------
  30. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
  31.                     PSTR lpszCmdLine, int cmdShow)       
  32.      {
  33.      HWND       hwnd ;
  34.      MSG        msg ;
  35.      WNDCLASSEX wc ;
  36.  
  37.      hInst = hInstance ;
  38.      hiconApp = LoadIcon (hInst, MAKEINTRESOURCE (IDI_APP)) ;
  39.  
  40.      ZeroMemory (&wc, sizeof (WNDCLASSEX)) ;
  41.      wc.cbSize        = sizeof (wc) ;
  42.      wc.lpszClassName = "MAIN" ;
  43.      wc.hInstance     = hInstance ;
  44.      wc.lpfnWndProc   = WndProc ;
  45.      wc.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  46.      wc.hIcon         = hiconApp ;
  47.      wc.lpszMenuName  = "MAIN" ;
  48.      wc.hbrBackground = (HBRUSH) (COLOR_APPWORKSPACE + 1) ;
  49.      wc.hIconSm       = hiconApp ;
  50.  
  51.      RegisterClassEx (&wc) ;
  52.  
  53.      wc.lpszClassName = "CHILD" ;
  54.      wc.lpfnWndProc   = DefWindowProc ;
  55.      wc.hCursor       = LoadCursor (NULL, IDC_IBEAM) ; 
  56.      wc.hIcon         = NULL ;
  57.      wc.lpszMenuName  = NULL ;
  58.      wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1) ;
  59.      wc.hIconSm       = NULL ;
  60.  
  61.      RegisterClassEx (&wc) ;
  62.  
  63.      hwndMain = 
  64.      hwnd = CreateWindowEx (WS_EX_OVERLAPPEDWINDOW, "MAIN", 
  65.                             szAppName, WS_OVERLAPPEDWINDOW, 
  66.                             CW_USEDEFAULT, CW_USEDEFAULT, 
  67.                             CW_USEDEFAULT, CW_USEDEFAULT, 
  68.                             NULL, NULL, hInstance, NULL) ;
  69.                           
  70.      ShowWindow (hwnd, cmdShow) ;
  71.      UpdateWindow (hwnd) ;
  72.  
  73.      InitCommonControls () ;
  74.  
  75.      while (GetMessage (&msg, NULL, 0, 0))
  76.           {
  77.           if ((hwndModeless) &&
  78.               (!(PropSheet_IsDialogMessage (hwndModeless, &msg))))
  79.               continue ;
  80.  
  81.           TranslateMessage (&msg) ; 
  82.           DispatchMessage (&msg) ;  
  83.           }
  84.      return msg.wParam ;
  85.      }
  86.  
  87. //-------------------------------------------------------------------
  88. void MenuCheckMark (HMENU hmenu, int id, BOOL bCheck)
  89.      {
  90.      int iState ;
  91.      iState = (bCheck) ? MF_CHECKED : MF_UNCHECKED ;
  92.      CheckMenuItem (hmenu, id, iState) ;
  93.      }
  94.  
  95. //-------------------------------------------------------------------
  96. void static FlipFlag (LPDWORD dwStyle, DWORD flag)
  97.      {
  98.      if (*dwStyle & flag)  // Flag on -- turn off
  99.           {
  100.           *dwStyle &= (~flag) ;
  101.           }
  102.      else                  // Flag off -- turn on
  103.           {
  104.           *dwStyle |= flag ;
  105.           }
  106.      }
  107.  
  108. //-------------------------------------------------------------------
  109. LRESULT CALLBACK
  110. WndProc (HWND hwnd, UINT mMsg, WPARAM wParam, LPARAM lParam) 
  111.      {
  112.      switch (mMsg)
  113.           {
  114.           case WM_CREATE :
  115.                hwndChild = CreateWindowEx (dwChildExStyle, "CHILD", 
  116.                                            "First Window", dwChildStyle, 
  117.                                            0, 0, 0, 0, hwnd, (HMENU) 1, 
  118.                                            hInst, NULL) ;
  119.                             
  120.  
  121.                CreateWindowEx (dwChildExStyle, "CHILD", "Second Window",
  122.                                WS_CLIPSIBLINGS | dwChildStyle, 
  123.                                10, 10, 200, 50, hwnd,
  124.                                (HMENU) 2, hInst, NULL) ;
  125.                return 0 ;
  126.  
  127.           case WM_COMMAND :
  128.                {
  129.                switch (LOWORD (wParam))
  130.                     {
  131.                     case IDM_WINDOW_PROPERTIES :
  132.                          {
  133.                          BOOL bRet ;
  134.  
  135.                          // If modeless, active existing property sheet
  136.                          if (hwndModeless)
  137.                               {
  138.                               SetActiveWindow (hwndModeless) ;
  139.                               break ;
  140.                               }
  141.  
  142.                          // Are we creating a wizard?
  143.                          bWizard = (dwSheetStyles & PSH_WIZARD) ;
  144.  
  145.                          // Create actual property sheet
  146.                          bRet = CreatePropertySheet (hwnd) ;
  147.                     
  148.                          // Store handle if modeless
  149.                          if (dwSheetStyles & PSH_MODELESS)
  150.                               {
  151.                               hwndModeless = (HWND) bRet ;
  152.                               break ;
  153.                               }
  154.                          break ;
  155.                          }
  156.  
  157.                     case IDM_WIZARD :
  158.                          FlipFlag (&dwSheetStyles, PSH_WIZARD) ;
  159.                          break ;
  160.  
  161.                     case IDM_HASHELP :
  162.                          FlipFlag (&dwSheetStyles, PSH_HASHELP) ;
  163.                          break ;
  164.  
  165.                     case IDM_MODELESS :
  166.                          FlipFlag (&dwSheetStyles, PSH_MODELESS) ;
  167.                          break ;
  168.  
  169.                     case IDM_NOAPPLYNOW :
  170.                          FlipFlag (&dwSheetStyles, PSH_NOAPPLYNOW) ;
  171.                          break ;
  172.  
  173.                     case IDM_PROPTITLE :
  174.                          FlipFlag (&dwSheetStyles, PSH_PROPTITLE) ;
  175.                          break ;
  176.  
  177.                     case IDM_RTLREADING :
  178.                          FlipFlag (&dwSheetStyles, PSH_RTLREADING) ;
  179.                          break ;
  180.                     }
  181.                     return 0 ;
  182.           }
  183.  
  184.           case WM_DESTROY :
  185.                PostQuitMessage (0) ;
  186.                return 0 ;
  187.  
  188.           case WM_INITMENU :
  189.                {
  190.                BOOL bCheck ;
  191.                HMENU hmenu = (HMENU) wParam ;
  192.  
  193.                bCheck = (dwSheetStyles & PSH_WIZARD) ;
  194.                MenuCheckMark (hmenu, IDM_WIZARD, bCheck) ;
  195.  
  196.                bCheck = (dwSheetStyles & PSH_HASHELP) ;
  197.                MenuCheckMark (hmenu, IDM_HASHELP, bCheck) ;
  198.  
  199.                bCheck = (dwSheetStyles & PSH_MODELESS) ;
  200.                MenuCheckMark (hmenu, IDM_MODELESS, bCheck) ;
  201.  
  202.                bCheck = (dwSheetStyles & PSH_NOAPPLYNOW) ;
  203.                MenuCheckMark (hmenu, IDM_NOAPPLYNOW, bCheck) ;
  204.  
  205.                bCheck = (dwSheetStyles & PSH_PROPTITLE) ;
  206.                MenuCheckMark (hmenu, IDM_PROPTITLE, bCheck) ;
  207.  
  208.                bCheck = (dwSheetStyles & PSH_RTLREADING) ;
  209.                MenuCheckMark (hmenu, IDM_RTLREADING, bCheck) ;
  210.  
  211.                return 0 ;
  212.                }
  213.  
  214.           case WM_SETFOCUS :
  215.                SetFocus (hwndChild) ;
  216.                return 0 ;
  217.  
  218.           case WM_SIZE :
  219.                {
  220.                int cxWidth  = LOWORD (lParam) ;
  221.                int cyHeight = HIWORD (lParam) ;
  222.                int x, y, cx, cy ;
  223.  
  224.                x  = cxWidth  / 4 ;
  225.                cx = cxWidth  / 2 ;
  226.                y  = cyHeight / 4 ;
  227.                cy = cyHeight / 2 ;
  228.  
  229.                MoveWindow (hwndChild, x, y, cx, cy, TRUE) ;
  230.                return 0 ;
  231.                }
  232.  
  233.           case PM_CREATEWINDOW :
  234.                {
  235.                RECT rClient ;
  236.                LPARAM l ;
  237.  
  238.                DestroyWindow (hwndChild) ;
  239.                hwndChild = CreateWindowEx (dwChildExStyle, "CHILD", 
  240.                                            "First Window", dwChildStyle, 
  241.                                            0, 0, 0, 0, hwnd, (HMENU) 1, 
  242.                                            hInst, NULL) ;
  243.  
  244.                // Send ourselves a WM_SIZE to resize child window
  245.                GetClientRect (hwnd, &rClient) ;
  246.                l = MAKELPARAM (rClient.right, rClient.bottom) ;
  247.                SendMessage (hwnd, WM_SIZE, 0, l) ;
  248.                return 0 ;
  249.                }
  250.  
  251.           default :
  252.                return (DefWindowProc (hwnd, mMsg, wParam, lParam)) ;
  253.           }
  254.      }
  255.