Mmhelp.c
上传用户:wqn_0827
上传日期:2007-01-04
资源大小:10k
文件大小:3k
源码类别:

多显示器编程

开发平台:

Visual C++

  1. /*----------------------------------------------------------------------------*
  2. |   MMHELP.C - routines to help a app be multimonitor aware
  3. *----------------------------------------------------------------------------*/
  4. #include <windows.h>
  5. #include <windowsx.h>
  6. #include "multimon.h"
  7. //
  8. //  GetMonitorRect
  9. //
  10. //  gets the "screen" or work area of the monitor that the passed
  11. //  window is on.  this is used for apps that want to clip or
  12. //  center windows.
  13. //
  14. //  the most common problem apps have with multimonitor systems is
  15. //  when they use GetSystemMetrics(SM_C?SCREEN) to center or clip a
  16. //  window to keep it on screen.  If you do this on a multimonitor
  17. //  system the window we be restricted to the primary monitor.
  18. //
  19. //  this is a example of how you used the new Win32 multimonitor APIs
  20. //  to do the same thing.
  21. //
  22. void GetMonitorRect(HWND hwnd, LPRECT prc, BOOL fWork)
  23. {
  24.     MONITORINFO mi;
  25.     mi.cbSize = sizeof(mi);
  26.     GetMonitorInfo(MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST), &mi);
  27.     if (fWork)
  28.         *prc = mi.rcWork;
  29.     else
  30.         *prc = mi.rcMonitor;
  31. }
  32. //
  33. // ClipRectToMonitor
  34. //
  35. // uses GetMonitorRect to clip a rect to the monitor that
  36. // the passed window is on.
  37. //
  38. void ClipRectToMonitor(HWND hwnd, RECT *prc, BOOL fWork)
  39. {
  40.     RECT rc;
  41.     int  w = prc->right  - prc->left;
  42.     int  h = prc->bottom - prc->top;
  43.     if (hwnd != NULL)
  44.     {
  45.         GetMonitorRect(hwnd, &rc, fWork);
  46.     }
  47.     else
  48.     {
  49.         MONITORINFO mi;
  50.         mi.cbSize = sizeof(mi);
  51.         GetMonitorInfo(MonitorFromRect(prc, MONITOR_DEFAULTTONEAREST), &mi);
  52.         if (fWork)
  53.             rc = mi.rcWork;
  54.         else
  55.             rc = mi.rcMonitor;
  56.     }
  57.     prc->left   = max(rc.left, min(rc.right-w,  prc->left));
  58.     prc->top    = max(rc.top,  min(rc.bottom-h, prc->top));
  59.     prc->right  = prc->left + w;
  60.     prc->bottom = prc->top  + h;
  61. }
  62. //
  63. // CenterRectToMonitor
  64. //
  65. // uses GetMonitorRect to center a rect to the monitor that
  66. // the passed window is on.
  67. //
  68. void CenterRectToMonitor(HWND hwnd, RECT *prc, BOOL fWork)
  69. {
  70.     RECT rc;
  71.     int  w = prc->right  - prc->left;
  72.     int  h = prc->bottom - prc->top;
  73.     GetMonitorRect(hwnd, &rc, fWork);
  74.     prc->left = rc.left + (rc.right  - rc.left - w) / 2;
  75.     prc->top = rc.top  + (rc.bottom - rc.top  - h) / 2;
  76.     prc->right = prc->left + w;
  77.     prc->bottom = prc->top  + h;
  78. }
  79. //
  80. // CenterWindowToMonitor
  81. //
  82. void CenterWindowToMonitor(HWND hwndP, HWND hwnd, BOOL fWork)
  83. {
  84.     RECT rc;
  85.     GetWindowRect(hwnd, &rc);
  86.     CenterRectToMonitor(hwndP, &rc, fWork);
  87.     SetWindowPos(hwnd, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
  88. }
  89. //
  90. // ClipWindowToMonitor
  91. //
  92. void ClipWindowToMonitor(HWND hwndP, HWND hwnd, BOOL fWork)
  93. {
  94.     RECT rc;
  95.     GetWindowRect(hwnd, &rc);
  96.     ClipRectToMonitor(hwndP, &rc, fWork);
  97.     SetWindowPos(hwnd, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
  98. }
  99. //
  100. // IsWindowOnScreen
  101. //
  102. BOOL IsWindowOnScreen(HWND hwnd)
  103. {
  104.     HDC hdc;
  105.     RECT rc;
  106.     BOOL f;
  107.     GetWindowRect(hwnd, &rc);
  108.     hdc = GetDC(NULL);
  109.     f = RectVisible(hdc, &rc);
  110.     ReleaseDC(NULL, hdc);
  111.     return f;
  112. }
  113. //
  114. // MakeSureWindowIsVisible
  115. //
  116. void MakeSureWindowIsVisible(HWND hwnd)
  117. {
  118.     if (!IsWindowOnScreen(hwnd))
  119.     {
  120. ClipWindowToMonitor(hwnd, hwnd, TRUE);
  121.     }
  122. }