PPTooltip.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:100k
源码类别:

CA认证

开发平台:

Visual C++

  1. //
  2. //--- History ------------------------------ 
  3. // 2004/03/01 *** Releases version 2.0 ***
  4. //------------------------------------------
  5. // 2004/04/04 [ADD] Added method SetCssStyles(DWORD dwIdCssStyle, LPCTSTR lpszPathDll /* = NULL */)
  6. // 2004/04/14 [FIX] Fixed correct drawing for some tooltip's directions
  7. // 2004/04/15 [FIX] Fixed changing a z-order of the some windows by show a tooltip on Win9x
  8. // 2004/04/27 [FIX] Corrected a work with a tooltip's directions with a large tooltip
  9. // 2004/04/28 [ADD] Disables a message translation if object was't created (thanks to Stoil Todorov)
  10. // 2004/07/02 [UPD] Changes a GetWndFromPoint mechanism of the window's searching
  11. // 2004/09/01 [ADD] New SetMaxTipWidth method was added
  12. // 2004/10/12 [FIX] Now a tooltip has a different methods to show a menu's tooltip and other 
  13. // control's tooltip
  14. ////////////////////////////////////////////////////////////////////
  15. //
  16. // "SmoothMaskImage" and "GetPartialSums" functions by Denis Sarazhinsky (c)2003
  17. // Modified by Eugene Pustovoyt to use with image's mask instead of full color image.
  18. //
  19. /////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "PPTooltip.h"
  22. // allow multi-monitor-aware code on Win95 systems
  23. // comment out the first line if you already define it in another file
  24. // comment out both lines if you don't care about Win95
  25. #define COMPILE_MULTIMON_STUBS
  26. //#include "multimon.h" //hpxs add 存在此行就会出现连接错误 多显示器编程的支持文件
  27. //nafxcwd.lib(wincore.obj) : error LNK2005: _g_fMultiMonInitDone already defined in PPTooltip.obj
  28. #ifdef _DEBUG
  29. #define new DEBUG_NEW
  30. #undef THIS_FILE
  31. static char THIS_FILE[] = __FILE__;
  32. #endif
  33. #define TIMER_HIDE 0x101 //the identifier of the timer for hide the tooltip
  34. #define TIMER_SHOWING 0x102 //the identifier of the timer for tooltip's fade in
  35. #define TIMER_SHOW 0x100 //the identifier of the timer for show the tooltip
  36. #define TIMER_HIDING 0x103 //the identifier of the timer for tooltip's fade out
  37. #define TIMER_ANIMATION 0x104 //the identifier of the timer for animation
  38. #define PERCENT_STEP_FADEIN 20 //How mush percent will adding during fade in
  39. #define PERCENT_STEP_FADEOUT 20 //How mush percent will adding during fade out
  40. #define PERCENT_MAX_TRANSPARENCY 100 //How mush percent by maximum transparency
  41. #define PERCENT_MIN_TRANSPARENCY 0 //How mush percent by minimum transparency
  42. #define MAX_LENGTH_DEBUG_STRING 25 //
  43. /*
  44. struct PPTOOLTIP_ENUM_CHILD 
  45. {
  46. HWND hwndExclude;
  47. HWND hWnd;
  48. POINT ptScreen;
  49. DWORD dwFlags;
  50. };
  51. BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam) 
  52. PPTOOLTIP_ENUM_CHILD * structEnum = (PPTOOLTIP_ENUM_CHILD*)lParam;
  53. if (hwndChild != structEnum->hwndExclude)
  54. {
  55. DWORD dwStyle = ::GetWindowLong(hwndChild, GWL_STYLE);
  56. if (!(dwStyle & WS_VISIBLE))
  57. return TRUE;
  58. if (structEnum->dwFlags & CWP_SKIPDISABLED)
  59. {
  60. if (dwStyle & WS_DISABLED)
  61. return TRUE;
  62. }
  63. if ((dwStyle & 0xF) != BS_GROUPBOX)
  64. {
  65. RECT rcWindow;// = wi.rcWindow;
  66. ::GetWindowRect(hwndChild, &rcWindow);
  67. if ((rcWindow.left <= structEnum->ptScreen.x) &&
  68. (rcWindow.right > structEnum->ptScreen.x) &&
  69. (rcWindow.top <= structEnum->ptScreen.y) &&
  70. (rcWindow.bottom > structEnum->ptScreen.y))
  71. {
  72. structEnum->hWnd = hwndChild;
  73. return FALSE;
  74. } //if 
  75. } //if
  76. } //if
  77. return TRUE;
  78. } //End EnumChildProc
  79. */
  80. //////////////////
  81. // Note that windows are enumerated in top-down Z-order, so the menu
  82. // window should always be the first one found.
  83. //
  84. static BOOL CALLBACK MyEnumProc(HWND hwnd, LPARAM lParam)
  85. {
  86. TCHAR buf[16];
  87. GetClassName(hwnd, buf, sizeof(buf) / sizeof(TCHAR));
  88. if (_tcscmp(buf, _T("#32768")) == 0)  // special classname for menus
  89. {
  90. *((HWND*)lParam) = hwnd;  // found it
  91. return FALSE;
  92. }
  93. return TRUE;
  94. }
  95. /////////////////////////////////////////////////////////////////////////////
  96. // CPPToolTip
  97. CPPToolTip::CPPToolTip()
  98. {
  99. // Default values
  100. m_dwTimeAutoPop = 5000;
  101. m_dwTimeInitial = 500;
  102. m_dwTimeFadeIn = 500;
  103. m_dwTimeFadeOut = 500;
  104. m_dwBehaviour = 0; //PPTOOLTIP_CLOSE_LEAVEWND | PPTOOLTIP_NOCLOSE_OVER;  //The tooltip's behaviour
  105. m_dwEffectBk = 0;
  106. m_dwDirection = 0;
  107. m_dwStyles = 0;
  108. m_nGranularity = 0;
  109. m_nTransparency = 0;
  110. m_bDelayNextTool = FALSE;
  111. m_dwShowEffect = SHOWEFFECT_FADEINOUT;
  112. m_dwHideEffect = SHOWEFFECT_FADEINOUT;
  113. m_nTooltipState = PPTOOLTIP_STATE_HIDEN;
  114. m_nTooltipType = PPTOOLTIP_NORMAL;
  115. m_nNextTooltipType = PPTOOLTIP_NORMAL;
  116. m_ptOriginal.x = m_ptOriginal.y = 0;
  117. m_rcCurTool.SetRectEmpty();
  118. m_hwndDisplayedTool = NULL;
  119. m_hBitmapBk = NULL;
  120. m_hUnderTooltipBk = NULL;
  121. m_hbrBorder = NULL;
  122. m_hrgnTooltip = NULL;
  123. SetColorBk(::GetSysColor(COLOR_INFOBK));
  124. SetBorder(::GetSysColor(COLOR_INFOTEXT));
  125. EnableHyperlink();
  126. SetNotify(FALSE);
  127. SetDefaultSizes();
  128. SetDirection();
  129. SetBehaviour();
  130. SetDebugMode(FALSE);
  131. SetMaxTipWidth(0);
  132. // EnableTextWrap(FALSE);
  133. SetDelayTime(PPTOOLTIP_TIME_INITIAL, 500);
  134. SetDelayTime(PPTOOLTIP_TIME_AUTOPOP, 5000);
  135. SetDelayTime(PPTOOLTIP_TIME_FADEIN, 0);
  136. SetDelayTime(PPTOOLTIP_TIME_FADEOUT, 0);
  137. SetTooltipShadow(6, 6);
  138. #ifdef PPTOOLTIP_USE_MENU
  139. MenuToolPosition();
  140. #endif //PPTOOLTIP_USE_MENU
  141. // Register the window class if it has not already been registered.
  142. WNDCLASS wndcls;
  143. HINSTANCE hInst = AfxGetInstanceHandle();
  144. if(!(::GetClassInfo(hInst, PPTOOLTIP_CLASSNAME, &wndcls)))
  145. {
  146. // otherwise we need to register a new class
  147. wndcls.style = CS_SAVEBITS;
  148. wndcls.lpfnWndProc = ::DefWindowProc;
  149. wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
  150. wndcls.hInstance = hInst;
  151. wndcls.hIcon = NULL;
  152. wndcls.hCursor = LoadCursor(hInst, IDC_ARROW);
  153. wndcls.hbrBackground = NULL;
  154. wndcls.lpszMenuName = NULL;
  155. wndcls.lpszClassName = PPTOOLTIP_CLASSNAME;
  156. if (!AfxRegisterClass(&wndcls))
  157. AfxThrowResourceException();
  158. } //if
  159. }
  160. CPPToolTip::~CPPToolTip()
  161. {
  162. FreeResources();
  163. RemoveAllTools();
  164. HideBorder();
  165. }
  166. BEGIN_MESSAGE_MAP(CPPToolTip, CWnd)
  167. //{{AFX_MSG_MAP(CPPToolTip)
  168. ON_WM_PAINT()
  169. ON_WM_TIMER()
  170. ON_WM_SETCURSOR()
  171. ON_WM_ACTIVATEAPP()
  172. //}}AFX_MSG_MAP
  173. ON_MESSAGE(UDM_TOOLTIP_REPAINT, OnRepaintWindow)
  174. END_MESSAGE_MAP()
  175. /////////////////////////////////////////////////////////////////////////////
  176. // CPPToolTip message handlers
  177. BOOL CPPToolTip::Create(CWnd* pParentWnd, BOOL bBalloon /* = TRUE */) 
  178. {
  179. TRACE(_T("CPPToolTip::Createn"));
  180. ASSERT_VALID(pParentWnd);
  181. DWORD dwStyle = WS_POPUP; 
  182. DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
  183. m_hParentWnd = pParentWnd->GetSafeHwnd();
  184. if (!CreateEx(dwExStyle, PPTOOLTIP_CLASSNAME, NULL, dwStyle, 0, 0, 0, 0, pParentWnd->GetSafeHwnd(), NULL, NULL))
  185. return FALSE;
  186. //
  187. SetDefaultSizes(bBalloon);
  188. m_drawer.SetCallbackRepaint(this->GetSafeHwnd(), UDM_TOOLTIP_REPAINT);
  189. SetDelayTime(PPTOOLTIP_TIME_ANIMATION, 100);
  190. return TRUE;
  191. } //End of Create
  192. BOOL CPPToolTip::DestroyWindow() 
  193. {
  194. Pop();
  195. SetDelayTime(PPTOOLTIP_TIME_ANIMATION, 0);
  196. return CWnd::DestroyWindow();
  197. } //End of DestroyWindow
  198. /////////////////////////////////////////////////////////////////////
  199. // A tooltip with PPTOOLTIP_DISABLE_AUTOPOP behaviour don't hide on 
  200. // change active application
  201. //-------------------------------------------------------------------
  202. // Fixed by vanhoopy (July 10, 2003)
  203. /////////////////////////////////////////////////////////////////////
  204. #if _MSC_VER < 1300
  205. void CPPToolTip::OnActivateApp(BOOL bActive, HTASK hTask)
  206. #else
  207. void CPPToolTip::OnActivateApp(BOOL bActive, DWORD hTask)
  208. #endif //_MSC_VER
  209. {
  210. CWnd::OnActivateApp(bActive, hTask);
  211. if (!bActive) 
  212. Pop();
  213. } //End of the WM_ACTIVATEAPP handler
  214. LRESULT CPPToolTip::SendNotify(LPPOINT pt, PPTOOLTIP_INFO & ti) 
  215. TRACE(_T("CPPToolTip::SendNotify()n")); 
  216. // Make sure this is a valid window  
  217. if (!IsWindow(GetSafeHwnd())) 
  218. return 0L; 
  219. // See if the user wants to be notified  
  220. if (!IsNotify()) 
  221. return 0L; 
  222. NM_PPTOOLTIP_DISPLAY lpnm; 
  223. lpnm.hwndTool = m_hwndNextTool;
  224. lpnm.pt = pt;  
  225. lpnm.ti = &ti; 
  226. lpnm.hdr.hwndFrom = m_hWnd; 
  227. lpnm.hdr.idFrom   = GetDlgCtrlID(); 
  228. lpnm.hdr.code     = UDM_TOOLTIP_DISPLAY; 
  229. ::SendMessage(m_hNotifyWnd, WM_NOTIFY, lpnm.hdr.idFrom, (LPARAM)&lpnm);  
  230. return 0L;
  231. } //End of SendNotify
  232. /////////////////////////////////////////////////////////////////////
  233. // CPPToolTip::IsNotify()
  234. // This function determines will be send the notification messages from 
  235. // the control or not before display.
  236. //-------------------------------------------------------------------
  237. // Return value:
  238. // TRUE if the control will be notified the specified window
  239. ///////////////////////////////////////////////////////////////////////
  240. BOOL CPPToolTip::IsNotify()
  241. {
  242. TRACE(_T("CPPToolTip::IsNotifyn"));
  243. return (BOOL)(m_hNotifyWnd != NULL);
  244. }  //End of IsNotify
  245. BOOL CPPToolTip::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
  246. {
  247. CPoint ptClient;
  248. ::GetCursorPos(&ptClient);
  249. ScreenToClient(&ptClient);
  250. TRACE (_T("CPPToolTip::OnSetCursor(x=%d, y=%d)n"), ptClient.x, ptClient.y);
  251. if (m_drawer.OnSetCursor(&ptClient))
  252. return TRUE; //The cursor over the hyperlink
  253. ::SetCursor(::LoadCursor(NULL, IDC_ARROW));
  254. // return CWnd::OnSetCursor(pWnd, nHitTest, message);
  255. return TRUE;
  256. } //End of the WM_SETCURSOR handler
  257. LRESULT CPPToolTip::OnRepaintWindow(WPARAM wParam, LPARAM lParam)
  258. {
  259. TRACE (_T("CPPToolTip::OnRepaintWindow()n"));
  260. if (m_bHyperlinkEnabled)
  261. {
  262. //Window's repaint enabled
  263. CDC * pDC = GetDC();
  264. OnRedrawTooltip(pDC->GetSafeHdc());
  265. ReleaseDC(pDC);
  266. }
  267.     return TRUE;
  268. } //End of the UDM_TOOLTIP_REPAINT handler
  269. void CPPToolTip::OnDrawBorder(HDC hDC, HRGN hRgn)
  270. {
  271. ASSERT (hDC);
  272. ASSERT (hRgn);
  273. ::FrameRgn(hDC, hRgn, m_hbrBorder, m_szBorder.cx, m_szBorder.cy);
  274. } //End OnDrawBorder
  275. ////////////////////////////////////////////////////////////////////////
  276. //
  277. //      +-----------------+    +-------------------+   +-----------------+  
  278. //   +->|     Screen      +--->| m_hUnderTooltipBk |   |   m_hBitmapBk   |
  279. //   |  +--------+--------+    +-------------------+   +--------+--------+
  280. //   |           |                                            |
  281. //   |  +--------V--------+                          +--------V--------+
  282. //   |  |                 |     +--------------+     |                 |
  283. //   |  |                 |     |   DrawHTML   |---->|                 |
  284. //   |  |                 |     +--------------+     |                 |
  285. //   |  |                 |                          |     MemDC       |
  286. //   |  |                 |     +--------------+     |                 |
  287. //   |  |                 |     | OnDrawBorder |---->|                 |
  288. //   |  |     TempDC      |     +--------------+     +--------+--------+
  289. //   |  |                 |                                   |         
  290. //   |  |                 |     +--------------+              |         
  291. //   |  |                 |<----+  DrawShadow  |              |         
  292. //   |  |                 |     +--------------+              |         
  293. //   |  |                 |                                   |         
  294. //   |  |                 |<--------ALPHA---------------------+         
  295. //   |  |                 |
  296. //   |  +--------+--------+
  297. //   |           |          
  298. //   +-----------+
  299. //
  300. ////////////////////////////////////////////////////////////////////////
  301. void CPPToolTip::OnRedrawTooltip(HDC hDC, BYTE nTransparency /* = 0 */)
  302. {
  303. TRACE (_T("CPPToolTip::OnRedrawTooltip(Transparency = %d)n"), nTransparency);
  304. //ENG: If a transparency more then max value
  305. //RUS: 篷腓 珥圜屙桢 镳铉疣黜铖蜩 犷朦