home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progc / c_all592.arj / TI869.ASC < prev    next >
Text File  |  1992-04-14  |  5KB  |  199 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.   PRODUCT  :  Borland C++                            NUMBER  :  869
  9.   VERSION  :  All
  10.        OS  :  WIN
  11.      DATE  :  April 14, 1992                           PAGE  :  1/3
  12.  
  13.     TITLE  :  How To Center A Dialog Box On Its Parent Window
  14.  
  15.  
  16.  
  17.  
  18.   It is often necessary to center a dialog box on top of its parent
  19.   window for aesthetic reasons.  Who would one do this?  Simple,
  20.   use the function provided below when the dialog box that needs
  21.   centering receives a WM_INITDIALOG message.
  22.  
  23.   Below is a sample dialog box procedure that shows the use of the
  24.   function UICenterDialog as well as the source for UICenterDialog
  25.   itself.
  26.  
  27.   Note:  If the dialog box would not be 100% visible by centering
  28.   it on top of its parent window, this code then centers it on the
  29.   Windows desktop.  If this behavior is not necessary simply remove
  30.   the last if statement.
  31.  
  32.   // CNTRDLG.C
  33.   // Copyright (C) 1992 Borland Internationa, Inc.
  34.   // All Rights Reserved
  35.  
  36.   // Function to show the use of UICenterDialog
  37.   //...............................................................
  38.  
  39.   BOOL FAR PASCAL MyDialogProc(HWND hDlg, WORD msg, WORD wParam,
  40.        LONG lParam)
  41.   {
  42.        switch(msg)
  43.        {
  44.             case WM_INITDIALOG:
  45.                  UICenterDialog(hDlg);
  46.                  break;
  47.  
  48.             default:
  49.                  return TRUE;
  50.        }
  51.        return FALSE;
  52.   }
  53.  
  54.   // Source for the UICenterDialog function
  55.   //...............................................................
  56.  
  57.   void UICenterDialog(HWND hDlg)
  58.   {
  59.        int       cxWin,         // Delta X for parent window
  60.                  cyWin,         // Delta Y for parent window
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.   PRODUCT  :  Borland C++                            NUMBER  :  869
  75.   VERSION  :  All
  76.        OS  :  WIN
  77.      DATE  :  April 14, 1992                           PAGE  :  2/3
  78.  
  79.     TITLE  :  How To Center A Dialog Box On Its Parent Window
  80.  
  81.  
  82.  
  83.  
  84.                  xDlg,          // New X coordinate for dialog box
  85.                  yDlg,          // New Y coordinate for dialog box
  86.                  cxDlg,         // Delta X for dialog box
  87.                  cyDlg,         // Delta Y for dialog box
  88.                  cxScreen,      // Delta X for screen
  89.                  cyScreen;      // Delta Y for screen
  90.        RECT      rcDlg,         // Rectangle for dialog box
  91.                  rcPrnt;        // Rectangle for parent window
  92.        HWND      hWndParent;    // Handle the parent window
  93.  
  94.        // Determine the width and height of the screen.
  95.        cxScreen = GetSystemMetrics(SM_CXSCREEN);
  96.        cyScreen = GetSystemMetrics(SM_CYSCREEN);
  97.  
  98.        // Determine rectangle for parent window of dialog box.
  99.        hWndParent = GetWindowWord(hDlg, GWW_HWNDPARENT);
  100.        if(IsWindow(hWndParent))
  101.        {
  102.             // Use parent coordinates (rect) to determine where the
  103.             // dialog needs to be on the Windows desktop
  104.             GetWindowRect(hWndParent, &rcPrnt);
  105.             cxWin = rcPrnt.right - rcPrnt.left;
  106.             cyWin = rcPrnt.bottom - rcPrnt.top;
  107.        }
  108.        else
  109.        {
  110.             // We were unable to determine who the parent is,
  111.             // therefore centering the dialog is pointless!  Place
  112.             // it in the upper left corner of the Windows desktop.
  113.             cxWin = 0;     // Force the centering calculation to
  114.             cyWin = 0;     // think that the dialog is centered on
  115.                            // the Windows desktop
  116.        }
  117.  
  118.        // Determine rectangle for dialog box itself.
  119.        GetWindowRect(hDlg, &rcDlg);
  120.        cxDlg = rcDlg.right - rcDlg.left;
  121.        cyDlg = rcDlg.bottom - rcDlg.top;
  122.  
  123.        // Determine new dialog X and Y coordinate
  124.        xDlg = (cxWin - cxDlg) / 2;
  125.        xDlg += rcPrnt.left;
  126.        yDlg = (cyWin - cyDlg) / 2;
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.   PRODUCT  :  Borland C++                            NUMBER  :  869
  141.   VERSION  :  All
  142.        OS  :  WIN
  143.      DATE  :  April 14, 1992                           PAGE  :  3/3
  144.  
  145.     TITLE  :  How To Center A Dialog Box On Its Parent Window
  146.  
  147.  
  148.  
  149.  
  150.        yDlg += rcPrnt.top;
  151.  
  152.        // Center the dialog using new coordinates
  153.        if ((xDlg < 0) || (yDlg < 0) || (xDlg+cxDlg > cxScreen) ||
  154.             (yDlg+cyDlg > cyScreen))
  155.        {
  156.             // If by centering the dialog on top of its parent it
  157.             // would not be 100% visible, then center it on the
  158.             // Windows desktop instead.
  159.             xDlg = (cxScreen - cxDlg) / 2;
  160.             yDlg = (cyScreen - cyDlg) / 2;
  161.        }
  162.  
  163.        // Move the dialog box to its new home on the desktop
  164.        MoveWindow(hDlg, xDlg, yDlg, cxDlg, cyDlg, TRUE);
  165.   }
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198.  
  199.