main.cpp
上传用户:dfhlxjd
上传日期:2007-01-07
资源大小:12k
文件大小:4k
源码类别:

Shell编程

开发平台:

Visual C++

  1. //----------------------------------------
  2. // (c) Reliable Software 1997
  3. //----------------------------------------
  4. #include <new.h>
  5. #include "main.h"
  6. #include "resource.h"
  7. #include "controller.h"
  8. int NewHandler (size_t size)
  9. {
  10.     throw WinException ( "Out of memory" );
  11.     return 0;
  12. }
  13. static void ErrorBox(char const *message, char const *caption);
  14. static BOOL SetWindowIcons(HWND hwnd, UINT resourceID);
  15. BOOL CALLBACK DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  16. {
  17.     static Controller* control = 0;
  18.     switch (message)
  19.     {
  20.     case WM_INITDIALOG:
  21.         try
  22.         {
  23.             control = new Controller (hwnd);
  24.         }
  25.         catch (WinException e)
  26.         {
  27.             ErrorBox (e.GetMessage (), "Exception");
  28.         }
  29.         catch (...)
  30.         {
  31.             ErrorBox ("Unknown", "Exception");
  32.             return -1;
  33.         }
  34. if (!SetWindowIcons(hwnd, TREESIZER_ICON))
  35. ErrorBox("LoadIcons failed.","May be a problem");
  36. CenterWindow(hwnd);
  37.         return TRUE;
  38.     case WM_COMMAND:
  39.         control->Command(hwnd, LOWORD(wParam), HIWORD (wParam));
  40.         return TRUE;
  41.     case WM_DESTROY:
  42.         PostQuitMessage(0);
  43.         return TRUE;
  44.     case WM_CLOSE:
  45.         delete control;
  46.         DestroyWindow (hwnd);
  47.         return TRUE;
  48.     }
  49.     return FALSE;
  50. }
  51. int WINAPI WinMain
  52.    (HINSTANCE hInst, HINSTANCE hPrevInst, char * cmdParam, int cmdShow)
  53. {
  54.     _set_new_handler (&NewHandler);
  55.     HWND hDialog = CreateDialog (hInst, MAKEINTRESOURCE (DIALOG_MAIN), 0, (DLGPROC)DialogProc);
  56.     if (!hDialog)
  57.     {
  58.         char buf [100];
  59.         wsprintf (buf, "Error x%x", GetLastError ());
  60.         ErrorBox (buf, "CreateDialog");
  61.         return 1;
  62.     }
  63.     MSG  msg;
  64.     int status;
  65.     while ((status = GetMessage (&msg, 0, 0, 0)) != 0)
  66.     {
  67.         if (status == -1)
  68.             return -1;
  69.         if (!IsDialogMessage (hDialog, &msg))
  70.         {
  71.             TranslateMessage ( &msg );
  72.             DispatchMessage ( &msg );
  73.         }
  74.     }
  75.     return msg.wParam;
  76. }
  77. HINSTANCE
  78. GetHinstance (HWND hwnd)
  79. {
  80. return ((HINSTANCE) ::GetWindowLong(hwnd, GWL_HINSTANCE));
  81. }
  82. void
  83. CenterWindow(HWND hwnd)
  84. {
  85.     // Center the window on the desktop if it has no parent
  86.     HWND hwndOwner = GetParent(hwnd);
  87.     if (hwndOwner == NULL) 
  88.         hwndOwner = GetDesktopWindow(); 
  89.     RECT ownerBounds;
  90.     GetWindowRect(hwndOwner, &ownerBounds); 
  91.     // Place the dialog at 0,0
  92.     RECT dialogBounds;
  93.     GetWindowRect(hwnd, &dialogBounds);
  94.     OffsetRect(&dialogBounds, -dialogBounds.left, -dialogBounds.top);
  95.     // set the dialog position centered
  96.     int diffWidth   = ownerBounds.right - ownerBounds.left - dialogBounds.right;
  97.     int diffHeight  = ownerBounds.bottom - ownerBounds.top - dialogBounds.bottom;
  98.     OffsetRect(&dialogBounds, ownerBounds.left + diffWidth/2, ownerBounds.top + diffHeight/2);
  99.     SetWindowPos(hwnd, 
  100.         HWND_TOP, 
  101.         dialogBounds.left,
  102.         dialogBounds.top,
  103.         0, 0,
  104.         SWP_NOSIZE); 
  105. }
  106. static BOOL
  107. SetWindowIcons(HWND hwnd, UINT resourceID)
  108. {
  109. HINSTANCE hInst = GetHinstance(hwnd);
  110.     HICON hIcon = LoadIcon (hInst, MAKEINTRESOURCE (resourceID));
  111.     HICON hIconSm = (HICON)LoadImage (
  112.         hInst,
  113.         MAKEINTRESOURCE (resourceID),
  114.         IMAGE_ICON,
  115.         GetSystemMetrics (SM_CXSMICON),
  116.         GetSystemMetrics (SM_CYSMICON),
  117.         LR_SHARED);
  118. if (hIcon && hIconSm)
  119. {
  120.     // Attach the icons
  121.     SendMessage (hwnd, WM_SETICON, WPARAM (TRUE), LPARAM (hIcon));
  122.     SendMessage (hwnd, WM_SETICON, WPARAM (FALSE), LPARAM (hIcon));
  123. return TRUE;
  124. }
  125. else
  126. return FALSE;
  127. }
  128. static void ErrorBox(char const *message, char const *caption)
  129. {
  130. ::MessageBox (0,message, caption, MB_ICONEXCLAMATION | MB_OK);
  131. }