PPTooltip.cpp
上传用户:aymxxn
上传日期:2014-11-29
资源大小:135k
文件大小:98k
源码类别:

文件操作

开发平台:

Visual C++

  1. /********************************************************************
  2. created: 2003/04/12
  3. created: 12:04:2003   10:50
  4. file base: PPTooltip
  5. file ext: cpp
  6. author: Eugene Pustovoyt
  7. purpose:
  8. *********************************************************************/
  9. #include "stdafx.h"
  10. #include "PPToolTip.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CPPToolTip
  18. CPPToolTip::CPPToolTip()
  19. {
  20. m_pParentWnd = NULL;
  21. m_rgnShadow.CreateRectRgn(0, 0, 0, 0);
  22. m_rgnToolTip.CreateRectRgn(0, 0, 0, 0);
  23. // m_rgnCombo.CreateRectRgn(0, 0, 0, 0);
  24. m_ptOriginal.x = -1;
  25. m_ptOriginal.y = -1;
  26. m_nIndexCurrentWnd = PPTOOLTIP_TOOL_NOEXIST;
  27. m_nIndexDisplayWnd = PPTOOLTIP_TOOL_NOEXIST;
  28. SetDelayTime(TTDT_INITIAL, 500);
  29. SetDelayTime(TTDT_AUTOPOP, 5000);
  30. SetNotify(FALSE);
  31. SetDirection();
  32. SetBehaviour();
  33. SetDefaultStyles();
  34. SetDefaultColors();
  35. SetDefaultSizes();
  36. SetEffectBk(PPTOOLTIP_EFFECT_SOLID);
  37. RemoveAllTools();
  38. // Register the window class if it has not already been registered.
  39. WNDCLASS wndcls;
  40. HINSTANCE hInst = AfxGetInstanceHandle();
  41. if(!(::GetClassInfo(hInst, PPTOOLTIP_CLASSNAME, &wndcls)))
  42. {
  43. // otherwise we need to register a new class
  44. wndcls.style = CS_SAVEBITS;
  45. wndcls.lpfnWndProc = ::DefWindowProc;
  46. wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
  47. wndcls.hInstance = hInst;
  48. wndcls.hIcon = NULL;
  49. wndcls.hCursor = LoadCursor(hInst, IDC_ARROW );
  50. wndcls.hbrBackground = NULL;
  51. wndcls.lpszMenuName = NULL;
  52. wndcls.lpszClassName = PPTOOLTIP_CLASSNAME;
  53. if (!AfxRegisterClass(&wndcls))
  54. AfxThrowResourceException();
  55. }
  56. }
  57. CPPToolTip::~CPPToolTip()
  58. {
  59. RemoveAllTools();
  60. RemoveAllNamesOfResource();
  61. m_nLengthLines.RemoveAll();
  62. m_nHeightLines.RemoveAll();
  63. // m_rgnCombo.Detach();
  64. // m_rgnCombo.DeleteObject();
  65. m_rgnToolTip.DeleteObject();
  66. m_rgnShadow.DeleteObject();
  67. if (IsWindow(m_hWnd))
  68.         DestroyWindow();
  69. }
  70. BEGIN_MESSAGE_MAP(CPPToolTip, CWnd)
  71. //{{AFX_MSG_MAP(CPPToolTip)
  72. ON_WM_PAINT()
  73. ON_WM_TIMER()
  74. ON_WM_DESTROY()
  75. ON_WM_KILLFOCUS()
  76. ON_WM_ERASEBKGND()
  77. //}}AFX_MSG_MAP
  78. END_MESSAGE_MAP()
  79. /////////////////////////////////////////////////////////////////////////////
  80. // CPPToolTip message handlers
  81. BOOL CPPToolTip::Create(CWnd* pParentWnd, BOOL bBalloonSize /* = TRUE */) 
  82. {
  83. TRACE(_T("CPPToolTip::Createn"));
  84. ASSERT_VALID(pParentWnd);
  85. DWORD dwStyle = WS_POPUP; 
  86. DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TOPMOST;
  87. m_pParentWnd = pParentWnd;
  88. if (!CreateEx(dwExStyle, PPTOOLTIP_CLASSNAME, NULL, dwStyle, 0, 0, 0, 0, pParentWnd->GetSafeHwnd(), NULL, NULL))
  89. {
  90. return FALSE;
  91. }
  92. SetDefaultFont();
  93. SetDefaultSizes(bBalloonSize);
  94. return TRUE;
  95. }
  96. void CPPToolTip::OnDestroy() 
  97. {
  98. KillTimers();
  99. CWnd::OnDestroy();
  100. }
  101. void CPPToolTip::OnKillFocus(CWnd* pNewWnd) 
  102. {
  103. CWnd::OnKillFocus(pNewWnd);
  104. Pop();
  105. }
  106. BOOL CPPToolTip::OnEraseBkgnd(CDC* pDC) 
  107. {
  108. return FALSE;
  109. }
  110. void CPPToolTip::Pop()
  111. {
  112. if (m_nIndexDisplayWnd == PPTOOLTIP_TOOL_HELPER)
  113. m_nIndexDisplayWnd = PPTOOLTIP_TOOL_NOEXIST;
  114. KillTimers();
  115. ShowWindow(SW_HIDE);
  116. }
  117. BOOL CPPToolTip::PreTranslateMessage(MSG* pMsg) 
  118. {
  119. RelayEvent(pMsg);
  120. return CWnd::PreTranslateMessage(pMsg);
  121. }
  122. LRESULT CPPToolTip::SendNotify(CPoint * pt, PPTOOLTIP_INFO & ti) 
  123. TRACE(_T("CPPToolTip::SendNotify()n")); 
  124.   // Make sure this is a valid window  
  125. if (!IsWindow(GetSafeHwnd())) 
  126. return 0L; 
  127.   
  128. // See if the user wants to be notified  
  129. if (!GetNotify()) 
  130. return 0L; 
  131.   
  132. NM_PPTOOLTIP_DISPLAY lpnm; 
  133. PPTOOLTIP_INFO tiCopy = ti; 
  134. FromHandle(ti.hWnd)->ClientToScreen(&tiCopy.rectBounds); 
  135. m_pParentWnd->ScreenToClient(&tiCopy.rectBounds); 
  136. lpnm.pt = pt;  
  137. lpnm.ti = &tiCopy; 
  138. lpnm.hdr.hwndFrom = m_hWnd; 
  139. lpnm.hdr.idFrom   = GetDlgCtrlID(); 
  140. lpnm.hdr.code     = UDM_TOOLTIP_DISPLAY; 
  141.  
  142. ::SendMessage(m_hNotifyWnd, WM_NOTIFY, lpnm.hdr.idFrom, (LPARAM)&lpnm);  
  143. CRect rcBound = ti.rectBounds;  
  144. ti = tiCopy; 
  145. ti.rectBounds = rcBound;  
  146. return 0L; 
  147. }
  148. void CPPToolTip::OnPaint() 
  149. {
  150. if (!IsEnabledIndexTool(m_nIndexCurrentWnd))
  151. return;
  152. m_nIndexDisplayWnd = m_nIndexCurrentWnd;
  153. m_nIndexCurrentWnd = PPTOOLTIP_TOOL_NOEXIST;
  154. CPaintDC dc(this); // device context for painting
  155. CRect rect;
  156. GetClientRect(&rect);
  157. rect.DeflateRect(0, 0, 1, 1);
  158. // Create a memory device-context. This is done to help reduce
  159. // screen flicker, since we will paint the entire control to the
  160. // off screen device context first.CDC memDC;
  161. CDC memDC;
  162. CBitmap bitmap;
  163. memDC.CreateCompatibleDC(&dc);
  164. bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
  165. CBitmap* pOldBitmap = memDC.SelectObject(&bitmap); 
  166. memDC.BitBlt(0, 0, rect.Width(), rect.Height(), &dc, 0,0, SRCCOPY);
  167. OnDraw(&memDC, rect);
  168. //Copy the memory device context back into the original DC via BitBlt().
  169. dc.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0,0, SRCCOPY);
  170. //Cleanup resources.
  171. memDC.SelectObject(pOldBitmap);
  172. memDC.DeleteDC();
  173. bitmap.DeleteObject(); 
  174. }
  175. void CPPToolTip::OnDraw(CDC * pDC, CRect rect)
  176. {
  177. CBrush brBackground(m_crColor [PPTOOLTIP_COLOR_BK_BEGIN]);
  178. CBrush brBorder(m_crColor [PPTOOLTIP_COLOR_BORDER]);
  179. pDC->SetBkMode(TRANSPARENT); 
  180. //Sets clip region of the tooltip and draws the shadow if you need
  181. if (m_pToolInfo.nStyles & PPTOOLTIP_SHADOW)
  182. {
  183. //Draws the shadow for the tooltip
  184. OnDrawShadow(pDC);
  185. rect.DeflateRect(0, 0, m_nSizes[PPTTSZ_SHADOW_CX], m_nSizes[PPTTSZ_SHADOW_CY]);
  186. }
  187. pDC->SelectClipRgn(&m_rgnToolTip);
  188. OnDrawBackground(pDC, &rect);
  189. //Draws the main region's border of the tooltip
  190. pDC->FrameRgn(&m_rgnToolTip, &brBorder, m_nSizes[PPTTSZ_BORDER_CX], m_nSizes[PPTTSZ_BORDER_CY]);
  191. //Gets the rectangle to draw the tooltip text
  192. rect.DeflateRect(m_nSizes[PPTTSZ_MARGIN_CX], m_nSizes[PPTTSZ_MARGIN_CY]);
  193. if ((m_nLastDirection == PPTOOLTIP_RIGHT_BOTTOM) || (m_nLastDirection == PPTOOLTIP_LEFT_BOTTOM))
  194. rect.top += m_nSizes[PPTTSZ_HEIGHT_ANCHOR];
  195. else
  196. rect.bottom -= m_nSizes[PPTTSZ_HEIGHT_ANCHOR];
  197. // Draw the icon
  198. if (m_pToolInfo.hIcon != NULL)
  199. {
  200. CPoint ptIcon;
  201. ptIcon.x = m_nSizes[PPTTSZ_MARGIN_CX];
  202. ptIcon.y = rect.top;
  203. if (m_pToolInfo.nStyles & PPTOOLTIP_ICON_VCENTER_ALIGN)
  204. ptIcon.y = rect.top + (rect.Height() - m_szToolIcon.cy) / 2;
  205. else if (m_pToolInfo.nStyles & PPTOOLTIP_ICON_BOTTOM_ALIGN)
  206. ptIcon.y = rect.bottom - m_szToolIcon.cy;
  207. //First variant
  208. // pDC->DrawIcon(m_nSizes[PPTTSZ_MARGIN_CX], rect.top + (rect.Height() - m_szToolIcon.cy) / 2, m_pToolInfo.hIcon);
  209. //Second variant
  210. pDC->DrawState(ptIcon, m_szToolIcon, m_pToolInfo.hIcon, DSS_NORMAL, (CBrush*)NULL);
  211. //Third variant
  212. // DrawIconEx(pDC->m_hDC, ptIcon.x, ptIcon.y, m_pToolInfo.hIcon, m_szToolIcon.cx, 
  213. // m_szToolIcon.cy, 0, NULL, DI_NORMAL);
  214. rect.left += m_szToolIcon.cx + m_nSizes[PPTTSZ_MARGIN_CX]; 
  215. }
  216. //Aligns tooltip's text
  217. if (m_pToolInfo.nStyles & PPTOOLTIP_BOTTOM_ALIGN)
  218. rect.top = rect.bottom - m_szTextTooltip.cy;
  219. else if (m_pToolInfo.nStyles & PPTOOLTIP_VCENTER_ALIGN)
  220. rect.top += (rect.Height() - m_szTextTooltip.cy) / 2;
  221. //Prints the tooltip's text
  222. PrintTitleString(pDC, rect, m_pToolInfo.sTooltip, FALSE);
  223. brBackground.DeleteObject();
  224. brBorder.DeleteObject();
  225. }
  226. void CPPToolTip::OnDrawShadow(CDC * pDC)
  227. {
  228. CBrush brShadow(m_crColor [PPTOOLTIP_COLOR_SHADOW]);
  229. //Draws the shadow for the tooltip
  230. int nRop2Mode = pDC->SetROP2(R2_MASKPEN);
  231. pDC->FillRgn(&m_rgnShadow, &brShadow);
  232. pDC->SetROP2(nRop2Mode);
  233. brShadow.DeleteObject();
  234. }
  235. void CPPToolTip::OnDrawBackground(CDC * pDC, CRect * pRect)
  236. {
  237. switch (m_pToolInfo.nEffect)
  238. {
  239. default:
  240. pDC->FillSolidRect(pRect, m_crColor[PPTOOLTIP_COLOR_BK_BEGIN]);
  241. break;
  242. case PPTOOLTIP_EFFECT_HGRADIENT:
  243. FillGradient(pDC, pRect, m_crColor[PPTOOLTIP_COLOR_BK_BEGIN], m_crColor [PPTOOLTIP_COLOR_BK_END], TRUE);
  244. break;
  245. case PPTOOLTIP_EFFECT_VGRADIENT:
  246. FillGradient(pDC, pRect, m_crColor[PPTOOLTIP_COLOR_BK_BEGIN], m_crColor [PPTOOLTIP_COLOR_BK_END], FALSE);
  247. break;
  248. case PPTOOLTIP_EFFECT_HCGRADIENT:
  249. FillGradient(pDC, CRect(pRect->left, pRect->top, pRect->left + pRect->Width() / 2, pRect->bottom), 
  250. m_crColor[PPTOOLTIP_COLOR_BK_BEGIN], m_crColor [PPTOOLTIP_COLOR_BK_END], TRUE);
  251. FillGradient(pDC, CRect(pRect->left + pRect->Width() / 2, pRect->top, pRect->right, pRect->bottom), 
  252. m_crColor[PPTOOLTIP_COLOR_BK_END], m_crColor [PPTOOLTIP_COLOR_BK_BEGIN], TRUE);
  253. break;
  254. case PPTOOLTIP_EFFECT_VCGRADIENT:
  255. FillGradient(pDC, CRect (pRect->left, pRect->top, pRect->right, pRect->top + pRect->Height() / 2), 
  256. m_crColor[PPTOOLTIP_COLOR_BK_BEGIN], m_crColor [PPTOOLTIP_COLOR_BK_END], FALSE);
  257. FillGradient(pDC, CRect (pRect->left, pRect->top + pRect->Height() / 2, pRect->right, pRect->bottom), 
  258. m_crColor[PPTOOLTIP_COLOR_BK_END], m_crColor [PPTOOLTIP_COLOR_BK_BEGIN], FALSE);
  259. break;
  260. case PPTOOLTIP_EFFECT_3HGRADIENT:
  261. FillGradient(pDC, CRect(pRect->left, pRect->top, pRect->left + pRect->Width()/2, pRect->bottom), 
  262. m_crColor[PPTOOLTIP_COLOR_BK_BEGIN], m_crColor [PPTOOLTIP_COLOR_BK_MID], TRUE);
  263. FillGradient(pDC, CRect(pRect->left + pRect->Width() / 2, pRect->top, pRect->right, pRect->bottom), 
  264. m_crColor[PPTOOLTIP_COLOR_BK_MID], m_crColor [PPTOOLTIP_COLOR_BK_END], TRUE);
  265. break;
  266. case PPTOOLTIP_EFFECT_3VGRADIENT:
  267. FillGradient(pDC, CRect (pRect->left, pRect->top, pRect->right, pRect->top + pRect->Height() / 2), 
  268. m_crColor[PPTOOLTIP_COLOR_BK_BEGIN], m_crColor [PPTOOLTIP_COLOR_BK_MID], FALSE);
  269. FillGradient(pDC, CRect (pRect->left, pRect->top + pRect->Height() / 2, pRect->right, pRect->bottom), 
  270. m_crColor[PPTOOLTIP_COLOR_BK_MID], m_crColor [PPTOOLTIP_COLOR_BK_END], FALSE);
  271. break;
  272. #ifdef PPTOOLTIP_USE_SHADE
  273. case PPTOOLTIP_EFFECT_NOISE:
  274. case PPTOOLTIP_EFFECT_DIAGSHADE:
  275. case PPTOOLTIP_EFFECT_HSHADE:
  276. case PPTOOLTIP_EFFECT_VSHADE:
  277. case PPTOOLTIP_EFFECT_HBUMP:
  278. case PPTOOLTIP_EFFECT_VBUMP:
  279. case PPTOOLTIP_EFFECT_SOFTBUMP:
  280. case PPTOOLTIP_EFFECT_HARDBUMP:
  281. case PPTOOLTIP_EFFECT_METAL:
  282. m_dNormal.Draw(pDC->GetSafeHdc(),0,0);
  283. break;
  284. #endif
  285. }
  286. }
  287. void CPPToolTip::RelayEvent(MSG* pMsg)
  288. {
  289. ASSERT(m_pParentWnd);
  290. CWnd * pWnd = NULL;
  291. CPoint pt;
  292. CRect rect;
  293. CString str;
  294. int nIndexTool = PPTOOLTIP_TOOL_NOEXIST;
  295. // PPTOOLTIP_INFO  Info;
  296. switch(pMsg->message)
  297. {
  298. case WM_LBUTTONDOWN:
  299. case WM_LBUTTONDBLCLK:
  300. case WM_RBUTTONDOWN:
  301. case WM_RBUTTONDBLCLK:
  302. case WM_MBUTTONDOWN:
  303. case WM_MBUTTONDBLCLK:
  304. case WM_NCLBUTTONDOWN:
  305. case WM_NCLBUTTONDBLCLK:
  306. case WM_NCRBUTTONDOWN:
  307. case WM_NCRBUTTONDBLCLK:
  308. case WM_NCMBUTTONDOWN:
  309. case WM_NCMBUTTONDBLCLK:
  310. case WM_KEYDOWN:
  311. case WM_SYSKEYDOWN:
  312. // The user has interupted the current tool - dismiss it
  313. Pop();
  314. break;
  315. case WM_MOUSEMOVE:
  316. // TRACE (_T("OnMouseMove()n"));
  317. if ((m_ptOriginal == pMsg->pt) || 
  318. (m_nIndexCurrentWnd == PPTOOLTIP_TOOL_HELPER) ||
  319. (m_nIndexDisplayWnd == PPTOOLTIP_TOOL_HELPER))
  320. return; //Mouse pointer was not move
  321. //Check Active window
  322. if (!(m_nStyles & PPTOOLTIP_SHOW_INACTIVE))
  323. {
  324. pWnd = GetActiveWindow();
  325. if (!pWnd)
  326. return;
  327. }
  328. m_ptOriginal = pMsg->pt; //Stores the mouse's coordinates
  329. //Gets the real window under the mouse
  330. pt = pMsg->pt;
  331. m_pParentWnd->ScreenToClient(&pt);
  332. nIndexTool = FindTool(pt);
  333. if (!IsExistTool(nIndexTool))
  334. {
  335. //If the window under the mouse isn't exist
  336. if (IsCursorInToolTip() && (m_pToolInfo.nBehaviour & PPTOOLTIP_CLOSE_LEAVEWND))
  337. return;
  338. Pop();
  339. m_nIndexCurrentWnd = PPTOOLTIP_TOOL_NOEXIST;
  340. m_nIndexDisplayWnd = PPTOOLTIP_TOOL_NOEXIST;
  341. return;
  342. }
  343. else
  344. {
  345. //The window under the mouse is exist
  346. if (nIndexTool == m_nIndexDisplayWnd)
  347. {
  348. if (IsVisible())
  349. {
  350. //Now the tooltip is visible
  351. if ((m_pToolInfo.nBehaviour & PPTOOLTIP_CLOSE_LEAVEWND))
  352. return;
  353. }
  354. if (m_pToolInfo.nBehaviour & PPTOOLTIP_MULTIPLE_SHOW)
  355. {
  356. SetNewToolTip(nIndexTool);
  357. }
  358. else Pop();
  359. }
  360. else
  361. {
  362. SetNewToolTip(nIndexTool, !IsVisible());
  363. }
  364. }
  365. break;
  366. }
  367. }
  368. void CPPToolTip::SetNewToolTip(int nIndexTool, BOOL bWithDelay /* = TRUE */)
  369. {
  370. TRACE (_T("CPPToolTip::SetNewToolTip(Index = 0x%X)n"), nIndexTool);
  371. m_nIndexDisplayWnd = PPTOOLTIP_TOOL_NOEXIST; //reset the displayed window
  372. Pop();
  373. //Gets the info about current tool
  374. if (!GetTool(nIndexTool, m_pToolInfo))
  375. return;
  376. //Remembers the pointer to the current window
  377. m_nIndexCurrentWnd = nIndexTool;
  378. //Start the show timer
  379. if (bWithDelay)
  380. SetTimer(PPTOOLTIP_SHOW, m_nTimeInitial, NULL);
  381. else
  382. OnTimer(PPTOOLTIP_SHOW);
  383. }
  384. void CPPToolTip::OnTimer(UINT nIDEvent) 
  385. {
  386. CPoint pt = m_ptOriginal, point;
  387. CString str;
  388. int nIndexTool = PPTOOLTIP_TOOL_HELPER;
  389. switch (nIDEvent)
  390. {
  391. case PPTOOLTIP_SHOW:
  392. TRACE(_T("OnTimerShown"));
  393. Pop();
  394. if (m_nIndexCurrentWnd != PPTOOLTIP_TOOL_HELPER)
  395. {
  396. GetCursorPos(&pt);
  397. point = pt;
  398. m_pParentWnd->ScreenToClient(&point);
  399. nIndexTool = FindTool(point);
  400. }
  401. if ((nIndexTool == m_nIndexCurrentWnd) && (pt == m_ptOriginal) && IsEnabledIndexTool(nIndexTool))
  402. {
  403. PrepareDisplayToolTip(&pt);
  404. if (m_nTimeAutoPop && !(m_pToolInfo.nBehaviour & PPTOOLTIP_DISABLE_AUTOPOP)) //Don't hide window if autopop is 0
  405. SetTimer(PPTOOLTIP_HIDE, m_nTimeAutoPop, NULL);
  406. }
  407. break;
  408. case PPTOOLTIP_HIDE:
  409. TRACE(_T("OnTimerHiden"));
  410. if (!IsCursorInToolTip() || 
  411. !IsVisible() || 
  412. !(m_pToolInfo.nBehaviour & PPTOOLTIP_NOCLOSE_OVER))
  413. Pop();
  414. break;
  415. }
  416. CWnd::OnTimer(nIDEvent);
  417. }
  418. BOOL CPPToolTip::IsEnabledIndexTool(int nIndex)
  419. {
  420. return (BOOL)(IsExistTool(nIndex) || (nIndex == PPTOOLTIP_TOOL_HELPER));
  421. }
  422. BOOL CPPToolTip::IsCursorInToolTip() const
  423. {
  424.     ASSERT(m_pParentWnd);
  425.     // Is tooltip visible?
  426.     if (!IsVisible() || !IsWindow(m_hWnd))
  427. return FALSE;
  428.     CPoint pt;
  429.     GetCursorPos(&pt);
  430. CPPToolTip * pWnd = (CPPToolTip*)WindowFromPoint(pt);
  431. return (pWnd == this);
  432. }
  433. void CPPToolTip::KillTimers(UINT nIDTimer /* = NULL */)
  434. {
  435. // TRACE (_T("CPPToolTip::KillTimersn"));
  436. if (nIDTimer == NULL)
  437. {
  438. KillTimer(PPTOOLTIP_SHOW);
  439. KillTimer(PPTOOLTIP_HIDE);
  440. }
  441. else if (nIDTimer == PPTOOLTIP_SHOW)
  442. KillTimer(PPTOOLTIP_SHOW);
  443. else if (nIDTimer == PPTOOLTIP_HIDE)
  444. KillTimer(PPTOOLTIP_HIDE);
  445. }
  446. void CPPToolTip::PrepareDisplayToolTip(CPoint * pt)
  447. {
  448. TRACE (_T("CPPToolTip::DisplayToolTip()n"));
  449. //Fills default members
  450. if (!(m_pToolInfo.nMask & PPTOOLTIP_MASK_STYLES))
  451. m_pToolInfo.nStyles = m_nStyles;
  452. if (!(m_pToolInfo.nMask & PPTOOLTIP_MASK_EFFECT))
  453. {
  454. m_pToolInfo.nEffect = m_nEffect;
  455. m_pToolInfo.nGranularity = m_nGranularity;
  456. }
  457. if (!(m_pToolInfo.nMask & PPTOOLTIP_MASK_COLORS))
  458. {
  459. m_pToolInfo.crBegin = m_crColor[PPTOOLTIP_COLOR_BK_BEGIN];
  460. m_pToolInfo.crMid = m_crColor[PPTOOLTIP_COLOR_BK_MID];
  461. m_pToolInfo.crEnd = m_crColor[PPTOOLTIP_COLOR_BK_END];
  462. }
  463. if (!(m_pToolInfo.nMask & PPTOOLTIP_MASK_DIRECTION))
  464. m_pToolInfo.nDirection = m_nDirection;
  465. if (!(m_pToolInfo.nMask & PPTOOLTIP_MASK_BEHAVIOUR))
  466. m_pToolInfo.nBehaviour = m_nBehaviour;
  467. //Send notify
  468. SendNotify(pt, m_pToolInfo);
  469. //If string and icon are not exist then exit
  470. if ((m_pToolInfo.hIcon == NULL) && m_pToolInfo.sTooltip.IsEmpty())
  471. return;
  472. //calculate the width and height of the box dynamically
  473.     CSize sz = GetTooltipSize(m_pToolInfo.sTooltip);
  474. m_szTextTooltip = sz; //Stores the real size of the tooltip's text
  475. //Gets size of the current icon
  476. m_szToolIcon = GetSizeIcon(m_pToolInfo.hIcon);
  477. if (m_szToolIcon.cx || m_szToolIcon.cy)
  478. {
  479. sz.cx += m_szToolIcon.cx;
  480. if (m_szTextTooltip.cx != 0)
  481. sz.cx += m_nSizes[PPTTSZ_MARGIN_CX]; //If text is exist then adds separator
  482. sz.cy = max(m_szToolIcon.cy, sz.cy);
  483. }
  484. //Gets size of the tooltip with margins
  485. sz.cx += m_nSizes[PPTTSZ_MARGIN_CX] * 2;
  486. sz.cy += m_nSizes[PPTTSZ_MARGIN_CY] * 2 + m_nSizes[PPTTSZ_HEIGHT_ANCHOR];
  487. if (m_pToolInfo.nStyles & PPTOOLTIP_SHADOW)
  488. {
  489. sz.cx += m_nSizes[PPTTSZ_SHADOW_CX];
  490. sz.cy += m_nSizes[PPTTSZ_SHADOW_CY];
  491. }
  492. CRect rect (0, 0, sz.cx, sz.cy);
  493. #ifdef PPTOOLTIP_USE_SHADE
  494. //If needed to create the bitmap of the background effect
  495. switch (m_pToolInfo.nEffect)
  496. {
  497. case PPTOOLTIP_EFFECT_NOISE:
  498. case PPTOOLTIP_EFFECT_DIAGSHADE:
  499. case PPTOOLTIP_EFFECT_HSHADE:
  500. case PPTOOLTIP_EFFECT_VSHADE:
  501. case PPTOOLTIP_EFFECT_HBUMP:
  502. case PPTOOLTIP_EFFECT_VBUMP:
  503. case PPTOOLTIP_EFFECT_SOFTBUMP:
  504. case PPTOOLTIP_EFFECT_HARDBUMP:
  505. case PPTOOLTIP_EFFECT_METAL:
  506. SetShade(rect, m_pToolInfo.nEffect, m_nGranularity, 5, m_pToolInfo.crBegin);
  507. }
  508. #endif
  509. DisplayToolTip(pt, &rect);
  510. }
  511. void CPPToolTip::DisplayToolTip(CPoint * pt, CRect * rect)
  512. {
  513. //Calculate the placement on the screen
  514. CalculateInfoBoxRect(pt, rect);
  515. SetWindowPos(NULL, 
  516.                  rect->left, rect->top,
  517.                  rect->Width() + 2, rect->Height() + 2,
  518.                  SWP_SHOWWINDOW|SWP_NOCOPYBITS|SWP_NOACTIVATE|SWP_NOZORDER);
  519. CRgn rgnCombo;
  520. rgnCombo.CreateRectRgn(0, 0, 0, 0);
  521. if (m_pToolInfo.nStyles & PPTOOLTIP_SHADOW)
  522. {
  523. rect->right -= m_nSizes[PPTTSZ_SHADOW_CX];
  524. rect->bottom -= m_nSizes[PPTTSZ_SHADOW_CY];
  525. }
  526. m_rgnToolTip.DeleteObject();
  527. GetWindowRegion(&m_rgnToolTip, CSize (rect->Width(), rect->Height()), *pt);
  528. rgnCombo.CopyRgn(&m_rgnToolTip);
  529. if (m_pToolInfo.nStyles & PPTOOLTIP_SHADOW)
  530. {
  531. m_rgnShadow.DeleteObject();
  532. m_rgnShadow.CreateRectRgn(0, 0, 0, 0);
  533. m_rgnShadow.CopyRgn(&m_rgnToolTip);
  534. m_rgnShadow.OffsetRgn(m_nSizes[PPTTSZ_SHADOW_CX], m_nSizes[PPTTSZ_SHADOW_CY]);
  535. rgnCombo.CombineRgn(&rgnCombo, &m_rgnShadow, RGN_OR);
  536. }
  537. SetWindowRgn((HRGN)rgnCombo.Detach(), FALSE);
  538. }
  539. CRect CPPToolTip::GetWindowRegion(CRgn * rgn, CSize sz, CPoint pt)
  540. {
  541. CRect rect;
  542. rect.SetRect(0, 0, sz.cx, sz.cy);
  543. CRgn rgnRect;
  544. CRgn rgnAnchor;
  545. CPoint ptAnchor [3];
  546. ptAnchor [0] = pt;
  547. ScreenToClient(&ptAnchor [0]);
  548. switch (m_nLastDirection)
  549. {
  550. case PPTOOLTIP_LEFT_TOP:
  551. case PPTOOLTIP_RIGHT_TOP:
  552. rect.bottom -= m_nSizes[PPTTSZ_HEIGHT_ANCHOR];
  553. ptAnchor [1].y = ptAnchor [2].y = rect.bottom;
  554. break;
  555. case PPTOOLTIP_LEFT_BOTTOM:
  556. case PPTOOLTIP_RIGHT_BOTTOM:
  557. rect.top += m_nSizes[PPTTSZ_HEIGHT_ANCHOR];
  558. ptAnchor [1].y = ptAnchor [2].y = rect.top;
  559. break;
  560. }
  561. //Gets the region for rectangle with the text
  562. if (m_pToolInfo.nStyles & PPTOOLTIP_ROUNDED)
  563. rgnRect.CreateRoundRectRgn(rect.left, rect.top, rect.right + 1, rect.bottom + 1, 
  564. m_nSizes[PPTTSZ_ROUNDED_CX], m_nSizes[PPTTSZ_ROUNDED_CY]);
  565. else rgnRect.CreateRectRgn(rect.left, rect.top, rect.right + 1, rect.bottom + 1);
  566. //Gets the region for anchor
  567. if (m_pToolInfo.nStyles & PPTOOLTIP_ANCHOR)
  568. {
  569. switch (m_nLastDirection)
  570. {
  571. case PPTOOLTIP_LEFT_TOP:
  572. case PPTOOLTIP_LEFT_BOTTOM:
  573. ptAnchor [1].x = rect.right - m_nSizes[PPTTSZ_MARGIN_ANCHOR];
  574. ptAnchor [2].x = ptAnchor [1].x - m_nSizes[PPTTSZ_WIDTH_ANCHOR];
  575. break;
  576. case PPTOOLTIP_RIGHT_TOP:
  577. case PPTOOLTIP_RIGHT_BOTTOM:
  578. ptAnchor [1].x = rect.left + m_nSizes[PPTTSZ_MARGIN_ANCHOR];
  579. ptAnchor [2].x = ptAnchor [1].x + m_nSizes[PPTTSZ_WIDTH_ANCHOR];
  580. break;
  581. }
  582. rgnAnchor.CreatePolygonRgn(ptAnchor, 3, ALTERNATE);
  583. }
  584. else
  585. rgnAnchor.CreateRectRgn(0, 0, 0, 0);
  586. rgn->CreateRectRgn(0, 0, 0, 0);
  587. rgn->CombineRgn(&rgnRect, &rgnAnchor, RGN_OR);
  588. rgnAnchor.DeleteObject();
  589. rgnRect.DeleteObject();
  590. return rect;
  591. }
  592. ///////////////////////////////////////////////////
  593. // Gets the size of the current tooltip text
  594. //
  595. // Parameters:
  596. // none
  597. //
  598. // Return value:
  599. // Size of current tooltip text
  600. ///////////////////////////////////////////////////
  601. CSize CPPToolTip::GetTooltipSize(CString str)
  602. {
  603. //Gets max windows rectangle
  604. CRect rect;
  605. GetWindowRect(&rect);
  606. //Creates compatibility context device in memory
  607. // CDC * pDC = GetDC();
  608. CWindowDC dc(NULL);
  609. CDC memDC;
  610. CBitmap bitmap;
  611. memDC.CreateCompatibleDC(&dc);
  612. // memDC.CreateCompatibleDC(pDC);
  613. bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height());
  614. // bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
  615. CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
  616. //Prints the string on device context for gets minimal size of the rectangle 
  617. //of the tooltip
  618. CSize sz = PrintTitleString(&memDC, rect, str);
  619. memDC.SelectObject(pOldBitmap);
  620. memDC.DeleteDC();
  621. bitmap.DeleteObject();
  622. // ReleaseDC(pDC);
  623. //Returns minimal rectangle of the tooltip
  624. return sz;
  625. }
  626. CSize CPPToolTip::GetSizeIcon(HICON hIcon) const
  627. {
  628. ICONINFO ii;
  629. CSize sz (0, 0);
  630. if (hIcon != NULL)
  631. {
  632. // Gets icon dimension
  633. ::ZeroMemory(&ii, sizeof(ICONINFO));
  634. if (::GetIconInfo(hIcon, &ii))
  635. {
  636. sz.cx = (DWORD)(ii.xHotspot * 2);
  637. sz.cy = (DWORD)(ii.yHotspot * 2);
  638. //release icon mask bitmaps
  639. if(ii.hbmMask)
  640. ::DeleteObject(ii.hbmMask);
  641. if(ii.hbmColor)
  642. ::DeleteObject(ii.hbmColor);
  643. }
  644. }
  645. return sz;
  646. }
  647. ///////////////////////////////////////////////////
  648. // Calculates the real rect for the tooltip with margins
  649. //
  650. // Parameters:
  651. // pt [in] - the mouse coordinates (screen coordinates)
  652. // sz [in] - the size of the tooltip text
  653. //
  654. // Return value:
  655. // The rectangle when the tooltip will draw (screen coordinates)
  656. ///////////////////////////////////////////////////
  657. void CPPToolTip::CalculateInfoBoxRect(CPoint * pt, CRect * rect)
  658. {
  659. // Use the screen's right edge as the right hand border, not the right edge of the client.
  660. CWindowDC wdc(NULL);
  661. CRect rWindow(0, 0, 0, 0);
  662. rWindow.right = GetDeviceCaps(wdc, HORZRES);// - 8;
  663. rWindow.bottom = GetDeviceCaps(wdc, VERTRES);// - 8;
  664. /*
  665. m_szToolIcon = GetSizeIcon(m_pToolInfo.hIcon);
  666. if (m_szToolIcon.cx || m_szToolIcon.cy)
  667. {
  668. sz.cx += m_szToolIcon.cx + m_nSizes[PPTTSZ_MARGIN_CX];
  669. sz.cy = max(m_szToolIcon.cy, sz.cy);
  670. }
  671. //Gets size of the tooltip with margins
  672. sz.cx += m_nSizes[PPTTSZ_MARGIN_CX] * 2;
  673. sz.cy += m_nSizes[PPTTSZ_MARGIN_CY] * 2 + m_nSizes[PPTTSZ_HEIGHT_ANCHOR];
  674. if (m_pToolInfo.nStyles & PPTOOLTIP_SHADOW)
  675. {
  676. rWindow.right -= m_nSizes[PPTTSZ_SHADOW_CX];
  677. rWindow.bottom -= m_nSizes[PPTTSZ_SHADOW_CY];
  678. sz.cx += m_nSizes[PPTTSZ_SHADOW_CX];
  679. sz.cy += m_nSizes[PPTTSZ_SHADOW_CY];
  680. }
  681. */
  682. // CRect rect;
  683. // rect.SetRect(0, 0, sz.cx, sz.cy);
  684. // CRect rectCopy = *rect;
  685. //Offset the rect from the mouse pointer
  686. CPoint ptEnd;
  687. m_nLastDirection = m_pToolInfo.nDirection;
  688. if (!TestHorizDirection(pt->x, rect->Width(), rWindow.right, m_nLastDirection, rect))
  689. {
  690. m_nLastDirection = GetNextHorizDirection(m_nLastDirection);
  691. TestHorizDirection(pt->x, rect->Width(), rWindow.right, m_nLastDirection, rect);
  692. }
  693. if (!TestVertDirection(pt->y, rect->Height(), rWindow.bottom, m_nLastDirection, rect))
  694. {
  695. m_nLastDirection = GetNextVertDirection(m_nLastDirection);
  696. TestVertDirection(pt->y, rect->Height(), rWindow.bottom, m_nLastDirection, rect);
  697. }
  698. //Returns the rect of the tooltip
  699. if ((m_pToolInfo.nStyles & PPTOOLTIP_SHADOW) && 
  700. ((m_nLastDirection == PPTOOLTIP_LEFT_TOP) || (m_nLastDirection == PPTOOLTIP_LEFT_BOTTOM)))
  701. rect->OffsetRect(m_nSizes[PPTTSZ_SHADOW_CX], m_nSizes[PPTTSZ_SHADOW_CY]);
  702. }
  703. ///////////////////////////////////////////////////
  704. // Gets the next horizontal direction
  705. //
  706. // Parameters:
  707. // nDirection [in] - the current direction
  708. //
  709. // Return value:
  710. // The next horizontal direction
  711. ///////////////////////////////////////////////////
  712. int CPPToolTip::GetNextHorizDirection(int nDirection) const
  713. {
  714. switch (nDirection)
  715. {
  716. case PPTOOLTIP_LEFT_TOP:
  717. nDirection = PPTOOLTIP_RIGHT_TOP;
  718. break;
  719. case PPTOOLTIP_RIGHT_TOP:
  720. nDirection = PPTOOLTIP_LEFT_TOP;
  721. break;
  722. case PPTOOLTIP_LEFT_BOTTOM:
  723. nDirection = PPTOOLTIP_RIGHT_BOTTOM;
  724. break;
  725. case PPTOOLTIP_RIGHT_BOTTOM:
  726. nDirection = PPTOOLTIP_LEFT_BOTTOM;
  727. break;
  728. }
  729. return nDirection;
  730. }
  731. ///////////////////////////////////////////////////
  732. // Gets the next vertical direction
  733. //
  734. // Parameters:
  735. // nDirection [in] - the current direction
  736. //
  737. // Return value:
  738. // The next vertical direction
  739. ///////////////////////////////////////////////////
  740. int CPPToolTip::GetNextVertDirection(int nDirection) const
  741. {
  742. switch (nDirection)
  743. {
  744. case PPTOOLTIP_LEFT_TOP:
  745. nDirection = PPTOOLTIP_LEFT_BOTTOM;
  746. break;
  747. case PPTOOLTIP_LEFT_BOTTOM:
  748. nDirection = PPTOOLTIP_LEFT_TOP;
  749. break;
  750. case PPTOOLTIP_RIGHT_TOP:
  751. nDirection = PPTOOLTIP_RIGHT_BOTTOM;
  752. break;
  753. case PPTOOLTIP_RIGHT_BOTTOM:
  754. nDirection = PPTOOLTIP_RIGHT_TOP;
  755. break;
  756. }
  757. return nDirection;
  758. }
  759. BOOL CPPToolTip::TestHorizDirection(int x, int cx, int w_cx, int nDirection, LPRECT rect) const
  760. {
  761. int left,right;
  762. switch (nDirection)
  763. {
  764. case PPTOOLTIP_LEFT_TOP:
  765. case PPTOOLTIP_LEFT_BOTTOM:
  766. right = ((x + (int)m_nSizes[PPTTSZ_MARGIN_ANCHOR]) > w_cx) ? w_cx : (x + m_nSizes[PPTTSZ_MARGIN_ANCHOR]);
  767. left = right - cx;
  768. break;
  769. case PPTOOLTIP_RIGHT_TOP:
  770. case PPTOOLTIP_RIGHT_BOTTOM:
  771. left = (x < (int)m_nSizes[PPTTSZ_MARGIN_ANCHOR]) ? 0 : (x - m_nSizes[PPTTSZ_MARGIN_ANCHOR]);
  772. right = left + cx;
  773. break;
  774. }
  775. BOOL bTestOk = ((left >= 0) && (right <= w_cx)) ? TRUE : FALSE;
  776. if (bTestOk)
  777. {
  778. rect->left = left;
  779. rect->right = right;
  780. }
  781. return bTestOk;
  782. }
  783. BOOL CPPToolTip::TestVertDirection(int y, int cy, int w_cy, int nDirection, LPRECT rect) const
  784. {
  785. int top, bottom;
  786. switch (nDirection)
  787. {
  788. case PPTOOLTIP_LEFT_TOP:
  789. case PPTOOLTIP_RIGHT_TOP:
  790. bottom = y;
  791. top = bottom - cy;
  792. break;
  793. case PPTOOLTIP_LEFT_BOTTOM:
  794. case PPTOOLTIP_RIGHT_BOTTOM:
  795. top = y;
  796. bottom = top + cy;
  797. break;
  798. }
  799. BOOL bTestOk = ((top >= 0) && (bottom <= w_cy)) ? TRUE : FALSE;
  800. if (bTestOk)
  801. {
  802. rect->top = top;
  803. rect->bottom = bottom;
  804. }
  805. return bTestOk;
  806. }
  807. /////////////////////////////////////////////////////////////////
  808. // Gets the system tooltip's logfont
  809. /////////////////////////////////////////////////////////////////
  810. LPLOGFONT CPPToolTip::GetSystemToolTipFont() const
  811. {
  812.     static LOGFONT LogFont;
  813.     NONCLIENTMETRICS ncm;
  814.     ncm.cbSize = sizeof(NONCLIENTMETRICS);
  815.     if (!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0))
  816.         return FALSE;
  817.     memcpy(&LogFont, &(ncm.lfStatusFont), sizeof(LOGFONT));
  818.     return &LogFont; 
  819. }
  820. /////////////////////////////////////////////////////////////////
  821. // Prints the formating string of the tooltip
  822. //  
  823. // Parameters:
  824. // pDC  - [in] The device context to print the string
  825. //      str  - [in] The formating string for drawing
  826. //      rect         - [in] The rectangle to draws the tooltip
  827. // bEnableAlign - [in] If TRUE align's operators are enables.
  828. //
  829. // Return values:
  830. //      None.
  831. //---------------------------------------------------------------
  832. // Format of string:
  833. //  <b> text </b> - The bold string
  834. //  <i> text </i> - The italic string 
  835. //  <u> text </u> - The underline string
  836. //  <s> text </s> - The strike out string
  837. //
  838. //  <cb=0x123456> text </cb> - The background color (RGB (12,34,56))
  839. //  <ct=0x123456> text </ct> - The text color (RGB (12,34,56))
  840. //
  841. //  <cbi=1> text </cbi> - The index background color(0 - F)
  842. //  <cti=1> text </cti> - The index text color(0 - F)
  843. //
  844. // <al> or <al_l> - sets align to left edge
  845. //  <al_c> - sets align to the center 
  846. //  <al_r> - sets align to the right edge
  847. //
  848. // <hr=100%> - the horizontal line with length 100%
  849. //  <hr=32> - the horizontal line with length 32 pixels.
  850. //
  851. // <a="link"> text </a> - The hyperlink 
  852. //
  853. //  <h=1> text </h> - hot zone (number of zone)
  854. //
  855. // <br[=1]> - new line (numbers of the lines)
  856. //  <t[=1]> - tabulation (number of tabulations)
  857. //
  858. //  <img[=0x0000] [cx=0] [cy=0]>  - draws the image by his name
  859. //  <ilst[=0x0000]>  - draws the image from image list
  860. //  <bmp[=0x0000] mask[=0xFF00FF] [cx=0] [cy=0]> - draws bitmap
  861. //  <icon[=0x0000] [cx=0] [cy=0]>  - draws the icon
  862. ////////////////////////////////////////////////////////////////
  863. CSize CPPToolTip::PrintTitleString(CDC * pDC, CRect rect, CString str, BOOL bCalculate /* = TRUE */)
  864. {
  865. enum{ CMD_NONE = 0,
  866. CMD_BOLD,
  867. CMD_ITALIC,
  868. CMD_STRIKE,
  869. CMD_UNDERLINE,
  870. CMD_COLOR_TEXT,
  871. CMD_COLOR_TEXT_INDEX,
  872. CMD_COLOR_BK,
  873. CMD_COLOR_BK_INDEX,
  874. CMD_NEW_LINE,
  875. CMD_TABULATION,
  876. CMD_HORZ_LINE,
  877. CMD_HORZ_LINE_PERCENT,
  878. CMD_DRAW_IMAGE,
  879. CMD_DRAW_IMAGE_LIST,
  880. CMD_DRAW_BITMAP,
  881. CMD_DRAW_BITMAP_MASK,
  882. CMD_DRAW_ICON
  883. };
  884. enum{ ALIGN_LEFT = 0,
  885. ALIGN_CENTER,
  886. ALIGN_RIGHT
  887. };
  888. //Clears the length of the lines
  889. if (bCalculate)
  890. {
  891. m_nLengthLines.RemoveAll();
  892. m_nHeightLines.RemoveAll();
  893. }
  894. int nLine = 0;
  895. int nCmd = CMD_NONE;
  896. int nAlign = ALIGN_LEFT;
  897. BOOL bCloseTag = FALSE;
  898. CSize sz(0, 0);
  899. CSize szLine (0, 0);
  900. CSize szIcon (0, 0); //The size of icon
  901. if (str.IsEmpty())
  902. return sz;
  903. CPoint pt = rect.TopLeft();
  904. CPoint  ptCur = pt;
  905. // Copies default logfont's structure
  906. LOGFONT lf;
  907.     memcpy(&lf, &m_LogFont, sizeof(LOGFONT));
  908. CFont font;
  909. font.CreateFontIndirect(&lf);
  910. CFont * pOldFont = pDC->SelectObject(&font);
  911. TEXTMETRIC tm;
  912. pDC->GetTextMetrics(&tm);
  913. int nHeight = tm.tmHeight; //The height of the font
  914. int nWidth = tm.tmAveCharWidth; //The width of the font
  915. CString strTag = _T("");  // Tag's name 
  916. CString strText = _T(""); // The current text to output
  917. CString sParam = _T(""); // The text parameter
  918. UINT nParam = 0, nParam1 = 0;
  919. int nLineHeight = bCalculate ? nHeight : m_nHeightLines.GetAt(0); //The height of the current line
  920. CUIntArray percent;
  921. percent.Add(0);
  922. int nTemp = 0; //the temporary variable
  923. BOOL bFirstOutput = TRUE;
  924. for (int i = 0; i <= str.GetLength(); i++)
  925. {
  926. if (i < str.GetLength())
  927. {
  928. nCmd = CMD_NONE;
  929. strText = SearchBeginOfTag(str, i);
  930. if (strText.IsEmpty())
  931. {
  932. //Tag was found
  933. strTag = GetNameOfTag(str, i);
  934. bCloseTag = (strTag.GetAt(0) == _T('/')) ? TRUE : FALSE;
  935. if (bCloseTag)
  936. strTag = strTag.Right(strTag.GetLength() - 1);
  937. if (!strTag.CompareNoCase(_T("b")))
  938. {
  939. nCmd = CMD_BOLD;
  940. }
  941. else if (!strTag.CompareNoCase(_T("i")))
  942. {
  943. nCmd = CMD_ITALIC;
  944. }
  945. else if (!strTag.CompareNoCase(_T("u")))
  946. {
  947. nCmd = CMD_UNDERLINE;
  948. }
  949. else if (!strTag.CompareNoCase(_T("s")))
  950. {
  951. nCmd = CMD_STRIKE;
  952. }
  953. else if (!strTag.CompareNoCase(_T("br")))
  954. {
  955. nCmd = CMD_NEW_LINE;
  956. nParam = GetUIntValue(str, i, 1);
  957. }
  958. else if (!strTag.CompareNoCase(_T("t")))
  959. {
  960. nCmd = CMD_TABULATION;
  961. nParam = GetUIntValue(str, i, 1);
  962. }
  963. else if (strTag.GetAt(0) == _T('n'))
  964. {
  965. nCmd = CMD_NEW_LINE;
  966. nParam = 1;
  967. }
  968. else if (strTag.GetAt(0) == _T('t'))
  969. {
  970. nCmd = CMD_TABULATION;
  971. nParam = 1;
  972. }
  973. else if (!strTag.CompareNoCase(_T("ct")))
  974. {
  975. nCmd = CMD_COLOR_TEXT;
  976. nParam = GetUIntValue(str, i, (UINT)m_crColor[PPTOOLTIP_COLOR_FG]);
  977. }
  978. else if (!strTag.CompareNoCase(_T("cti")))
  979. {
  980. nCmd = CMD_COLOR_TEXT;
  981. nParam = GetUIntValue(str, i, PPTOOLTIP_COLOR_FG);
  982. }
  983. else if (!strTag.CompareNoCase(_T("cb")))
  984. {
  985. nCmd = CMD_COLOR_BK;
  986. nParam = GetUIntValue(str, i, (UINT)m_crColor[PPTOOLTIP_COLOR_BK_BEGIN]);
  987. }
  988. else if (!strTag.CompareNoCase(_T("cbi")))
  989. {
  990. nCmd = CMD_COLOR_BK_INDEX;
  991. nParam = GetUIntValue(str, i, PPTOOLTIP_COLOR_BK_BEGIN);
  992. }
  993. else if (!strTag.CompareNoCase(_T("al")) || !strTag.CompareNoCase(_T("al_l")))
  994. {
  995. nAlign = ALIGN_LEFT;
  996. }
  997. else if (!strTag.CompareNoCase(_T("al_c")))
  998. {
  999. if (!bCalculate)
  1000. nAlign = ALIGN_CENTER;
  1001. }
  1002. else if (!strTag.CompareNoCase(_T("al_r")))
  1003. {
  1004. if (!bCalculate)
  1005. nAlign = ALIGN_RIGHT;
  1006. }
  1007. else if (!strTag.CompareNoCase(_T("hr")))
  1008. {
  1009. sParam = GetStringValue(str, i);
  1010. if (!sParam.IsEmpty())
  1011. nParam = _tcstoul(sParam, 0, 0);
  1012. else
  1013. nParam = 100;
  1014. nCmd = (sParam.Right(1) == _T("%"))? CMD_HORZ_LINE_PERCENT : CMD_HORZ_LINE;
  1015. }
  1016. else if (!strTag.CompareNoCase(_T("img")))
  1017. {
  1018. nCmd = CMD_DRAW_IMAGE;
  1019. sParam = GetStringValue(str, i);
  1020. szIcon = CSize(0, 0);
  1021. //Gets two param
  1022. for (nTemp = 0; nTemp < 2; nTemp++)
  1023. {
  1024. strTag = GetPropertiesOfTag(str, i);
  1025. if (!strTag.CompareNoCase(_T("cx")))
  1026. szIcon.cx = GetUIntValue(str, i, 0);
  1027. else if (!strTag.CompareNoCase(_T("cy")))
  1028. szIcon.cy = GetUIntValue(str, i, 0);
  1029. }
  1030. }
  1031. else if (!strTag.CompareNoCase(_T("ilst")))
  1032. {
  1033. nCmd = CMD_DRAW_IMAGE_LIST;
  1034. nParam = GetUIntValue(str, i, 0);
  1035. }
  1036. else if (!strTag.CompareNoCase(_T("icon")))
  1037. {
  1038. nCmd = CMD_DRAW_ICON;
  1039. nParam = GetUIntValue(str, i, 0);
  1040. szIcon = CSize(0, 0);
  1041. //Gets two param
  1042. for (nTemp = 0; nTemp < 2; nTemp++)
  1043. {
  1044. strTag = GetPropertiesOfTag(str, i);
  1045. if (!strTag.CompareNoCase(_T("cx")))
  1046. szIcon.cx = GetUIntValue(str, i, 0);
  1047. else if (!strTag.CompareNoCase(_T("cy")))
  1048. szIcon.cy = GetUIntValue(str, i, 0);
  1049. }
  1050. }
  1051. else if (!strTag.CompareNoCase(_T("bmp")))
  1052. {
  1053. nCmd = CMD_DRAW_BITMAP;
  1054. nParam = GetUIntValue(str, i, 0);
  1055. sParam.Empty();
  1056. //Gets three param
  1057. for (nTemp = 0; nTemp < 3; nTemp++)
  1058. {
  1059. strTag = GetPropertiesOfTag(str, i);
  1060. if (!strTag.CompareNoCase(_T("mask")))
  1061. {
  1062. sParam = strTag;
  1063. nParam1 = GetUIntValue(str, i, 0xFF00FF);
  1064. }
  1065. else if (!strTag.CompareNoCase(_T("cx")))
  1066. szIcon.cx = GetUIntValue(str, i, 0);
  1067. else if (!strTag.CompareNoCase(_T("cy")))
  1068. szIcon.cy = GetUIntValue(str, i, 0);
  1069. }
  1070. }
  1071. else nCmd = CMD_NONE;
  1072. SearchEndOfTag(str, i);
  1073. }
  1074. else
  1075. {
  1076. //If text to output is exist
  1077. if (bFirstOutput)
  1078. {
  1079. switch (nAlign)
  1080. {
  1081. case ALIGN_CENTER:
  1082. ptCur.x = pt.x + (rect.Width() - m_nLengthLines.GetAt(nLine)) / 2;
  1083. break;
  1084. case ALIGN_RIGHT:
  1085. ptCur.x = pt.x + rect.Width() - m_nLengthLines.GetAt(nLine);
  1086. break;
  1087. }
  1088. }
  1089. szLine = pDC->GetTextExtent(strText);
  1090. if (bCalculate)
  1091. nLineHeight = max(nLineHeight, szLine.cy);
  1092. else
  1093. pDC->TextOut(ptCur.x, ptCur.y + m_nHeightLines.GetAt(nLine) - nHeight, strText);
  1094. ptCur.x += szLine.cx;
  1095. strText = _T("");
  1096. bFirstOutput = FALSE;
  1097. i--;
  1098. }
  1099. }
  1100. else
  1101. {
  1102. nCmd = CMD_NEW_LINE;
  1103. nParam = 1; 
  1104. }
  1105. //Prepares to first draw in line
  1106. switch (nCmd)
  1107. {
  1108. case CMD_DRAW_IMAGE:
  1109. case CMD_DRAW_IMAGE_LIST:
  1110. case CMD_DRAW_BITMAP:
  1111. case CMD_DRAW_ICON:
  1112. if (bFirstOutput)
  1113. {
  1114. switch (nAlign)
  1115. {
  1116. case ALIGN_CENTER:
  1117. ptCur.x = pt.x + (rect.Width() - m_nLengthLines.GetAt(nLine)) / 2;
  1118. break;
  1119. case ALIGN_RIGHT:
  1120. ptCur.x = pt.x + rect.Width() - m_nLengthLines.GetAt(nLine);
  1121. break;
  1122. }
  1123. bFirstOutput = FALSE;
  1124. }
  1125. break;
  1126. }
  1127. //Executes command
  1128. switch (nCmd)
  1129. {
  1130. case CMD_BOLD:
  1131. //Bold text
  1132. pDC->SelectObject(pOldFont);
  1133. font.DeleteObject();
  1134. lf.lfWeight = m_LogFont.lfWeight;
  1135. if (!bCloseTag)
  1136. {
  1137. lf.lfWeight *= 2;
  1138. if (lf.lfWeight > FW_BLACK)
  1139. lf.lfWeight = FW_BLACK;
  1140. }
  1141. font.CreateFontIndirect(&lf);
  1142. pDC->SelectObject(&font);
  1143. break;
  1144. case CMD_ITALIC:
  1145. //Italic text
  1146. pDC->SelectObject(pOldFont);
  1147. font.DeleteObject();
  1148. lf.lfItalic = bCloseTag ? FALSE : TRUE;
  1149. font.CreateFontIndirect(&lf);
  1150. pDC->SelectObject(&font);
  1151. break;
  1152. case CMD_STRIKE:
  1153. //Strikeout text
  1154. pDC->SelectObject(pOldFont);
  1155. font.DeleteObject();
  1156. lf.lfStrikeOut = bCloseTag ? FALSE : TRUE;
  1157. font.CreateFontIndirect(&lf);
  1158. pDC->SelectObject(&font);
  1159. break;
  1160. case CMD_UNDERLINE:
  1161. //Underline text
  1162. pDC->SelectObject(pOldFont);
  1163. font.DeleteObject();
  1164. lf.lfUnderline = bCloseTag ? FALSE : TRUE;
  1165. font.CreateFontIndirect(&lf);
  1166. pDC->SelectObject(&font);
  1167. break;
  1168. case CMD_COLOR_TEXT:
  1169. //Color of the text
  1170. pDC->SetTextColor((COLORREF)nParam);
  1171. break;
  1172. case CMD_COLOR_TEXT_INDEX:
  1173. //Indexed color of the text
  1174. if (nParam < PPTOOLTIP_MAX_COLORS)
  1175. pDC->SetTextColor(m_crColor[nParam]);
  1176. break;
  1177. case CMD_COLOR_BK:
  1178. //Color of the background
  1179. pDC->SetBkColor((COLORREF)nParam);
  1180. pDC->SetBkMode(bCloseTag ? TRANSPARENT : OPAQUE);
  1181. break;
  1182. case CMD_COLOR_BK_INDEX:
  1183. //Indexed color of the background
  1184. if (nParam < PPTOOLTIP_MAX_COLORS)
  1185. {
  1186. pDC->SetBkColor(m_crColor[nParam]);
  1187. pDC->SetBkMode(bCloseTag ? TRANSPARENT : OPAQUE);
  1188. }
  1189. break;
  1190. case CMD_HORZ_LINE_PERCENT:
  1191. //Horizontal line with percent length
  1192. if (bCalculate)
  1193. {
  1194. percent.SetAt(nLine, percent.GetAt(nLine) + nParam);
  1195. nParam = 0;
  1196. }
  1197. else nParam = ::MulDiv(rect.Width(), nParam, 100);
  1198. case CMD_HORZ_LINE:
  1199. //Horizontal line with absolute length
  1200. //If text to output is exist
  1201. if (!bCalculate)
  1202. DrawHorzLine(pDC, ptCur.x, ptCur.x + nParam, ptCur.y + m_nHeightLines.GetAt(nLine) / 2);
  1203. ptCur.x += nParam;
  1204. break;
  1205. case CMD_DRAW_IMAGE:
  1206. if (!sParam.IsEmpty())
  1207. {
  1208. if (bCalculate)
  1209. {
  1210. szLine = DrawResource(sParam, pDC, ptCur, 0, szIcon, bCalculate);
  1211. nLineHeight = max (nLineHeight, szLine.cy);
  1212. }
  1213. else
  1214. szLine = DrawResource(sParam, pDC, ptCur, m_nHeightLines.GetAt(nLine), szIcon, bCalculate);
  1215. ptCur.x += szLine.cx;
  1216. }
  1217. break;
  1218. case CMD_DRAW_IMAGE_LIST:
  1219. if (m_imgTooltip.m_hImageList != NULL)
  1220. {
  1221. if (bCalculate)
  1222. {
  1223. szLine = DrawIconFromImageList(pDC, ptCur, m_szImage, m_imgTooltip, nParam, bCalculate);
  1224. nLineHeight = max (nLineHeight, szLine.cy);
  1225. }
  1226. else
  1227. {
  1228. szLine = DrawIconFromImageList(pDC, ptCur, m_szImage, m_imgTooltip, nParam, bCalculate);
  1229. }
  1230. // If in one line a few bitmap with different height, then store max height
  1231. ptCur.x += szLine.cx; //m_szImage.cx;
  1232. }
  1233. break;
  1234. case CMD_DRAW_BITMAP:
  1235. if (nParam != 0)
  1236. {
  1237. if (bCalculate)
  1238. {
  1239. szLine = DrawBitmap(pDC, ptCur, 0, nParam, !sParam.IsEmpty(), nParam1, szIcon, bCalculate);
  1240. nLineHeight = max (nLineHeight, szLine.cy);
  1241. }
  1242. else
  1243. {
  1244. szLine = DrawBitmap(pDC, ptCur, m_nHeightLines.GetAt(nLine), nParam, !sParam.IsEmpty(), nParam1, szIcon, bCalculate);
  1245. }
  1246. // If in one line a few bitmap with different height, then store max height
  1247. ptCur.x += szLine.cx;
  1248. }
  1249. case CMD_DRAW_ICON:
  1250. if (nParam != 0)
  1251. {
  1252. if (bCalculate)
  1253. {
  1254. szLine = DrawIcon(pDC, ptCur, 0, nParam, szIcon, bCalculate);
  1255. nLineHeight = max (nLineHeight, szLine.cy);
  1256. }
  1257. else
  1258. {
  1259. szLine = DrawIcon(pDC, ptCur, m_nHeightLines.GetAt(nLine), nParam, szIcon, bCalculate);
  1260. }
  1261. // If in one line a few bitmap with different height, then store max height
  1262. ptCur.x += szLine.cx;
  1263. }
  1264. break;
  1265. case CMD_NEW_LINE:
  1266. //New line
  1267. if (!nParam)
  1268. nParam = 1;
  1269. if (bCalculate)
  1270. {
  1271. sz.cx = max(sz.cx, ptCur.x - pt.x);
  1272. m_nLengthLines.Add(ptCur.x - pt.x); //Adds the real length of the lines
  1273. m_nHeightLines.Add(nLineHeight); //Adds the real height of the lines
  1274. }
  1275. ptCur.y += m_nHeightLines.GetAt(nLine) * nParam;
  1276. nLine ++;
  1277. percent.Add(0);
  1278. bFirstOutput = TRUE;
  1279. ptCur.x = pt.x;
  1280. nLineHeight = nHeight;
  1281. // szLine.cy = nHeight;
  1282. break;
  1283. case CMD_TABULATION:
  1284. //Tabulation
  1285. if (!nParam)
  1286. nParam = 1;
  1287. nParam1 = (ptCur.x - pt.x) % (nWidth * 4);
  1288. if (nParam1)
  1289. {
  1290. //aligns with tab
  1291. ptCur.x += (nWidth * 4) - nParam1;
  1292. nParam --;
  1293. }
  1294. ptCur.x += (nParam * nWidth * 4);
  1295. break;
  1296. }
  1297. }
  1298. //Gets real height of the tooltip
  1299. sz.cy = ptCur.y - pt.y;
  1300. pDC->SelectObject(pOldFont);
  1301. font.DeleteObject();
  1302. //Adds the percent's length to the line's length
  1303. for (i = 0; i < percent.GetSize(); i++)
  1304. {
  1305. if (percent.GetAt(i))
  1306. m_nLengthLines.SetAt(i, m_nLengthLines.GetAt(i) + ::MulDiv(percent.GetAt(i), sz.cx, 100));
  1307. }
  1308. return sz;
  1309. }
  1310. CString CPPToolTip::SearchBeginOfTag(CString & str, int & nIndex)
  1311. {
  1312. CString sText = _T("");
  1313. BOOL bTagFound = FALSE;
  1314. for (nIndex; nIndex < str.GetLength(); nIndex ++)
  1315. {
  1316. switch (str.GetAt(nIndex))
  1317. {
  1318. case _T('r'):
  1319. break;
  1320. case _T('<'):
  1321. nIndex ++;
  1322. if ((nIndex < str.GetLength()) && (str.GetAt(nIndex) != _T('<')))
  1323. {
  1324. if (!sText.IsEmpty())
  1325. nIndex --;
  1326. return sText;
  1327. }
  1328. sText += _T('<');
  1329. break;
  1330. case _T('t'):
  1331. case _T('n'):
  1332. if (!sText.IsEmpty())
  1333. nIndex--;
  1334. return sText;
  1335. default:
  1336. sText += str.GetAt(nIndex);
  1337. break;
  1338. }
  1339. }
  1340. return sText;
  1341. }
  1342. void CPPToolTip::SearchEndOfTag(CString & str, int & nIndex)
  1343. {
  1344. for (nIndex; nIndex < str.GetLength(); nIndex ++)
  1345. {
  1346. switch (str.GetAt(nIndex))
  1347. {
  1348. case _T('>'):
  1349. case _T('n'):
  1350. case _T('t'):
  1351. return;
  1352. }
  1353. }
  1354. }
  1355. CString CPPToolTip::GetNameOfTag(CString & str, int & nIndex)
  1356. {
  1357. CString sText = _T("");
  1358. for (nIndex; nIndex < str.GetLength(); nIndex ++)
  1359. {
  1360. switch (str.GetAt(nIndex))
  1361. {
  1362. case _T('r'): //Pass character
  1363. break;
  1364. case _T('t'): //It is a tab tag
  1365. case _T('n'): //It is a new line tag
  1366. if (sText.IsEmpty())
  1367. {
  1368. sText += str.GetAt(nIndex);
  1369. // nIndex ++;
  1370. return sText;
  1371. }
  1372. break;
  1373. case _T(' '):
  1374. if (!sText.IsEmpty())
  1375. {
  1376. nIndex ++;
  1377. return sText;
  1378. }
  1379. break;
  1380. case _T('>'):
  1381. case _T('='):
  1382. return sText;
  1383. default:
  1384. sText += str.GetAt(nIndex);
  1385. break;
  1386. }
  1387. }
  1388. return sText;
  1389. }
  1390. CString CPPToolTip::GetPropertiesOfTag(CString & str, int & nIndex)
  1391. {
  1392. CString sText = _T("");
  1393. for (nIndex; nIndex < str.GetLength(); nIndex ++)
  1394. {
  1395. switch (str.GetAt(nIndex))
  1396. {
  1397. case _T('r'): //Pass characters
  1398. case _T('t'):
  1399. case _T('n'):
  1400. break;
  1401. case _T(' '):
  1402. if (!sText.IsEmpty())
  1403. {
  1404. nIndex ++;
  1405. return sText;
  1406. }
  1407. break;
  1408. case _T('>'):
  1409. case _T('='):
  1410. return sText;
  1411. default:
  1412. sText += str.GetAt(nIndex);
  1413. break;
  1414. }
  1415. }
  1416. return sText;
  1417. }
  1418. CString CPPToolTip::GetStringValue(CString & str, int & nIndex)
  1419. {
  1420. CString sText = _T("");
  1421. BOOL bValueFound = FALSE;
  1422. for (nIndex; nIndex < str.GetLength(); nIndex ++)
  1423. {
  1424. switch (str.GetAt(nIndex))
  1425. {
  1426. case _T('r'): //Pass character
  1427. case _T('t'): //It is a tab tag
  1428. case _T('n'): //It is a new line tag
  1429. break;
  1430. case _T(' '):
  1431. if (!sText.IsEmpty())
  1432. {
  1433. nIndex ++;
  1434. return sText;
  1435. }
  1436. break;
  1437. case _T('>'):
  1438. return sText;
  1439. case _T('='):
  1440. bValueFound = TRUE;
  1441. break;
  1442. default:
  1443. if (!bValueFound)
  1444. return sText;
  1445. sText += str.GetAt(nIndex);
  1446. break;
  1447. }
  1448. }
  1449. return sText;
  1450. }
  1451. UINT CPPToolTip::GetUIntValue(CString & str, int & nIndex, UINT nDefValue)
  1452. {
  1453. CString sText = GetStringValue(str, nIndex);
  1454. if (!sText.IsEmpty())
  1455. nDefValue = _tcstoul(sText, 0, 0);
  1456. return nDefValue;
  1457. }
  1458. CSize CPPToolTip::DrawResource(CString sName, CDC * pDC, CPoint pt, int nMaxHeight, CSize szResource, BOOL bCalculate)
  1459. {
  1460. CSize sz(0, 0);
  1461. int nIndex = FindIdOfResource(sName);
  1462. if (nIndex < 0)
  1463. return sz;
  1464. PPTOOLTIP_NAME_RES nr = m_arrNameRes.GetAt(nIndex);
  1465. if (nr.nID == 0)
  1466. return sz;
  1467. switch (nr.nTypeRes)
  1468. {
  1469. case TYPE_RES_ICON:
  1470. sz = DrawIcon(pDC, pt, nMaxHeight, nr.nID, szResource, bCalculate);
  1471. break;
  1472. case TYPE_RES_BITMAP:
  1473. sz = DrawBitmap(pDC, pt, nMaxHeight, nr.nID, FALSE, nr.crMask, szResource, bCalculate);
  1474. break;
  1475. case TYPE_RES_MASK_BITMAP:
  1476. sz = DrawBitmap(pDC, pt, nMaxHeight, nr.nID, TRUE, nr.crMask, szResource, bCalculate);
  1477. break;
  1478. }
  1479. return sz;
  1480. }
  1481. CSize CPPToolTip::DrawBitmap(CDC * pDC, CPoint pt, int nMaxHeight, UINT nID, BOOL bUseMask, COLORREF crMask, CSize szBitmap, BOOL bCalculate)
  1482. {
  1483. CSize sz(0, 0);
  1484. HBITMAP hBitmap = GetBitmapFromResources(nID);
  1485. int nRetValue;
  1486. BITMAP csBitmapSize;
  1487. if (hBitmap == NULL)
  1488. return sz;
  1489. // Get bitmap size
  1490. nRetValue = ::GetObject(hBitmap, sizeof(csBitmapSize), &csBitmapSize);
  1491. if (nRetValue == 0)
  1492. return sz;
  1493. sz.cx = (DWORD)csBitmapSize.bmWidth;
  1494. sz.cy = (DWORD)csBitmapSize.bmHeight;
  1495. if (!szBitmap.cy)
  1496. szBitmap.cy = sz.cy;
  1497. if (!szBitmap.cx)
  1498. szBitmap.cx = sz.cx;
  1499. if (bCalculate)
  1500. return szBitmap;
  1501. HDC hSrcDC = ::CreateCompatibleDC(pDC->m_hDC);
  1502. HDC hResDC = ::CreateCompatibleDC(pDC->m_hDC);
  1503. HBITMAP hSrcBitmap = ::CreateCompatibleBitmap(pDC->m_hDC, szBitmap.cx, szBitmap.cy);
  1504. HBITMAP hOldSrcBitmap = (HBITMAP)::SelectObject(hSrcDC, hSrcBitmap);
  1505. HBITMAP hOldResBitmap = (HBITMAP)::SelectObject(hResDC, hBitmap);
  1506. //Scales a bitmap if need
  1507. if ((sz.cx != szBitmap.cx) || (sz.cy != szBitmap.cy))
  1508. ::StretchBlt(hSrcDC, 0, 0, szBitmap.cx, szBitmap.cy, hResDC, 0, 0, sz.cx, sz.cy, SRCCOPY);
  1509. else
  1510. ::BitBlt(hSrcDC, 0, 0, szBitmap.cx, szBitmap.cy, hResDC, 0, 0, SRCCOPY);
  1511. ::SelectObject(hResDC, hOldResBitmap);
  1512. ::DeleteDC(hResDC);
  1513. ::DeleteObject(hOldResBitmap);
  1514. ::DeleteObject(hBitmap);
  1515. pt.y += (nMaxHeight - szBitmap.cy);
  1516. if (bUseMask)
  1517. {
  1518. //Draws a bitmap with mask
  1519. ::SelectObject(hSrcDC, hOldSrcBitmap);
  1520. CImageList img;
  1521. img.Create(szBitmap.cx, szBitmap.cy, ILC_COLOR32 | ILC_MASK, 1, 1);
  1522. img.Add(CBitmap::FromHandle(hSrcBitmap), crMask);
  1523. DrawIconFromImageList(pDC, pt, szBitmap, img, 0, FALSE);
  1524. }
  1525. else
  1526. {
  1527. //Draws a bitmap without mask
  1528. pDC->BitBlt(pt.x, pt.y, szBitmap.cx, szBitmap.cy, CDC::FromHandle(hSrcDC), 0, 0, SRCCOPY);
  1529. ::SelectObject(hSrcDC, hOldSrcBitmap);
  1530. }
  1531. ::DeleteDC(hSrcDC);
  1532. ::DeleteObject(hOldSrcBitmap);
  1533. ::DeleteObject(hSrcBitmap);
  1534. return szBitmap;
  1535. }
  1536. CSize CPPToolTip::DrawIcon(CDC * pDC, CPoint pt, int nMaxHeight, UINT nID, CSize szIcon, BOOL bCalculate)
  1537. {
  1538. CSize sz (0, 0);
  1539. HICON hIcon = GetIconFromResources(nID, szIcon);
  1540. if (hIcon != NULL)
  1541. {
  1542. sz = GetSizeIcon(hIcon);
  1543. if (!bCalculate)
  1544. {
  1545. pt.y += (nMaxHeight - sz.cy);
  1546. pDC->DrawState(pt, sz, hIcon, DSS_NORMAL, (CBrush*)NULL);
  1547. }
  1548. }
  1549. if (hIcon)
  1550. ::DestroyIcon(hIcon);
  1551. return sz;
  1552. }
  1553. CSize CPPToolTip::DrawIconFromImageList(CDC * pDC, CPoint pt, CSize sz, CImageList & img, int nIndex /* = 0 */, BOOL bCalculate /* = TRUE */)
  1554. {
  1555. if (img.GetSafeHandle() == NULL)
  1556. return CSize (0, 0);
  1557. int nCount = img.GetImageCount();
  1558. if (nIndex >= nCount)
  1559. return CSize (0, 0);
  1560. if (bCalculate)
  1561. return sz;
  1562. HICON hIcon = img.ExtractIcon(nIndex);
  1563. pDC->DrawState(pt, sz, hIcon, DSS_NORMAL, (CBrush*)NULL);
  1564. if (hIcon)
  1565. DestroyIcon(hIcon);
  1566. return sz;
  1567. }
  1568. void CPPToolTip::DrawHorzLine(CDC * pDC, int xStart, int xEnd, int y) const
  1569. {
  1570. CPen pen(PS_SOLID, 1, pDC->GetTextColor());
  1571. CPen * penOld = pDC->SelectObject(&pen);
  1572. pDC->MoveTo(xStart, y);
  1573. pDC->LineTo(xEnd, y);
  1574. pDC->SelectObject(penOld);
  1575. pen.DeleteObject();
  1576. }
  1577. void CPPToolTip::FillGradient ( CDC * pDC, CRect rect, 
  1578. COLORREF colorStart, COLORREF colorFinish, 
  1579. BOOL bHorz/* = TRUE*/)
  1580. {
  1581.     // this will make 2^6 = 64 fountain steps
  1582.     int nShift = 6;
  1583.     int nSteps = 1 << nShift;
  1584.     for (int i = 0; i < nSteps; i++)
  1585.     {
  1586.         // do a little alpha blending
  1587.         BYTE bR = (BYTE) ((GetRValue(colorStart) * (nSteps - i) +
  1588.                    GetRValue(colorFinish) * i) >> nShift);
  1589.         BYTE bG = (BYTE) ((GetGValue(colorStart) * (nSteps - i) +
  1590.                    GetGValue(colorFinish) * i) >> nShift);
  1591.         BYTE bB = (BYTE) ((GetBValue(colorStart) * (nSteps - i) +
  1592.                    GetBValue(colorFinish) * i) >> nShift);
  1593. CBrush br (RGB(bR, bG, bB));
  1594.         // then paint with the resulting color
  1595.         CRect r2 = rect;
  1596.         if (!bHorz)
  1597.         {
  1598.             r2.top = rect.top + 
  1599.                 ((i * rect.Height()) >> nShift);
  1600.             r2.bottom = rect.top + 
  1601.                 (((i + 1) * rect.Height()) >> nShift);
  1602.             if (r2.Height() > 0)
  1603.                 pDC->FillRect(r2, &br);
  1604.         }
  1605.         else
  1606.         {
  1607.             r2.left = rect.left + 
  1608.                 ((i * rect.Width()) >> nShift);
  1609.             r2.right = rect.left + 
  1610.                 (((i + 1) * rect.Width()) >> nShift);
  1611.             if (r2.Width() > 0)
  1612.                 pDC->FillRect(r2, &br);
  1613.         }
  1614.     }
  1615. }
  1616. #ifdef PPTOOLTIP_USE_SHADE
  1617. void CPPToolTip::SetShade(CRect rect, UINT shadeID /* = 0 */, BYTE granularity /* = 8 */, 
  1618.   BYTE coloring /* = 0 */, COLORREF color /* = 0 */)
  1619. {
  1620. long sXSize,sYSize,bytes,j,i,k,h;
  1621. BYTE *iDst ,*posDst;
  1622. sYSize= rect.Height(); //rect.bottom-rect.top;
  1623. sXSize= rect.Width(); //rect.right-rect.left ;
  1624. m_dh.Create(max(1,sXSize /*-2*m_FocusRectMargin-1*/ ),1,8); //create the horizontal focus bitmap
  1625. m_dv.Create(1,max(1,sYSize /*-2*m_FocusRectMargin*/),8); //create the vertical focus bitmap
  1626. m_dNormal.Create(sXSize,sYSize,8); //create the default bitmap
  1627. COLORREF hicr = m_pToolInfo.crBegin; //GetSysColor(COLOR_BTNHIGHLIGHT); //get the button base colors
  1628. COLORREF midcr = m_pToolInfo.crMid;  //GetSysColor(COLOR_BTNFACE);
  1629. COLORREF locr = m_pToolInfo.crEnd;   //GetSysColor(COLOR_BTNSHADOW);
  1630. long r,g,b; //build the shaded palette
  1631. for(i=0;i<129;i++){
  1632. r=((128-i)*GetRValue(locr)+i*GetRValue(midcr))/128;
  1633. g=((128-i)*GetGValue(locr)+i*GetGValue(midcr))/128;
  1634. b=((128-i)*GetBValue(locr)+i*GetBValue(midcr))/128;
  1635. m_dNormal.SetPaletteIndex((BYTE)i,(BYTE)r,(BYTE)g,(BYTE)b);
  1636. m_dh.SetPaletteIndex((BYTE)i,(BYTE)r,(BYTE)g,(BYTE)b);
  1637. m_dv.SetPaletteIndex((BYTE)i,(BYTE)r,(BYTE)g,(BYTE)b);
  1638. }
  1639. for(i=1;i<129;i++){
  1640. r=((128-i)*GetRValue(midcr)+i*GetRValue(hicr))/128;
  1641. g=((128-i)*GetGValue(midcr)+i*GetGValue(hicr))/128;
  1642. b=((128-i)*GetBValue(midcr)+i*GetBValue(hicr))/128;
  1643. m_dNormal.SetPaletteIndex((BYTE)(i+127),(BYTE)r,(BYTE)g,(BYTE)b);
  1644. m_dh.SetPaletteIndex((BYTE)(i+127),(BYTE)r,(BYTE)g,(BYTE)b);
  1645. m_dv.SetPaletteIndex((BYTE)(i+127),(BYTE)r,(BYTE)g,(BYTE)b);
  1646. }
  1647. m_dNormal.BlendPalette(color,coloring); //color the palette
  1648. iDst=m_dh.GetBits(); //build the horiz. dotted focus bitmap
  1649. j=(long)m_dh.GetWidth();
  1650. for(i=0;i<j;i++){
  1651. // iDst[i]=64+127*(i%2); //soft
  1652. iDst[i]=255*(i%2); //hard
  1653. }
  1654. iDst=m_dv.GetBits(); //build the vert. dotted focus bitmap
  1655. j=(long)m_dv.GetHeight();
  1656. for(i=0;i<j;i++){
  1657. // *iDst=64+127*(i%2); //soft
  1658. *iDst=255*(i%2); //hard
  1659. iDst+=4;
  1660. }
  1661. bytes = m_dNormal.GetLineWidth();
  1662. iDst = m_dNormal.GetBits();
  1663. posDst =iDst;
  1664. long a,x,y,d,xs,idxmax,idxmin;
  1665. int grainx2=RAND_MAX/(max(1,2*granularity));
  1666. idxmax=255-granularity;
  1667. idxmin=granularity;
  1668. switch (shadeID)
  1669. {
  1670. //----------------------------------------------------
  1671. case PPTOOLTIP_EFFECT_METAL:
  1672. m_dNormal.Clear();
  1673. // create the strokes
  1674. k=40; //stroke granularity
  1675. for(a=0;a<200;a++){
  1676. x=rand()/(RAND_MAX/sXSize); //stroke postion
  1677. y=rand()/(RAND_MAX/sYSize); //stroke position
  1678. xs=rand()/(RAND_MAX/min(sXSize,sYSize))/2; //stroke lenght
  1679. d=rand()/(RAND_MAX/k); //stroke color
  1680. for(i=0;i<xs;i++){
  1681. if (((x-i)>0)&&((y+i)<sYSize))
  1682. m_dNormal.SetPixelIndex(x-i,y+i,(BYTE)d);
  1683. if (((x+i)<sXSize)&&((y-i)>0))
  1684. m_dNormal.SetPixelIndex(sXSize-x+i,y-i,(BYTE)d);
  1685. }
  1686. }
  1687. //blend strokes with SHS_DIAGONAL
  1688. posDst =iDst;
  1689. a=(idxmax-idxmin-k)/2;
  1690. for(i = 0; i < sYSize; i++) {
  1691. for(j = 0; j < sXSize; j++) {
  1692. d=posDst[j]+((a*i)/sYSize+(a*(sXSize-j))/sXSize);
  1693. posDst[j]=(BYTE)d;
  1694. posDst[j]+=rand()/grainx2;
  1695. }
  1696. posDst+=bytes;
  1697. }
  1698. break;
  1699. //----------------------------------------------------
  1700. case PPTOOLTIP_EFFECT_HARDBUMP: // 
  1701. //set horizontal bump
  1702. for(i = 0; i < sYSize; i++) {
  1703. k=(255*i/sYSize)-127;
  1704. k=(k*(k*k)/128)/128;
  1705. k=(k*(128-granularity*2))/128+128;
  1706. for(j = 0; j < sXSize; j++) {
  1707. posDst[j]=(BYTE)k;
  1708. posDst[j]+=rand()/grainx2-granularity;
  1709. }
  1710. posDst+=bytes;
  1711. }
  1712. //set vertical bump
  1713. d=min(16,sXSize/6); //max edge=16
  1714. a=sYSize*sYSize/4;
  1715. posDst =iDst;
  1716. for(i = 0; i < sYSize; i++) {
  1717. y=i-sYSize/2;
  1718. for(j = 0; j < sXSize; j++) {
  1719. x=j-sXSize/2;
  1720. xs=sXSize/2-d+(y*y*d)/a;
  1721. if (x>xs) posDst[j]=idxmin+(BYTE)(((sXSize-j)*128)/d);
  1722. if ((x+xs)<0) posDst[j]=idxmax-(BYTE)((j*128)/d);
  1723. posDst[j]+=rand()/grainx2-granularity;
  1724. }
  1725. posDst+=bytes;
  1726. }
  1727. break;
  1728. //----------------------------------------------------
  1729. case PPTOOLTIP_EFFECT_SOFTBUMP: //
  1730. for(i = 0; i < sYSize; i++) {
  1731. h=(255*i/sYSize)-127;
  1732. for(j = 0; j < sXSize; j++) {
  1733. k=(255*(sXSize-j)/sXSize)-127;
  1734. k=(h*(h*h)/128)/128+(k*(k*k)/128)/128;
  1735. k=k*(128-granularity)/128+128;
  1736. if (k<idxmin) k=idxmin;
  1737. if (k>idxmax) k=idxmax;
  1738. posDst[j]=(BYTE)k;
  1739. posDst[j]+=rand()/grainx2-granularity;
  1740. }
  1741. posDst+=bytes;
  1742. }
  1743. break;
  1744. //----------------------------------------------------
  1745. case PPTOOLTIP_EFFECT_VBUMP: // 
  1746. for(j = 0; j < sXSize; j++) {
  1747. k=(255*(sXSize-j)/sXSize)-127;
  1748. k=(k*(k*k)/128)/128;
  1749. k=(k*(128-granularity))/128+128;
  1750. for(i = 0; i < sYSize; i++) {
  1751. posDst[j+i*bytes]=(BYTE)k;
  1752. posDst[j+i*bytes]+=rand()/grainx2-granularity;
  1753. }
  1754. }
  1755. break;
  1756. //----------------------------------------------------
  1757. case PPTOOLTIP_EFFECT_HBUMP: //
  1758. for(i = 0; i < sYSize; i++) {
  1759. k=(255*i/sYSize)-127;
  1760. k=(k*(k*k)/128)/128;
  1761. k=(k*(128-granularity))/128+128;
  1762. for(j = 0; j < sXSize; j++) {
  1763. posDst[j]=(BYTE)k;
  1764. posDst[j]+=rand()/grainx2-granularity;
  1765. }
  1766. posDst+=bytes;
  1767. }
  1768. break;
  1769. //----------------------------------------------------
  1770. case PPTOOLTIP_EFFECT_DIAGSHADE: //
  1771. a=(idxmax-idxmin)/2;
  1772. for(i = 0; i < sYSize; i++) {
  1773. for(j = 0; j < sXSize; j++) {
  1774. posDst[j]=(BYTE)(idxmin+a*i/sYSize+a*(sXSize-j)/sXSize);
  1775. posDst[j]+=rand()/grainx2-granularity;
  1776. }
  1777. posDst+=bytes;
  1778. }
  1779. break;
  1780. //----------------------------------------------------
  1781. case PPTOOLTIP_EFFECT_HSHADE: //
  1782. a=idxmax-idxmin;
  1783. for(i = 0; i < sYSize; i++) {
  1784. k=a*i/sYSize+idxmin;
  1785. for(j = 0; j < sXSize; j++) {
  1786. posDst[j]=(BYTE)k;
  1787. posDst[j]+=rand()/grainx2-granularity;
  1788. }
  1789. posDst+=bytes;
  1790. }
  1791. break;
  1792. //----------------------------------------------------
  1793. case PPTOOLTIP_EFFECT_VSHADE: //:
  1794. a=idxmax-idxmin;
  1795. for(j = 0; j < sXSize; j++) {
  1796. k=a*(sXSize-j)/sXSize+idxmin;
  1797. for(i = 0; i < sYSize; i++) {
  1798. posDst[j+i*bytes]=(BYTE)k;
  1799. posDst[j+i*bytes]+=rand()/grainx2-granularity;
  1800. }
  1801. }
  1802. break;
  1803. //----------------------------------------------------
  1804. case PPTOOLTIP_EFFECT_NOISE:
  1805. for(i = 0; i < sYSize; i++) {
  1806. for(j = 0; j < sXSize; j++) {
  1807. posDst[j]=128+rand()/grainx2-granularity;
  1808. }
  1809. posDst+=bytes;
  1810. }
  1811. }
  1812. //----------------------------------------------------
  1813. }
  1814. #endif
  1815. HICON CPPToolTip::GetIconFromResources(UINT nID, CSize szIcon /* = CSize(0, 0) */) const
  1816. {
  1817. // Find correct resource handle
  1818. HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nID), RT_GROUP_ICON);
  1819. // Set icon when the mouse is IN the button
  1820. HICON hIcon = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(nID), IMAGE_ICON, szIcon.cx, szIcon.cy, 0);
  1821. return hIcon;
  1822. }
  1823. HBITMAP CPPToolTip::GetBitmapFromResources(UINT nID) const
  1824. {
  1825. // Find correct resource handle
  1826. HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(nID), RT_BITMAP);
  1827. // Load bitmap
  1828. HBITMAP hBitmap = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(nID), IMAGE_BITMAP, 0, 0, 0);
  1829. return hBitmap;
  1830. }
  1831. ///////////////////////////////////////////////////////////////////////////////
  1832. ///////////////////////////////////////////////////////////////////////////////
  1833. ///////////////////////////////////////////////////////////////////////////////
  1834. /////////////////////////////////////////////////////////////////////////////
  1835. //  CPPToolTip::SetStyles  (public member function)
  1836. //    Sets the new styles of the control
  1837. //
  1838. //  Parameters :
  1839. // nStyle [in] - new style
  1840. //
  1841. //  Returns :
  1842. // Old styles
  1843. //
  1844. /////////////////////////////////////////////////////////////////////////////
  1845. void CPPToolTip::SetStyles(DWORD nStyles, int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  1846. {
  1847. TRACE(_T("CPPToolTip::SetStyles()n"));
  1848. ModifyStyles(nStyles, -1, nIndexTool);
  1849. }  // End of SetStyles
  1850. /////////////////////////////////////////////////////////////////////////////
  1851. //  CPPToolTip::ModifyStyles  (public member function)
  1852. //    Modify the styles of the control
  1853. //
  1854. //  Parameters :
  1855. // nAddStyle  [in] - The styles to add
  1856. // nRemoveStyle [in] - The styles to remove
  1857. //
  1858. //  Returns :
  1859. // Old styles
  1860. //
  1861. /////////////////////////////////////////////////////////////////////////////
  1862. void CPPToolTip::ModifyStyles(DWORD nAddStyles, DWORD nRemoveStyles, int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  1863. {
  1864. if (!IsExistTool(nIndexTool))
  1865. {
  1866. m_nStyles &= ~nRemoveStyles;
  1867. m_nStyles |= nAddStyles;
  1868. }
  1869. else
  1870. {
  1871. PPTOOLTIP_INFO ti;
  1872. GetTool(nIndexTool, ti);
  1873. if (!(ti.nMask & PPTOOLTIP_MASK_STYLES))
  1874. ti.nStyles = m_nStyles;
  1875. ti.nStyles &= ~nRemoveStyles;
  1876. ti.nStyles |= nAddStyles;
  1877. ti.nMask |= PPTOOLTIP_MASK_STYLES;
  1878. SetAtTool(nIndexTool, ti);
  1879. }
  1880. }  // End of ModifyStyles
  1881. /////////////////////////////////////////////////////////////////////////////
  1882. //  CPPToolTip::GetStyles (public member function)
  1883. //    Gets the current styles of the control
  1884. //
  1885. //  Parameters :
  1886. //
  1887. //  Returns :
  1888. // Current styles
  1889. //
  1890. /////////////////////////////////////////////////////////////////////////////
  1891. DWORD CPPToolTip::GetStyles(int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  1892. {
  1893. TRACE(_T("CPPToolTip::GetStyles()n"));
  1894. if (IsExistTool(nIndexTool))
  1895. {
  1896. PPTOOLTIP_INFO ti;
  1897. GetTool(nIndexTool, ti);
  1898. if (ti.nMask & PPTOOLTIP_MASK_STYLES)
  1899. return ti.nStyles;
  1900. }
  1901. return m_nStyles;
  1902. }  // End of GetStyles
  1903. /////////////////////////////////////////////////////////////////////////////
  1904. //  CPPToolTip::SetDefaultStyles  (public member function)
  1905. //    Sets the new styles of the control
  1906. //
  1907. //  Parameters :
  1908. //
  1909. //  Returns :
  1910. // None
  1911. //
  1912. /////////////////////////////////////////////////////////////////////////////
  1913. void CPPToolTip::SetDefaultStyles(int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  1914. {
  1915. TRACE(_T("CPPToolTip::SetDefaultStyles()n"));
  1916. SetStyles(PPTOOLTIP_BALLOON | PPTOOLTIP_ICON_VCENTER_ALIGN, nIndexTool);
  1917. }  // End of SetDefaultStyles
  1918. /////////////////////////////////////////////////////////////////////////////
  1919. //  CPPToolTip::SetColor (public member function)
  1920. //    Set the color
  1921. //
  1922. //  Parameters :
  1923. // nIndex  [in] - index of the color
  1924. // crColor [in] - new color
  1925. //
  1926. //  Returns :
  1927. // None
  1928. //
  1929. /////////////////////////////////////////////////////////////////////////////
  1930. void CPPToolTip::SetColor(int nIndex, COLORREF crColor)
  1931. {
  1932. TRACE (_T("CPPToolTip::SetColor(nIndex = %d)n"), nIndex);
  1933. if (nIndex >= PPTOOLTIP_MAX_COLORS)
  1934. return;
  1935. m_crColor [nIndex] = crColor;
  1936. }  // End of SetColor
  1937. /////////////////////////////////////////////////////////////////////////////
  1938. //  CPPToolTip::GetColor (public member function)
  1939. //    Set the color
  1940. //
  1941. //  Parameters :
  1942. // nIndex  [in] - index of the color
  1943. //
  1944. //  Returns :
  1945. // Current color
  1946. //
  1947. /////////////////////////////////////////////////////////////////////////////
  1948. COLORREF CPPToolTip::GetColor(int nIndex)
  1949. {
  1950. TRACE (_T("CPPToolTip::GetColor(nIndex = %d)n"), nIndex);
  1951. if (nIndex >= PPTOOLTIP_MAX_COLORS)
  1952. nIndex = PPTOOLTIP_COLOR_FG;
  1953. return m_crColor [nIndex];
  1954. }  // End of GetColor
  1955. /////////////////////////////////////////////////////////////////////////////
  1956. //  CPPToolTip::SetDefaultColors (public member function)
  1957. //    Set the color as default
  1958. //
  1959. //  Parameters :
  1960. // None
  1961. //
  1962. //  Returns :
  1963. // None
  1964. //
  1965. /////////////////////////////////////////////////////////////////////////////
  1966. void CPPToolTip::SetDefaultColors()
  1967. {
  1968. TRACE (_T("CPPToolTip::SetDefaultColorsn"));
  1969. SetColor(PPTOOLTIP_COLOR_0, RGB (0, 0, 0));
  1970. SetColor(PPTOOLTIP_COLOR_1, RGB (0, 0, 128));
  1971. SetColor(PPTOOLTIP_COLOR_2, RGB (0, 128, 0));
  1972. SetColor(PPTOOLTIP_COLOR_3, RGB (0, 128, 128));
  1973. SetColor(PPTOOLTIP_COLOR_4, RGB (128, 0, 0));
  1974. SetColor(PPTOOLTIP_COLOR_5, RGB (128, 0, 128));
  1975. SetColor(PPTOOLTIP_COLOR_6, RGB (128, 128, 0));
  1976. SetColor(PPTOOLTIP_COLOR_7, RGB (128, 128, 128));
  1977. SetColor(PPTOOLTIP_COLOR_8, RGB (0, 0, 255));
  1978. SetColor(PPTOOLTIP_COLOR_9, RGB (0, 255, 0));
  1979. SetColor(PPTOOLTIP_COLOR_10, RGB (0, 255, 255));
  1980. SetColor(PPTOOLTIP_COLOR_11, RGB (255, 0, 0));
  1981. SetColor(PPTOOLTIP_COLOR_12, RGB (255, 0, 255));
  1982. SetColor(PPTOOLTIP_COLOR_13, RGB (255, 255, 0));
  1983. SetColor(PPTOOLTIP_COLOR_14, RGB (192, 192, 192));
  1984. SetColor(PPTOOLTIP_COLOR_15, RGB (255, 255, 255));
  1985. SetColor(PPTOOLTIP_COLOR_FG, ::GetSysColor(COLOR_INFOTEXT));
  1986. SetColor(PPTOOLTIP_COLOR_BK_BEGIN, ::GetSysColor(COLOR_INFOBK));
  1987. SetColor(PPTOOLTIP_COLOR_BK_MID, ::GetSysColor(COLOR_INFOBK));
  1988. SetColor(PPTOOLTIP_COLOR_BK_END, ::GetSysColor(COLOR_INFOBK));
  1989. SetColor(PPTOOLTIP_COLOR_LINK, RGB(0, 0, 238));
  1990. SetColor(PPTOOLTIP_COLOR_VISITED, RGB(85, 26, 139));
  1991. SetColor(PPTOOLTIP_COLOR_HOVER, RGB(255, 0, 0));
  1992. SetColor(PPTOOLTIP_COLOR_SHADOW, ::GetSysColor(COLOR_3DSHADOW));
  1993. SetColor(PPTOOLTIP_COLOR_BORDER, ::GetSysColor(COLOR_INFOTEXT));
  1994. }  // End of SetDefaultColors
  1995. /////////////////////////////////////////////////////////////////////////////
  1996. //  CPPToolTip::SetGradientColors (public member function)
  1997. //    Set the gradient colors
  1998. //
  1999. //  Parameters :
  2000. // crStart [in] - start color
  2001. // crEnd [in] - end color
  2002. //
  2003. //  Returns :
  2004. // None
  2005. //
  2006. /////////////////////////////////////////////////////////////////////////////
  2007. void CPPToolTip::SetGradientColors(COLORREF crBegin, COLORREF crMid, COLORREF crEnd, int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  2008. {
  2009. TRACE (_T("CPPToolTip::SetGradientColorsn"));
  2010. if (!IsExistTool(nIndexTool))
  2011. {
  2012. SetColor(PPTOOLTIP_COLOR_BK_BEGIN, crBegin);
  2013. SetColor(PPTOOLTIP_COLOR_BK_MID, crMid);
  2014. SetColor(PPTOOLTIP_COLOR_BK_END, crEnd);
  2015. }
  2016. else
  2017. {
  2018. PPTOOLTIP_INFO ti;
  2019. GetTool(nIndexTool, ti);
  2020. ti.crBegin = crBegin;
  2021. ti.crMid = crMid;
  2022. ti.crEnd = crEnd;
  2023. ti.nMask |= PPTOOLTIP_MASK_COLORS;
  2024. SetAtTool(nIndexTool, ti);
  2025. }
  2026. } // End of SetGradientColors
  2027. /////////////////////////////////////////////////////////////////////////////
  2028. //  CPPToolTip::GetGradientColors (public member function)
  2029. //    Set the gradient colors
  2030. //
  2031. //  Parameters :
  2032. // None
  2033. //
  2034. //  Returns :
  2035. // crStart [out] - start color
  2036. // crEnd [out] - end color
  2037. //
  2038. /////////////////////////////////////////////////////////////////////////////
  2039. void CPPToolTip::GetGradientColors(COLORREF & crBegin, COLORREF & crMid, COLORREF & crEnd, int nIndexTool /* = -1 */)
  2040. {
  2041. TRACE (_T("CPPToolTip::GetGradientColorsn"));
  2042. if (IsExistTool(nIndexTool))
  2043. {
  2044. PPTOOLTIP_INFO ti;
  2045. GetTool(nIndexTool, ti);
  2046. if (ti.nMask & PPTOOLTIP_MASK_COLORS)
  2047. {
  2048. crBegin = ti.crBegin;
  2049. crMid = ti.crMid;
  2050. crEnd = ti.crEnd;
  2051. return;
  2052. }
  2053. }
  2054. crBegin = GetColor(PPTOOLTIP_COLOR_BK_BEGIN);
  2055. crMid = GetColor(PPTOOLTIP_COLOR_BK_MID);
  2056. crEnd = GetColor(PPTOOLTIP_COLOR_BK_END);
  2057. } // End of GetGradientColors
  2058. void CPPToolTip::SetMaskTool(int nIndexTool, UINT nMask /* = 0 */)
  2059. {
  2060. ModifyMaskTool(nIndexTool, nMask, -1);
  2061. }
  2062. void CPPToolTip::ModifyMaskTool(int nIndexTool, UINT nAddMask, UINT nRemoveMask)
  2063. {
  2064. if (!IsExistTool(nIndexTool))
  2065. return;
  2066. PPTOOLTIP_INFO ti;
  2067. GetTool(nIndexTool, ti);
  2068. ti.nMask &= ~nRemoveMask;
  2069. ti.nMask |= nAddMask;
  2070. SetAtTool(nIndexTool, ti);
  2071. }
  2072. UINT CPPToolTip::GetMaskTool(int nIndexTool)
  2073. {
  2074. if (!IsExistTool(nIndexTool))
  2075. return 0;
  2076. PPTOOLTIP_INFO ti;
  2077. GetTool(nIndexTool, ti);
  2078. return ti.nMask;
  2079. }
  2080. /////////////////////////////////////////////////////////////////////////////
  2081. //  CPPToolTip::SetEffectBk (public member function)
  2082. //    sets the background's effect
  2083. //
  2084. //  Parameters :
  2085. // nEffect [in]  - the background's effect 
  2086. //
  2087. //  Returns :
  2088. // None 
  2089. //
  2090. /////////////////////////////////////////////////////////////////////////////
  2091. void CPPToolTip::SetEffectBk(UINT nEffect, BYTE nGranularity /* = 2 */, int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  2092. {
  2093. TRACE (_T("CPPToolTip::SetEffectBkn"));
  2094. if (!IsExistTool(nIndexTool))
  2095. {
  2096. m_nEffect = nEffect;
  2097. m_nGranularity = nGranularity;
  2098. }
  2099. else
  2100. {
  2101. PPTOOLTIP_INFO ti;
  2102. GetTool(nIndexTool, ti);
  2103. ti.nEffect = nEffect;
  2104. ti.nGranularity = nGranularity;
  2105. ti.nMask |= PPTOOLTIP_MASK_EFFECT;
  2106. SetAtTool(nIndexTool, ti);
  2107. }
  2108. } // End SetEffectBk
  2109. /////////////////////////////////////////////////////////////////////////////
  2110. //  CPPToolTip::GetEffectBk (public member function)
  2111. //    gets the background's effect
  2112. //
  2113. //  Parameters :
  2114. // None 
  2115. //
  2116. //  Returns :
  2117. // the background's effect 
  2118. //
  2119. /////////////////////////////////////////////////////////////////////////////
  2120. UINT CPPToolTip::GetEffectBk(int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  2121. {
  2122. BYTE nGranularity = 0;
  2123. return GetEffectBk(nGranularity, nIndexTool);
  2124. } // End SetEffectBk
  2125. /////////////////////////////////////////////////////////////////////////////
  2126. //  CPPToolTip::GetEffectBk (public member function)
  2127. //    gets the background's effect
  2128. //
  2129. //  Parameters :
  2130. // nGranularity [out] - effect's granularity
  2131. //
  2132. //  Returns :
  2133. // the background's effect 
  2134. //
  2135. /////////////////////////////////////////////////////////////////////////////
  2136. UINT CPPToolTip::GetEffectBk(BYTE & nGranularity, int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  2137. {
  2138. TRACE (_T("CPPToolTip::GetEffectBkn"));
  2139. if (IsExistTool(nIndexTool))
  2140. {
  2141. PPTOOLTIP_INFO ti;
  2142. GetTool(nIndexTool, ti);
  2143. if (ti.nMask & PPTOOLTIP_MASK_EFFECT)
  2144. {
  2145. nGranularity = ti.nGranularity;
  2146. return ti.nEffect;
  2147. }
  2148. }
  2149. nGranularity = m_nGranularity;
  2150. return m_nEffect;
  2151. } // End SetEffectBk
  2152. /////////////////////////////////////////////////////////////////////
  2153. // CPPToolTip::SetNotify
  2154. // This function sets or removes the notification messages from the control before display.
  2155. //
  2156. // Parameters:
  2157. // bParentNotify [in] - If TRUE the control will be send the notification 
  2158. //    to parent window
  2159. //    Else the notification will not send
  2160. ///////////////////////////////////////////////////////////////////////
  2161. void CPPToolTip::SetNotify(BOOL bParentNotify /* = TRUE */)
  2162. {
  2163. HWND hWnd = NULL;
  2164. if (bParentNotify)
  2165. hWnd = m_pParentWnd->GetSafeHwnd();
  2166. SetNotify(hWnd);
  2167. } //End SetNotify
  2168. /////////////////////////////////////////////////////////////////////
  2169. // CPPToolTip::SetNotify
  2170. // This function sets or removes the notification messages from the control before display.
  2171. //
  2172. // Parameters:
  2173. // hWnd [in] -    If non-NULL the control will be send the notification 
  2174. //    to specified window
  2175. //    Else the notification will not send
  2176. ///////////////////////////////////////////////////////////////////////
  2177. void CPPToolTip::SetNotify(HWND hWnd)
  2178. {
  2179. TRACE(_T("CPPToolTip::SetNotifyn"));
  2180. m_hNotifyWnd = hWnd;
  2181. } //End SetNotify
  2182. /////////////////////////////////////////////////////////////////////
  2183. // CPPToolTip::GetNotify
  2184. // This function determines will be send the notification messages from 
  2185. // the control or not before display.
  2186. //
  2187. // Return value:
  2188. // TRUE if the control will be notified the specified window
  2189. ///////////////////////////////////////////////////////////////////////
  2190. BOOL CPPToolTip::GetNotify()
  2191. {
  2192. TRACE(_T("CPPToolTip::GetNotifyn"));
  2193. return (m_hNotifyWnd != NULL);
  2194. }  //End GetNotify
  2195. /////////////////////////////////////////////////////////////////////
  2196. // CPPToolTip::SetDelayTime
  2197. // Call this function to set the delay time for a tool tip control. 
  2198. // The delay time is the length of time the cursor must remain on a tool 
  2199. // before the tool tip window appears. The default delay time is 500 milliseconds.
  2200. //
  2201. // Parameters:
  2202. //   dwDuration [in]  - Flag that specifies which duration value will be retrieved. 
  2203. // This parameter can be one of the following values:
  2204. //
  2205. // TTDT_AUTOPOP  - Retrieve the length of time the tool tip 
  2206. // window remains visible if the pointer is 
  2207. // stationary within a tool's bounding rectangle. 
  2208. // TTDT_INITIAL  - Retrieve the length of time the pointer 
  2209. // must remain stationary within a tool's bounding 
  2210. // rectangle before the tool tip window appears. 
  2211. // TTDT_RESHOW   - Retrieve the length of time it takes for 
  2212. // subsequent tool tip windows to appear as the 
  2213. // pointer moves from one tool to another.
  2214. //  nTime [in] - The specified delay time, in milliseconds.
  2215. //
  2216. /////////////////////////////////////////////////////////////////////
  2217. void CPPToolTip::SetDelayTime(DWORD dwDuration, UINT nTime)
  2218. {
  2219. switch (dwDuration)
  2220. {
  2221. case TTDT_AUTOPOP:
  2222. m_nTimeAutoPop = nTime;
  2223. break;
  2224. case TTDT_INITIAL :
  2225. m_nTimeInitial = nTime;
  2226. break;
  2227. // case TTDT_RESHOW:
  2228. // m_nTimeReShow = nTime;
  2229. // break;
  2230. }
  2231. } // End SetDelayTime
  2232. /////////////////////////////////////////////////////////////////////
  2233. // CPPToolTip::GetDelayTime
  2234. // Retrieves the initial, pop-up, and reshow durations currently set 
  2235. // for a CPPToolTip control
  2236. //
  2237. // Parameters:
  2238. //   dwDuration [in] - Flag that specifies which duration value will 
  2239. //    be retrieved. This parameter can be one of the 
  2240. //    following values:
  2241. //
  2242. // TTDT_AUTOPOP  - Retrieve the length of time the tool tip 
  2243. // window remains visible if the pointer is 
  2244. // stationary within a tool's bounding rectangle. 
  2245. // TTDT_INITIAL  - Retrieve the length of time the pointer 
  2246. // must remain stationary within a tool's bounding 
  2247. // rectangle before the tool tip window appears. 
  2248. // TTDT_RESHOW   - Retrieve the length of time it takes for 
  2249. // subsequent tool tip windows to appear as the 
  2250. // pointer moves from one tool to another. 
  2251. //
  2252. // Return value:
  2253. // The specified delay time, in milliseconds
  2254. ///////////////////////////////////////////////////////////////////////
  2255. UINT CPPToolTip::GetDelayTime(DWORD dwDuration) const
  2256. {
  2257. UINT nTime = 0;
  2258. switch (dwDuration)
  2259. {
  2260. case TTDT_AUTOPOP:
  2261. nTime = m_nTimeAutoPop;
  2262. break;
  2263. case TTDT_INITIAL:
  2264. nTime = m_nTimeInitial;
  2265. break;
  2266. // case TTDT_RESHOW:
  2267. // nTime = m_nTimeReShow;
  2268. // break;
  2269. }
  2270. return nTime;
  2271. } // End GetDelayTime
  2272. /////////////////////////////////////////////////////////////////////////////
  2273. //  CPPToolTip::SetSize (public member function)
  2274. //    Sets the specified size
  2275. //
  2276. //  Parameters :
  2277. // nSizeIndex  [in] - index of the size
  2278. // nValue [in] - size's value
  2279. //
  2280. //  Returns :
  2281. // None
  2282. //
  2283. /////////////////////////////////////////////////////////////////////////////
  2284. void CPPToolTip::SetSize(int nSizeIndex, UINT nValue)
  2285. {
  2286. TRACE(_T("CPPToolTip::SetSize(nSizeIndex = %d, nValue = %d)n"), nSizeIndex, nValue);
  2287. if (nSizeIndex >= PPTTSZ_MAX_SIZES)
  2288. return;
  2289. m_nSizes [nSizeIndex] = nValue;
  2290. }
  2291. /////////////////////////////////////////////////////////////////////////////
  2292. //  CPPToolTip::GetSize (public member function)
  2293. //    Gets the specified size
  2294. //
  2295. //  Parameters :
  2296. // nSizeIndex  [in] - index of the size
  2297. //
  2298. //  Returns :
  2299. // size's value
  2300. //
  2301. /////////////////////////////////////////////////////////////////////////////
  2302. UINT CPPToolTip::GetSize(int nSizeIndex)
  2303. {
  2304. TRACE(_T("CPPToolTip::GetSize(nSizeIndex = %d)n"), nSizeIndex);
  2305. if (nSizeIndex >= PPTTSZ_MAX_SIZES)
  2306. return 0;
  2307. return m_nSizes [nSizeIndex];
  2308. }
  2309. /////////////////////////////////////////////////////////////////////////////
  2310. //  CPPToolTip::SetDefaultSizes (public member function)
  2311. //    Sets all sizes to default values
  2312. //
  2313. //  Returns :
  2314. // None
  2315. //
  2316. /////////////////////////////////////////////////////////////////////////////
  2317. void CPPToolTip::SetDefaultSizes(BOOL bBalloonSize /* = TRUE */)
  2318. {
  2319. TRACE(_T("CPPToolTip::SetDefaultSizes()n"));
  2320. if (bBalloonSize)
  2321. {
  2322. SetSize(PPTTSZ_ROUNDED_CX, 16);
  2323. SetSize(PPTTSZ_ROUNDED_CY, 16);
  2324. SetSize(PPTTSZ_MARGIN_CX, 12);
  2325. SetSize(PPTTSZ_MARGIN_CY, 12);
  2326. SetSize(PPTTSZ_SHADOW_CX, 4);
  2327. SetSize(PPTTSZ_SHADOW_CY, 4);
  2328. SetSize(PPTTSZ_WIDTH_ANCHOR, 12);
  2329. SetSize(PPTTSZ_HEIGHT_ANCHOR, 16);
  2330. SetSize(PPTTSZ_MARGIN_ANCHOR, 16);
  2331. SetSize(PPTTSZ_BORDER_CX, 1);
  2332. SetSize(PPTTSZ_BORDER_CY, 1);
  2333. }
  2334. else
  2335. {
  2336. SetSize(PPTTSZ_ROUNDED_CX, 0);
  2337. SetSize(PPTTSZ_ROUNDED_CY, 0);
  2338. SetSize(PPTTSZ_MARGIN_CX, 3);
  2339. SetSize(PPTTSZ_MARGIN_CY, 1);
  2340. SetSize(PPTTSZ_SHADOW_CX, 0);
  2341. SetSize(PPTTSZ_SHADOW_CY, 0);
  2342. SetSize(PPTTSZ_WIDTH_ANCHOR, 0);
  2343. SetSize(PPTTSZ_HEIGHT_ANCHOR, 0);
  2344. SetSize(PPTTSZ_MARGIN_ANCHOR, 0);
  2345. SetSize(PPTTSZ_BORDER_CX, 1);
  2346. SetSize(PPTTSZ_BORDER_CY, 1);
  2347. }
  2348. }
  2349. /////////////////////////////////////////////////////////////////////////////
  2350. //  CPPToolTip::SetDirection (public member function)
  2351. //    Sets the tooltip's direction
  2352. //
  2353. //  Parameters :
  2354. // nDirection  [in] - direction of the tooltip
  2355. //
  2356. //  Returns :
  2357. // None
  2358. //
  2359. /////////////////////////////////////////////////////////////////////////////
  2360. void CPPToolTip::SetDirection(UINT nDirection /* = PPTOOLTIP_RIGHT_BOTTOM */, int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  2361. {
  2362. TRACE(_T("CPPToolTip::SetDirection(nDirection = %d)n"), nDirection);
  2363. if (nDirection >= PPTOOLTIP_MAX_DIRECTIONS)
  2364. return;
  2365. if (!IsExistTool(nIndexTool))
  2366. {
  2367. m_nDirection = nDirection;
  2368. }
  2369. else
  2370. {
  2371. PPTOOLTIP_INFO ti;
  2372. GetTool(nIndexTool, ti);
  2373. ti.nDirection = nDirection;
  2374. ti.nMask |= PPTOOLTIP_MASK_DIRECTION;
  2375. SetAtTool(nIndexTool, ti);
  2376. }
  2377. }
  2378. /////////////////////////////////////////////////////////////////////////////
  2379. //  CPPToolTip::GetDirection (public member function)
  2380. //    Gets the tooltip's direction
  2381. //
  2382. //  Returns :
  2383. // tooltip's direction
  2384. //
  2385. /////////////////////////////////////////////////////////////////////////////
  2386. UINT CPPToolTip::GetDirection(int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  2387. {
  2388. TRACE(_T("CPPToolTip::GetDirection()n"));
  2389. if (IsExistTool(nIndexTool))
  2390. {
  2391. PPTOOLTIP_INFO ti;
  2392. GetTool(nIndexTool, ti);
  2393. if (ti.nMask & PPTOOLTIP_MASK_DIRECTION)
  2394. return ti.nDirection;
  2395. }
  2396. return m_nDirection;
  2397. }
  2398. /////////////////////////////////////////////////////////////////////////////
  2399. //  CPPToolTip::SetBehaviour (public member function)
  2400. //    Sets the tooltip's direction
  2401. //
  2402. //  Parameters :
  2403. // nBehaviour  [in] - direction of the tooltip
  2404. //
  2405. //  Returns :
  2406. // None
  2407. //
  2408. /////////////////////////////////////////////////////////////////////////////
  2409. void CPPToolTip::SetBehaviour(UINT nBehaviour /* = 0 */, int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  2410. {
  2411. TRACE(_T("CPPToolTip::SetBehaviour(nBehaviour = 0x%X)n"), nBehaviour);
  2412. if (IsExistTool(nIndexTool))
  2413. {
  2414. PPTOOLTIP_INFO ti;
  2415. GetTool(nIndexTool, ti);
  2416. ti.nBehaviour = nBehaviour;
  2417. ti.nMask |= PPTOOLTIP_MASK_BEHAVIOUR;
  2418. SetAtTool(nIndexTool, ti);
  2419. }
  2420. else m_nBehaviour = nBehaviour;
  2421. }
  2422. /////////////////////////////////////////////////////////////////////////////
  2423. //  CPPToolTip::GetBehaviour (public member function)
  2424. //    Gets the tooltip's direction
  2425. //
  2426. //  Returns :
  2427. // tooltip's direction
  2428. //
  2429. /////////////////////////////////////////////////////////////////////////////
  2430. UINT CPPToolTip::GetBehaviour(int nIndexTool /* = PPTOOLTIP_TOOL_NOEXIST */)
  2431. {
  2432. TRACE(_T("CPPToolTip::GetBehaviour()n"));
  2433. if (IsExistTool(nIndexTool))
  2434. {
  2435. PPTOOLTIP_INFO ti;
  2436. GetTool(nIndexTool, ti);
  2437. if (ti.nMask & PPTOOLTIP_MASK_BEHAVIOUR)
  2438. return ti.nBehaviour;
  2439. }
  2440. return m_nBehaviour;
  2441. }
  2442. /*
  2443. /////////////////////////////////////////////////////////////////////////////
  2444. //  CPPToolTip::SetMultipleShow (public member function)
  2445. //    Sets the multiple show for the tooltip
  2446. //
  2447. //  Parameters :
  2448. // bMultiple [in] - 
  2449. // pWnd [in] - the pointer to the window
  2450. //
  2451. //  Returns :
  2452. // None
  2453. //
  2454. /////////////////////////////////////////////////////////////////////////////
  2455. void CPPToolTip::SetMultipleShow(BOOL bMultiple  = TRUE , CWnd * pWnd  = NULL )
  2456. {
  2457. if (bMultiple)
  2458. ModifyStyles(PPTOOLTIP_MULTIPLE_SHOW, 0, pWnd);
  2459. else
  2460. ModifyStyles(0, PPTOOLTIP_MULTIPLE_SHOW, pWnd);
  2461. } // End of SetMultipleShow
  2462. /////////////////////////////////////////////////////////////////////////////
  2463. //  CPPToolTip::IsMultipleShow (public member function)
  2464. //    
  2465. //
  2466. //  Parameters :
  2467. // pWnd [in] - the pointer to the window
  2468. //
  2469. //  Returns :
  2470. // TRUE if for window sets the multiple show
  2471. //
  2472. /////////////////////////////////////////////////////////////////////////////
  2473. BOOL CPPToolTip::IsMultipleShow(CWnd * pWnd  = NULL )
  2474. {
  2475. return (BOOL)(PPTOOLTIP_MULTIPLE_SHOW & GetStyles(pWnd));
  2476. } // End of IsMultipleShow
  2477. */
  2478. /////////////////////////////////////////////////////////////////////////////
  2479. //  CPPToolTip::SetFont  (public member function)
  2480. //    Sets the new font to the control
  2481. //
  2482. //  Parameters :
  2483. // font [in] - new font
  2484. //
  2485. //  Returns :
  2486. // Nonzero if successful; otherwise 0.
  2487. //
  2488. /////////////////////////////////////////////////////////////////////////////
  2489. BOOL CPPToolTip::SetFont(CFont & font)
  2490. {
  2491. TRACE(_T("CPPToolTip::SetFont()n"));
  2492. LOGFONT lf;
  2493. font.GetLogFont (&lf);
  2494. return SetFont(&lf);
  2495. }  // End of SetFont
  2496. /////////////////////////////////////////////////////////////////////////////
  2497. //  CPPToolTip::SetFont  (public member function)
  2498. //    Sets the new font to the control
  2499. //
  2500. //  Parameters :
  2501. // lf [in] - structure LOGFONT for the new font
  2502. //
  2503. //  Returns :
  2504. // Nonzero if successful; otherwise 0.
  2505. //
  2506. /////////////////////////////////////////////////////////////////////////////
  2507. BOOL CPPToolTip::SetFont(LPLOGFONT lf)
  2508. {
  2509. TRACE(_T("CPPToolTip::SetFont()n"));
  2510. // m_font.DeleteObject();
  2511. // Store font as the global default
  2512.     memcpy(&m_LogFont, lf, sizeof(LOGFONT));
  2513. return TRUE; //m_font.CreateFontIndirect(lf);
  2514. }  // End of SetFont
  2515. /////////////////////////////////////////////////////////////////////////////
  2516. //  CPPToolTip::SetFont  (public member function)
  2517. //    Sets the new font to the control
  2518. //
  2519. //  Parameters :
  2520. // font [in] - new font
  2521. //
  2522. //  Returns :
  2523. // Nonzero if successful; otherwise 0.
  2524. //
  2525. /////////////////////////////////////////////////////////////////////////////
  2526. BOOL CPPToolTip::SetFont(LPCTSTR lpszFaceName, int nSizePoints /* = 8 */,
  2527. BOOL bUnderline /* = FALSE */, BOOL bBold /* = FALSE */,
  2528. BOOL bStrikeOut /* = FALSE */, BOOL bItalic /* = FALSE */)
  2529. {
  2530. TRACE(_T("CPPToolTip::SetFont()n"));
  2531. CDC* pDC = GetDC();
  2532. LOGFONT lf;
  2533. memset (&lf, 0, sizeof(LOGFONT));
  2534. _tcscpy (lf.lfFaceName, lpszFaceName);
  2535. lf.lfHeight = -MulDiv (nSizePoints, GetDeviceCaps (pDC->m_hDC, LOGPIXELSY), 72);
  2536. lf.lfUnderline = bUnderline;
  2537. lf.lfWeight = bBold ? FW_BOLD : FW_NORMAL;
  2538. lf.lfStrikeOut = bStrikeOut;
  2539. lf.lfItalic = bItalic;
  2540. if (pDC)
  2541. ReleaseDC(pDC);
  2542. return SetFont(&lf);
  2543. }  // End of SetFont
  2544. /////////////////////////////////////////////////////////////////////////////
  2545. //  CPPToolTip::SetDefaultFonts  (public member function)
  2546. //    Sets default fonts of the control
  2547. //
  2548. //  Returns :
  2549. // None
  2550. //
  2551. /////////////////////////////////////////////////////////////////////////////
  2552. void CPPToolTip::SetDefaultFont()
  2553. {
  2554. TRACE(_T("CPPToolTip::SetDefaultFont()n"));
  2555. LPLOGFONT lpSysFont = GetSystemToolTipFont();
  2556. SetFont(lpSysFont);
  2557. } // End of SetDefaultFonts
  2558. /////////////////////////////////////////////////////////////////////////////
  2559. //  CPPToolTip::GetFont  (public member function)
  2560. //    Sets the new font to the control
  2561. //
  2562. //  Parameters :
  2563. // font [out] - the current font
  2564. //
  2565. /////////////////////////////////////////////////////////////////////////////
  2566. void CPPToolTip::GetFont(CFont & font)
  2567. {
  2568. font.CreateFontIndirect(&m_LogFont);
  2569. }
  2570. /////////////////////////////////////////////////////////////////////////////
  2571. //  CPPToolTip::GetFont  (public member function)
  2572. //    Sets the new font to the control
  2573. //
  2574. //  Parameters :
  2575. // lf [out] - the current font's structure
  2576. //
  2577. /////////////////////////////////////////////////////////////////////////////
  2578. void CPPToolTip::GetFont(LPLOGFONT lf)
  2579. {
  2580. memcpy(lf, &m_LogFont, sizeof(LOGFONT));
  2581. }
  2582. ///////////////////////////////////////////////////////////////////
  2583. //
  2584. //
  2585. // Parameters:
  2586. // pt [in] - the mouse's coordinates in client coordinates
  2587. //
  2588. // Return values:
  2589. //      CWnd* [out] - the pointer to the window under the mouse. Returns
  2590. //                      NULL if under the mouse no control.
  2591. ///////////////////////////////////////////////////////////////////
  2592. HWND CPPToolTip::GetWndFromPoint(CPoint & pt, BOOL bGetDisabled /* = TRUE */) const
  2593. {
  2594. ASSERT(m_pParentWnd);
  2595.     CPoint point = pt;
  2596. // Find the window under the cursor
  2597.     m_pParentWnd->ClientToScreen(&point);
  2598.     HWND hWnd = ::WindowFromPoint(point);
  2599. // WindowFromPoint misses disabled windows and such - go for a more
  2600.     // comprehensive search in this case.
  2601. UINT nFlags = CWP_ALL;
  2602. if (!bGetDisabled)
  2603. nFlags |= CWP_SKIPDISABLED;
  2604.     if (hWnd == m_pParentWnd->GetSafeHwnd())
  2605.         hWnd = m_pParentWnd->ChildWindowFromPoint(pt, nFlags)->GetSafeHwnd();
  2606.     return hWnd;
  2607. }
  2608. /////////////////////////////////////////////////////////////////////////////
  2609. //  CPPToolTip::AddTool (public member function)
  2610. //    adds or updates the tool
  2611. //
  2612. //  Parameters :
  2613. // pWnd [in] - the pointer to the window
  2614. // nIdText  [in] - the tooltip's text id 
  2615. // nIdIcon  [in] - the icon's identificator 
  2616. //
  2617. //  Returns :
  2618. // None
  2619. //
  2620. /////////////////////////////////////////////////////////////////////////////
  2621. void CPPToolTip::AddTool(CWnd * pWnd, UINT nIdText, HICON hIcon /* = NULL */,
  2622.  LPCRECT lpRectTool /* = NULL */, UINT nIDTool /* = 0 */)
  2623. {
  2624. CString str;
  2625.     str.LoadString(nIdText);
  2626. AddTool(pWnd, str, hIcon, lpRectTool, nIDTool);
  2627. } // End AddTool
  2628. /////////////////////////////////////////////////////////////////////////////
  2629. //  CPPToolTip::AddTool (public member function)
  2630. //    adds or updates the tool
  2631. //
  2632. //  Parameters :
  2633. // pWnd [in] - the pointer to the window
  2634. // nIdText  [in] - the tooltip's text id 
  2635. // nIdIcon  [in] - the icon's identificator 
  2636. //
  2637. //  Returns :
  2638. // None
  2639. //
  2640. /////////////////////////////////////////////////////////////////////////////
  2641. void CPPToolTip::AddTool(CWnd * pWnd, UINT nIdText, UINT nIdIcon, CSize szIcon /* = CSize(0, 0) */,
  2642.  LPCRECT lpRectTool /* = NULL */, UINT nIDTool /* = 0 */)
  2643. {
  2644. CString str;
  2645.     str.LoadString(nIdText);
  2646. AddTool(pWnd, str, nIdIcon, szIcon, lpRectTool, nIDTool);
  2647. } // End AddTool
  2648. /////////////////////////////////////////////////////////////////////////////
  2649. //  CPPToolTip::AddTool (public member function)
  2650. //    adds or updates the tool
  2651. //
  2652. //  Parameters :
  2653. // pWnd [in] - the pointer to the window
  2654. // sTooltipText [in] - the tooltip's text 
  2655. // nIdIcon  [in] - the icon's identificator 
  2656. //
  2657. //  Returns :
  2658. // None
  2659. //
  2660. /////////////////////////////////////////////////////////////////////////////
  2661. void CPPToolTip::AddTool(CWnd * pWnd, CString sTooltipText, UINT nIdIcon, CSize szIcon /* = CSize(0, 0) */,
  2662.  LPCRECT lpRectTool /* = NULL */, UINT nIDTool /* = 0 */)
  2663. {
  2664. HICON hIcon = GetIconFromResources (nIdIcon, szIcon);
  2665. AddTool(pWnd, sTooltipText, hIcon, lpRectTool, nIDTool);
  2666. } // End AddTool
  2667. /////////////////////////////////////////////////////////////////////////////
  2668. //  CPPToolTip::AddTool (public member function)
  2669. //    adds or updates the tool
  2670. //
  2671. //  Parameters :
  2672. // pWnd [in] - the pointer to the window
  2673. // sTooltipText [in] - the tooltip's text 
  2674. // hIcon   [in] - the icon's handle 
  2675. //
  2676. //  Returns :
  2677. // None
  2678. //
  2679. /////////////////////////////////////////////////////////////////////////////
  2680. void CPPToolTip::AddTool(CWnd * pWnd, CString sTooltipText, HICON hIcon /* = NULL */,
  2681.  LPCRECT lpRectTool /* = NULL */, UINT nIDTool /* = 0 */)
  2682. {
  2683. // Store the tool information
  2684. PPTOOLTIP_INFO ti;
  2685. ti.hWnd = pWnd->GetSafeHwnd();
  2686. ti.nIDTool = nIDTool;
  2687. ti.hIcon = hIcon;
  2688. ti.sTooltip = sTooltipText;
  2689. ti.nMask = 0; //All values as default
  2690.     if (lpRectTool)
  2691. ti.rectBounds = lpRectTool;
  2692. else
  2693. ti.rectBounds.SetRectEmpty();
  2694. AddTool(ti);
  2695. } // End AddTool
  2696. /////////////////////////////////////////////////////////////////////////////
  2697. //  CPPToolTip::AddTool (public member function)
  2698. //    adds or updates the tool
  2699. //
  2700. //  Parameters :
  2701. // ti [in] - the tooltip's structure 
  2702. //
  2703. //  Returns :
  2704. // None
  2705. //
  2706. /////////////////////////////////////////////////////////////////////////////
  2707. void CPPToolTip::AddTool(PPTOOLTIP_INFO ti) 
  2708. ASSERT (ti.hWnd);  
  2709. TRACE (_T("CPPToolTip::AddTool = 0x%Xn"), ti.hWnd); 
  2710. // Get bounding region for tooltip info 
  2711. /*
  2712.     if (ti.rectBounds.IsRectEmpty()) 
  2713.     {  
  2714. CRect rect; 
  2715. CWnd::FromHandle(ti.hWnd)->GetClientRect(&rect); 
  2716. //m_pParentWnd->ScreenToClient(rect); 
  2717. ti.rectBounds = rect; 
  2718.     } 
  2719. */
  2720. int nIndexTool = FindTool(CWnd::FromHandle(ti.hWnd), ti.rectBounds); 
  2721. if (!IsExistTool(nIndexTool)) 
  2722. m_arrTools.Add(ti); 
  2723. else 
  2724. m_arrTools.SetAt(nIndexTool, ti); 
  2725. } // End AddTool
  2726. /////////////////////////////////////////////////////////////////////////////
  2727. //  CPPToolTip::FindTool (public member function)
  2728. //    searches the tool under cursor point
  2729. //
  2730. //  Parameters :
  2731. // pt [in] - cursor point in client coordinates
  2732. //
  2733. //  Returns :
  2734. // < 0  = Not available tool
  2735. //      >= 0 = Index of the found tool
  2736. //
  2737. /////////////////////////////////////////////////////////////////////////////
  2738. int CPPToolTip::FindTool(CPoint & pt) 
  2739. HWND hWnd = GetWndFromPoint(pt, m_nStyles & PPTOOLTIP_SHOW_DISABLED); 
  2740. PPTOOLTIP_INFO pToolInfo;  
  2741. int nSize = m_arrTools.GetSize(); 
  2742. CPoint ptClient;  
  2743. // Find the window under the cursor 
  2744.     m_pParentWnd->ClientToScreen(&pt); 
  2745.     for (int i = 0; i < nSize; i++) 
  2746.     { 
  2747.         pToolInfo = m_arrTools.GetAt(i); 
  2748.         if (hWnd == pToolInfo.hWnd)  
  2749. ptClient = pt; 
  2750. ::ScreenToClient(hWnd, &ptClient); 
  2751.    if (pToolInfo.rectBounds.PtInRect(ptClient) || pToolInfo.rectBounds.IsRectEmpty()) 
  2752. {
  2753. return i;  
  2754. }
  2755. }
  2756. }  
  2757. return PPTOOLTIP_TOOL_NOEXIST;
  2758. }
  2759. /////////////////////////////////////////////////////////////////////////////
  2760. //  CPPToolTip::FindTool (public member function)
  2761. //    searches the tool with window's pointer and rectangle
  2762. //
  2763. //  Parameters :
  2764. // pWnd [in] - the pointer to the window
  2765. // lpRect [in] - rectangle of the hot area. Or NULL for any rectangle
  2766. //
  2767. //  Returns :
  2768. // < 0  = Not available tool
  2769. //      >= 0 = Index of the found tool
  2770. //
  2771. /////////////////////////////////////////////////////////////////////////////
  2772. int CPPToolTip::FindTool(CWnd * pWnd, LPCRECT lpRect /* = NULL */)
  2773. {
  2774. HWND hWnd = pWnd->GetSafeHwnd();
  2775. PPTOOLTIP_INFO pToolInfo;
  2776. int nSize = m_arrTools.GetSize();
  2777.     for (int i = 0; i < nSize; i++)
  2778.     {
  2779.         pToolInfo = m_arrTools.GetAt(i);
  2780.         if (hWnd == pToolInfo.hWnd) 
  2781. if ((NULL == lpRect) || (lpRect == pToolInfo.rectBounds))
  2782. return i;
  2783.     }
  2784. return PPTOOLTIP_TOOL_NOEXIST;
  2785. }
  2786. /////////////////////////////////////////////////////////////////////////////
  2787. //  CPPToolTip::FindTool (public member function)
  2788. //    searches the tool with id
  2789. //
  2790. //  Parameters :
  2791. // nIDTool [in] - id of the window
  2792. //
  2793. //  Returns :
  2794. // < 0  = Not available tool
  2795. //      >= 0 = Index of the found tool
  2796. //
  2797. /////////////////////////////////////////////////////////////////////////////
  2798. int CPPToolTip::FindTool(UINT nIDTool)
  2799. {
  2800. PPTOOLTIP_INFO pToolInfo;
  2801. int nSize = m_arrTools.GetSize();
  2802.     for (int i = 0; i < nSize; i++)
  2803.     {
  2804.         pToolInfo = m_arrTools.GetAt(i);
  2805.         if (nIDTool == pToolInfo.nIDTool)
  2806. return i;
  2807.     }
  2808. return PPTOOLTIP_TOOL_NOEXIST;
  2809. }
  2810. /////////////////////////////////////////////////////////////////////////////
  2811. //  CPPToolTip::GetTool (public member function)
  2812. //    gets the tooltip's info
  2813. //
  2814. //  Parameters :
  2815. // nIndexTool [in]  - the index of the tool
  2816. // ti [out] - the tooltip's structure 
  2817. //
  2818. //  Returns :
  2819. // FALSE - tool not found
  2820. //
  2821. /////////////////////////////////////////////////////////////////////////////
  2822. BOOL CPPToolTip::GetTool(int nIndexTool, PPTOOLTIP_INFO & ti)
  2823. {
  2824. if (!IsExistTool(nIndexTool))
  2825. return FALSE;
  2826. ti = m_arrTools.GetAt(nIndexTool);
  2827. return TRUE;
  2828. } // End GetTool
  2829. /////////////////////////////////////////////////////////////////////////////
  2830. //  CPPToolTip::RemoveTool (public member function)
  2831. //    removes the tool
  2832. //
  2833. //  Parameters :
  2834. // pWnd [in]  - the pointer to the window
  2835. //
  2836. //  Returns :
  2837. // None 
  2838. //
  2839. /////////////////////////////////////////////////////////////////////////////
  2840. BOOL CPPToolTip::RemoveTool(int nIndexTool)
  2841. {
  2842. TRACE (_T("CPPToolTip::RemoveTooln"));
  2843. if (!IsExistTool(nIndexTool))
  2844. return FALSE;
  2845. m_arrTools.RemoveAt(nIndexTool);
  2846. return TRUE;
  2847. } // End RemoveTool
  2848. /////////////////////////////////////////////////////////////////////////////
  2849. //  CPPToolTip::RemoveAllTools (public member function)
  2850. //    removes the tool
  2851. //
  2852. //  Parameters :
  2853. // None
  2854. //
  2855. //  Returns :
  2856. // None 
  2857. //
  2858. /////////////////////////////////////////////////////////////////////////////
  2859. void CPPToolTip::RemoveAllTools()
  2860. {
  2861. TRACE (_T("CPPToolTip::RemoveAllToolsn"));
  2862. m_arrTools.RemoveAll();
  2863. } // End RemoveAllTools
  2864. /////////////////////////////////////////////////////////////////////////////
  2865. //  CPPToolTip::IsExistTool (public member function)
  2866. //    removes the tool
  2867. //
  2868. //  Parameters :
  2869. // nIndexTool [in]  - the index of the tool
  2870. //
  2871. //  Returns :
  2872. // TRUE - the tool is exist
  2873. //
  2874. /////////////////////////////////////////////////////////////////////////////
  2875. BOOL CPPToolTip::IsExistTool(int nIndexTool)
  2876. {
  2877. return (BOOL)((nIndexTool < m_arrTools.GetSize()) && (nIndexTool >= 0));
  2878. }
  2879. /////////////////////////////////////////////////////////////////////////////
  2880. //  CPPToolTip::SetAtTool (public member function)
  2881. //    adds or updates the tool
  2882. //
  2883. //  Parameters :
  2884. // nIndexTool [in] - the index of the tool
  2885. // ti [in] - the tooltip's structure 
  2886. //
  2887. //  Returns :
  2888. // None
  2889. //
  2890. /////////////////////////////////////////////////////////////////////////////
  2891. void CPPToolTip::SetAtTool(int nIndexTool, PPTOOLTIP_INFO & ti)
  2892. {
  2893. if (!IsExistTool(nIndexTool))
  2894. return;
  2895. m_arrTools.SetAt(nIndexTool, ti);
  2896. }
  2897. /////////////////////////////////////////////////////////////////////////////
  2898. //  CPPToolTip::ShowHelpTooltip (public member function)
  2899. //    shows the tooltip as help window
  2900. //
  2901. //  Parameters :
  2902. // pt [in] - the point of the tooltip's anchor in client coordinates
  2903. // nIdText  [in] - the tooltip's text id 
  2904. // nIdIcon  [in] - the icon's identificator 
  2905. //
  2906. //  Returns :
  2907. // None
  2908. //
  2909. /////////////////////////////////////////////////////////////////////////////
  2910. void CPPToolTip::ShowHelpTooltip(CPoint & pt, UINT nIdText, HICON hIcon /* = NULL */)
  2911. {
  2912. CString str;
  2913.     str.LoadString(nIdText);
  2914. ShowHelpTooltip(pt, str, hIcon);
  2915. }
  2916. /////////////////////////////////////////////////////////////////////////////
  2917. //  CPPToolTip::ShowHelpTooltip (public member function)
  2918. //    shows the tooltip as help window
  2919. //
  2920. //  Parameters :
  2921. // pt [in] - the point of the tooltip's anchor in client coordinates
  2922. // nIdText  [in] - the tooltip's text id 
  2923. // nIdIcon  [in] - the icon's identificator 
  2924. //
  2925. //  Returns :
  2926. // None
  2927. //
  2928. /////////////////////////////////////////////////////////////////////////////
  2929. void CPPToolTip::ShowHelpTooltip(CPoint & pt, UINT nIdText, UINT nIdIcon)
  2930. {
  2931. CString str;
  2932.     str.LoadString(nIdText);
  2933. ShowHelpTooltip(pt, str, nIdIcon);
  2934. }
  2935. /////////////////////////////////////////////////////////////////////////////
  2936. //  CPPToolTip::ShowHelpTooltip (public member function)
  2937. //    shows the tooltip as help window
  2938. //
  2939. //  Parameters :
  2940. // pt [in] - the point of the tooltip's anchor in client coordinates
  2941. // sTooltipText [in] - the tooltip's text 
  2942. // nIdIcon  [in] - the icon's identificator 
  2943. //
  2944. //  Returns :
  2945. // None
  2946. //
  2947. /////////////////////////////////////////////////////////////////////////////
  2948. void CPPToolTip::ShowHelpTooltip(CPoint & pt, CString sTooltipText, UINT nIdIcon)
  2949. {
  2950. HICON hIcon = GetIconFromResources(nIdIcon);
  2951. ShowHelpTooltip(pt, sTooltipText, hIcon);
  2952. }
  2953. /////////////////////////////////////////////////////////////////////////////
  2954. //  CPPToolTip::ShowHelpTooltip (public member function)
  2955. //    shows the tooltip as help window
  2956. //
  2957. //  Parameters :
  2958. // pt [in] - the point of the tooltip's anchor in client coordinates
  2959. // sTooltipText [in] - the tooltip's text 
  2960. // hIcon   [in] - the icon's handle 
  2961. //
  2962. //  Returns :
  2963. // None
  2964. //
  2965. /////////////////////////////////////////////////////////////////////////////
  2966. void CPPToolTip::ShowHelpTooltip(CPoint & pt, CString sTooltipText, HICON hIcon /* = NULL */)
  2967. {
  2968. PPTOOLTIP_INFO ti;
  2969. ti.hWnd = m_pParentWnd->GetSafeHwnd();
  2970. ti.hIcon = hIcon;
  2971. ti.sTooltip = sTooltipText;
  2972. ti.nMask = 0; //All values as default
  2973. ShowHelpTooltip(pt, ti);
  2974. }
  2975. /////////////////////////////////////////////////////////////////////////////
  2976. //  CPPToolTip::ShowHelpTooltip (public member function)
  2977. //    shows the tooltip as help window
  2978. //
  2979. //  Parameters :
  2980. // pt [in] - the point of the tooltip's anchor in client coordinates
  2981. // ti [in] - the tooltip's structure 
  2982. //
  2983. //  Returns :
  2984. // None
  2985. //
  2986. /////////////////////////////////////////////////////////////////////////////
  2987. void CPPToolTip::ShowHelpTooltip(CPoint & pt, PPTOOLTIP_INFO & ti)
  2988. {
  2989. TRACE(_T("ShowHelpTooltip()n"));
  2990. m_nIndexDisplayWnd = PPTOOLTIP_TOOL_NOEXIST;
  2991. m_nIndexCurrentWnd = PPTOOLTIP_TOOL_HELPER;
  2992. m_pToolInfo = ti;
  2993. m_ptOriginal = pt;
  2994. m_pParentWnd->ClientToScreen(&m_ptOriginal);
  2995. //Start the show timer
  2996. OnTimer(PPTOOLTIP_SHOW);
  2997. }
  2998. /////////////////////////////////////////////////////////////////////////////
  2999. //  CPPToolTip::SetImageList (public member function)
  3000. //    sets the image list to tooltip
  3001. //
  3002. //  Parameters :
  3003. // nIdBitmap [in] - Resource IDs of the bitmap to be associated with the image list
  3004. // cx [in] - Dimensions of each image, in pixels.
  3005. // cy [in] - Dimensions of each image, in pixels.
  3006. // nCount [in] - Number of images that the image list initially contains.
  3007. // crMask [in] - Color used to generate a mask. Each pixel of this color in the 
  3008. //    specified bitmap is changed to black, and the corresponding 
  3009. //    bit in the mask is set to one.
  3010. //  Returns :
  3011. // None
  3012. //
  3013. /////////////////////////////////////////////////////////////////////////////
  3014. void CPPToolTip::SetImageList(UINT nIdBitmap, int cx, int cy, int nCount, COLORREF crMask /* = RGB(255, 0, 255) */)
  3015. {
  3016. // Load bitmap
  3017. HBITMAP hBitmap = GetBitmapFromResources(nIdBitmap);
  3018. SetImageList(hBitmap, cx, cy, nCount, crMask);
  3019. }
  3020. /////////////////////////////////////////////////////////////////////////////
  3021. //  CPPToolTip::SetImageList (public member function)
  3022. //    sets the image list to tooltip
  3023. //
  3024. //  Parameters :
  3025. // hBitmap [in] - Handle of the bitmap to be associated with the image list
  3026. // cx [in] - Dimensions of each image, in pixels.
  3027. // cy [in] - Dimensions of each image, in pixels.
  3028. // nCount [in] - Number of images that the image list initially contains.
  3029. // crMask [in] - Color used to generate a mask. Each pixel of this color in the 
  3030. //    specified bitmap is changed to black, and the corresponding 
  3031. //    bit in the mask is set to one.
  3032. //  Returns :
  3033. // None
  3034. //
  3035. /////////////////////////////////////////////////////////////////////////////
  3036. void CPPToolTip::SetImageList(HBITMAP hBitmap, int cx, int cy, int nCount, COLORREF crMask /* = RGB(255, 0, 255) */)
  3037. {
  3038. if (m_imgTooltip.m_hImageList != NULL)
  3039. m_imgTooltip.DeleteImageList();
  3040. m_imgTooltip.Create(cx, cy, ILC_COLOR32 | ILC_MASK, nCount, 1);
  3041. m_imgTooltip.Add(CBitmap::FromHandle(hBitmap), crMask);
  3042. m_szImage = CSize(cx, cy);
  3043. }
  3044. /////////////////////////////////////////////////////////////////////////////
  3045. //  CPPToolTip::GetImageList (public member function)
  3046. //    gets the image list from tooltip
  3047. //
  3048. //  Parameters :
  3049. // sz    [out] - Dimensions of each image, in pixels.
  3050. //  Returns :
  3051. // A pointer to a CImageList object
  3052. //
  3053. /////////////////////////////////////////////////////////////////////////////
  3054. CImageList * CPPToolTip::GetImageList(CSize & sz)
  3055. {
  3056. sz = m_szImage;
  3057. return &m_imgTooltip;
  3058. }
  3059. /////////////////////////////////////////////////////////////////////////////
  3060. //  CPPToolTip::AddNameOfResource (public member function)
  3061. //    Associates the resource name with him ID
  3062. //
  3063. //  Parameters :
  3064. // sName [in] - A resource name in format string of the tooltip
  3065. // nID [in] - A resource ID associated with name.
  3066. // nTypeRes [in] - A resource type:
  3067. // TYPE_RES_ICON - a resource is a icon
  3068. // TYPE_RES_BITMAP - a resource is a bitmap
  3069. // TYPE_RES_MASK_BITMAP - a resource is a transparent bitmap
  3070. // crMask [in] - Color used to generate a mask. Each pixel of this color in the 
  3071. //    specified bitmap is changed to black, and the corresponding 
  3072. //    bit in the mask is set to one.
  3073. //  Returns :
  3074. // None
  3075. /////////////////////////////////////////////////////////////////////////////
  3076. void CPPToolTip::AddNameOfResource(CString sName, UINT nID, BYTE nTypeRes /* = TYPE_RES_TRAN_BITMAP */, COLORREF crMask /* = RGB(255, 0, 255) */)
  3077. {
  3078. if (sName.IsEmpty() || (nID == 0) || (nTypeRes >= MAX_TYPES_RES))
  3079. return;
  3080. PPTOOLTIP_NAME_RES nr;
  3081. nr.sName = sName;
  3082. nr.nID = nID;
  3083. nr.nTypeRes = nTypeRes;
  3084. nr.crMask = crMask;
  3085. m_arrNameRes.Add(nr);
  3086. }
  3087. /////////////////////////////////////////////////////////////////////////////
  3088. //  CPPToolTip::FindIdOfResource (public member function)
  3089. //    Search the ID resource by his name
  3090. //
  3091. //  Parameters :
  3092. // sName [in] - A resource name in format string of the tooltip
  3093. //  Returns :
  3094. // The array's index with ID resource associated with name or -1 if ID not found
  3095. /////////////////////////////////////////////////////////////////////////////
  3096. int CPPToolTip::FindIdOfResource(CString sName)
  3097. {
  3098. PPTOOLTIP_NAME_RES nr;
  3099. for (int i = 0; i < m_arrNameRes.GetSize(); i++)
  3100. {
  3101. nr = m_arrNameRes.GetAt(i);
  3102. if (!sName.CompareNoCase(nr.sName))
  3103. return i;
  3104. }
  3105. return -1;
  3106. }
  3107. /////////////////////////////////////////////////////////////////////////////
  3108. //  CPPToolTip::FindIdOfResource (public member function)
  3109. //    Search the resource name by his ID
  3110. //
  3111. //  Parameters :
  3112. // nID [in] - A ID resource
  3113. //  Returns :
  3114. // The array's index with resource name associated with ID or -1 if name not found
  3115. /////////////////////////////////////////////////////////////////////////////
  3116. int CPPToolTip::FindNameOfResource(UINT nID)
  3117. {
  3118. PPTOOLTIP_NAME_RES nr;
  3119. for (int i = 0; i < m_arrNameRes.GetSize(); i++)
  3120. {
  3121. nr = m_arrNameRes.GetAt(i);
  3122. if (nr.nID == nID)
  3123. return i;
  3124. }
  3125. return -1;
  3126. }
  3127. /////////////////////////////////////////////////////////////////////////////
  3128. //  CPPToolTip::FindIdOfResource (public member function)
  3129. //    Removes resource name by index of the array
  3130. //
  3131. //  Parameters :
  3132. // nIndex [in] - A The index of the resource name in the array
  3133. //  Returns :
  3134. // None
  3135. /////////////////////////////////////////////////////////////////////////////
  3136. void CPPToolTip::RemoveNameOfResource(int nIndex)
  3137. {
  3138. if (nIndex < m_arrNameRes.GetSize())
  3139. m_arrNameRes.RemoveAt(nIndex);
  3140. }
  3141. /////////////////////////////////////////////////////////////////////////////
  3142. //  CPPToolTip::FindIdOfResource (public member function)
  3143. //    Removes all resource names from the array
  3144. /////////////////////////////////////////////////////////////////////////////
  3145. void CPPToolTip::RemoveAllNamesOfResource()
  3146. {
  3147. m_arrNameRes.RemoveAll();
  3148. }