RTTools.cpp
上传用户:qhonly
上传日期:2013-06-10
资源大小:487k
文件大小:4k
源码类别:

界面编程

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Tools.cpp : implementation file
  4. //
  5. ///////////////////////////////////////////////////////////////////////////////
  6. #include "stdafx.h"
  7. #include "RTTools.h"
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. ///////////////////////////////////////////////////////////////////////////////
  14. // Check if the specified window is child of a docked toolbar
  15. bool ChildOfDockedToolbar (CWnd* pWnd)
  16. {
  17.     CWnd* pParent = pWnd->GetParent();
  18.     
  19.     return pParent->IsKindOf (RUNTIME_CLASS(CControlBar)) &&
  20.            ((CControlBar*)pParent)->m_pDockBar != NULL;
  21. }
  22. ///////////////////////////////////////////////////////////////////////////////
  23. // Return the current system version
  24. //
  25. WinVer WINAPI GetWinVersion ()
  26. {
  27.     static WinVer s_wvVal = wvUndefined;
  28.     if ( s_wvVal != wvUndefined )
  29.     {
  30.         return s_wvVal;
  31.     }
  32.     OSVERSIONINFO osvi;
  33.     ZeroMemory (&osvi, sizeof OSVERSIONINFO);
  34.     osvi.dwOSVersionInfoSize = sizeof OSVERSIONINFO;
  35.     if ( !GetVersionEx (&osvi) )
  36.     {
  37.         return s_wvVal = wvUndefined;
  38.     }
  39.     if ( osvi.dwPlatformId == VER_PLATFORM_WIN32s )
  40.     {
  41.         return s_wvVal = wvWin32s;
  42.     }
  43.     if ( osvi.dwPlatformId == VER_PLATFORM_WIN32_NT )
  44.     {
  45.         if ( osvi.dwMajorVersion == 4L )
  46.         {
  47.             return s_wvVal = wvWinNT4;
  48.         }
  49.         if ( osvi.dwMajorVersion == 5L && osvi.dwMinorVersion == 0L )
  50.         {
  51.             return s_wvVal = wvWin2000;
  52.         }
  53.         if ( osvi.dwMajorVersion == 5L && osvi.dwMinorVersion == 1L )
  54.         {
  55.             return s_wvVal = wvWinXP;
  56.         }
  57.         return s_wvVal = wvWinNT3;
  58.     }
  59.     ASSERT(osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
  60.     if ( osvi.dwMajorVersion == 4L && osvi.dwMinorVersion == 10L )
  61.     {
  62.         return s_wvVal = wvWin98;
  63.     }
  64.     if ( osvi.dwMajorVersion == 4L && osvi.dwMinorVersion == 90L )
  65.     {
  66.         return s_wvVal = wvWinME;
  67.     }
  68.     return s_wvVal = wvWin95;
  69. }
  70. ///////////////////////////////////////////////////////////////////////////////
  71. ///////////////////////////////////////////////////////////////////////////////
  72. CMouseMgr::CMouseMgr () : m_bOver (false)
  73. {
  74. }
  75. ///////////////////////////////////////////////////////////////////////////////
  76. void CMouseMgr::Init (HWND hWnd, WORD wFlags)
  77. {
  78.     m_hWnd = hWnd;
  79.     m_wFlags = wFlags;
  80. }
  81. ///////////////////////////////////////////////////////////////////////////////
  82. bool CMouseMgr::MouseOver () const
  83. {
  84.     return m_bOver;
  85. }
  86. extern "C" WINUSERAPI BOOL WINAPI TrackMouseEvent (LPTRACKMOUSEEVENT lpEventTrack);
  87. ///////////////////////////////////////////////////////////////////////////////
  88. bool CMouseMgr::OnMouseMove (HWND hTrack)
  89. {
  90.     ASSERT(m_hWnd != NULL);
  91.     if ( hTrack == NULL ) hTrack = m_hWnd;
  92.     if ( !m_bOver )
  93.     {
  94.         m_bOver = true;
  95.         if ( m_wFlags & MMS_PAINT )
  96.         {
  97.             ::InvalidateRect (m_hWnd, NULL, false);
  98.         }
  99.         if ( m_wFlags & MMS_NCPAINT )
  100.         {
  101.             ::SetWindowPos (m_hWnd, NULL, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
  102.         }
  103.         // Prepare for tracking MouseOut
  104.         TRACKMOUSEEVENT tme = { sizeof TRACKMOUSEEVENT, TME_LEAVE, m_hTrack = hTrack, 0 };
  105.         ::TrackMouseEvent (&tme);
  106.         return true;
  107.     }
  108.     if ( hTrack != m_hTrack )
  109.     {
  110.         // Cancel tracking MouseOut for the previous window (main or child)
  111.         TRACKMOUSEEVENT tme = { sizeof TRACKMOUSEEVENT, TME_CANCEL, m_hTrack, 0 };
  112.         ::TrackMouseEvent (&tme);
  113.         // Track MouseOut
  114.         tme.dwFlags = TME_LEAVE;
  115.         tme.hwndTrack = m_hTrack = hTrack;
  116.         ::TrackMouseEvent (&tme);
  117.     }
  118.     return false;
  119. }
  120. ///////////////////////////////////////////////////////////////////////////////
  121. bool CMouseMgr::OnMouseOut (HWND hTrack)
  122. {
  123.     ASSERT(m_hWnd != NULL);
  124.     if ( hTrack == NULL ) hTrack = m_hWnd;
  125.     if ( hTrack != m_hTrack )
  126.     {
  127.         return false;
  128.     }
  129.     m_bOver = false;
  130.     if ( m_wFlags & MMS_PAINT )
  131.     {
  132.         ::InvalidateRect (m_hWnd, NULL, false);
  133.     }
  134.     if ( m_wFlags & MMS_NCPAINT )
  135.     {
  136.         ::SetWindowPos (m_hWnd, NULL, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_FRAMECHANGED);
  137.     }
  138.     return true;
  139. }