XTPPopupItem.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:10k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPPopupItem.cpp: implementation of the CXTPPopupItem class.
  2. //
  3. // This file is a part of the XTREME CONTROLS MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPImageManager.h"
  22. #include "Common/XTPDrawHelpers.h"
  23. #include "Common/XTPRichRender.h"
  24. #include "Common/XTPMarkupRender.h"
  25. #include "XTPPopupItem.h"
  26. #include "XTPPopupControl.h"
  27. #include "XTPPopupPaintManager.h"
  28. #ifdef _DEBUG
  29. #define new DEBUG_NEW
  30. #undef THIS_FILE
  31. static char THIS_FILE[] = __FILE__;
  32. #endif
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CXTPPopupItem
  35. IMPLEMENT_DYNCREATE(CXTPPopupItem, CCmdTarget)
  36. //////////////////////////////////////////////////////////////////////////
  37. // CXTPPopupItem
  38. CXTPPopupItem::CXTPPopupItem(LPRECT rcItem, LPCTSTR lpszCaption, COLORREF clrBackground, COLORREF clrBorder)
  39. {
  40. ::CopyRect(&m_rcItem, rcItem);
  41. m_pControl = NULL;
  42. m_nID = 0;
  43. m_bButton = FALSE;
  44. m_nIndex = 0;
  45. m_ptOffset = CPoint(0, 0);
  46. m_strCaption = lpszCaption;
  47. m_clrText = (COLORREF)-1;
  48. m_bHyperLink = TRUE;
  49. m_nAlign = DT_LEFT;
  50. m_bBold = FALSE;
  51. m_clrBackground = clrBackground;
  52. m_clrBorder = clrBorder;
  53. m_bButton = FALSE;
  54. m_nIconIndex = -1;
  55. m_pRichRender = NULL;
  56. m_pUIElement = NULL;
  57. EnableAutomation();
  58. }
  59. CXTPPopupItem::~CXTPPopupItem()
  60. {
  61. SAFE_DELETE(m_pRichRender);
  62. XTPMarkupReleaseElement(m_pUIElement);
  63. }
  64. void CXTPPopupItem::SetRTFText(LPCTSTR str)
  65. {
  66. SAFE_DELETE(m_pRichRender);
  67. m_pRichRender = new CXTPRichRender;
  68. m_strCaption = str;
  69. m_bHyperLink = FALSE;
  70. m_pRichRender->SetText(str);
  71. }
  72. void CXTPPopupItem::SetRTFText(UINT nIDResource)
  73. {
  74. HMODULE hModule = AfxFindResourceHandle(MAKEINTRESOURCE(nIDResource), _T("RTF"));
  75. if (!hModule)
  76. return;
  77. HRSRC hResource = ::FindResource(hModule, MAKEINTRESOURCE(nIDResource), _T("RTF"));
  78. if (!hResource)
  79. return;
  80. HGLOBAL hMem= ::LoadResource(hModule, hResource);
  81. if (!hMem)
  82. return;
  83. LPSTR lpBuffer = (LPSTR)LockResource(hMem);
  84. CString str(lpBuffer);
  85. SetRTFText(str);
  86. }
  87. void CXTPPopupItem::SetCaption(LPCTSTR str)
  88. {
  89. m_strCaption = str;
  90. XTPMarkupReleaseElement(m_pUIElement);
  91. if (m_pControl->GetMarkupContext())
  92. {
  93. m_pUIElement = XTPMarkupParseText(m_pControl->GetMarkupContext(), str);
  94. }
  95. RedrawControl();
  96. }
  97. void CXTPPopupItem::SetMarkupText(LPCTSTR str)
  98. {
  99. m_pControl->EnableMarkup(TRUE);
  100. m_bHyperLink = FALSE;
  101. SetCaption(str);
  102. }
  103. void CXTPPopupItem::RedrawControl()
  104. {
  105. ASSERT(m_pControl);
  106. if (m_pControl)
  107. m_pControl->RedrawControl();
  108. }
  109. BOOL CXTPPopupItem::IsSelected() const
  110. {
  111. ASSERT(m_pControl);
  112. return m_pControl && m_pControl->m_pSelected == this;
  113. }
  114. BOOL CXTPPopupItem::IsPressed() const
  115. {
  116. ASSERT(m_pControl);
  117. return m_pControl && m_pControl->m_pPressed == this;
  118. }
  119. void CXTPPopupItem::OnItemInserted()
  120. {
  121. }
  122. void CXTPPopupItem::Draw(CDC* pDC)
  123. {
  124. if (m_pUIElement)
  125. {
  126. XTPMarkupSetDefaultFont(m_pControl->GetMarkupContext(), (HFONT)GetTextFont()->GetSafeHandle(), m_clrText == (COLORREF)-1 ? m_pControl->GetPaintManager()->m_clrText : m_clrText);
  127. XTPMarkupRenderElement(m_pUIElement, pDC->GetSafeHdc(), m_rcItem);
  128. }
  129. else
  130. {
  131. ASSERT(m_pControl);
  132. if (m_pControl)
  133. m_pControl->GetPaintManager()->DrawItem(pDC, this);
  134. }
  135. }
  136. CFont* CXTPPopupItem::GetTextFont()
  137. {
  138. ASSERT(m_pControl);
  139. return (m_pControl && m_fntText.m_hObject == NULL) ?
  140. &m_pControl->GetPaintManager()->m_fntText : &m_fntText;
  141. }
  142. void CXTPPopupItem::SetTextFont(CFont* pFntText)
  143. {
  144. ASSERT(pFntText);
  145. if (!pFntText)
  146. return;
  147. LOGFONT lf;
  148. pFntText->GetLogFont(&lf);
  149. SetTextFont(&lf);
  150. }
  151. void CXTPPopupItem::SetTextFont(PLOGFONT pLogfText)
  152. {
  153. ASSERT(pLogfText);
  154. m_fntText.DeleteObject();
  155. m_fntText.CreateFontIndirect(pLogfText);
  156. RedrawControl();
  157. }
  158. void CXTPPopupItem::CalculateHeight()
  159. {
  160. if (m_pRichRender)
  161. {
  162. return;
  163. }
  164. if (m_pUIElement)
  165. {
  166. XTPMarkupSetDefaultFont(m_pControl->GetMarkupContext(), (HFONT)GetTextFont()->GetSafeHandle(), COLORREF_NULL);
  167. CSize sz = XTPMarkupMeasureElement(m_pUIElement, m_rcItem.Width());
  168. m_rcItem.right = m_rcItem.left + sz.cx;
  169. m_rcItem.bottom = m_rcItem.top + sz.cy;
  170. return;
  171. }
  172. CXTPImageManagerIcon* pIcon = GetImage();
  173. if (pIcon)
  174. {
  175. m_rcItem.bottom = m_rcItem.top + pIcon->GetHeight();
  176. return;
  177. }
  178. CWindowDC dc(NULL);
  179. CRect rcText(0, 0, m_rcItem.Width(), 0);
  180. CFont fntUnderline;
  181. CFont* pFont = GetTextFont();
  182. if (IsHyperLink() || IsBold())
  183. {
  184. LOGFONT lpLogFont;
  185. pFont->GetLogFont(&lpLogFont);
  186. lpLogFont.lfUnderline = IsHyperLink() ? true : false;
  187. lpLogFont.lfWeight = IsBold() ? FW_BOLD : FW_NORMAL;
  188. VERIFY(fntUnderline.CreateFontIndirect(&lpLogFont));
  189. pFont = &fntUnderline;
  190. }
  191. CXTPFontDC font(&dc, pFont);
  192. dc.DrawText(m_strCaption, rcText, m_nAlign | DT_CALCRECT);
  193. m_rcItem.bottom = m_rcItem.top + rcText.Height();
  194. }
  195. void CXTPPopupItem::FitToContent()
  196. {
  197. if (m_pRichRender)
  198. {
  199. CWindowDC dc(NULL);
  200. CSize sz = m_pRichRender->GetTextExtent(&dc, m_rcItem.Width());
  201. m_rcItem.right = m_rcItem.left + sz.cx;
  202. m_rcItem.bottom = m_rcItem.top + sz.cy;
  203. return;
  204. }
  205. if (m_pUIElement)
  206. {
  207. XTPMarkupSetDefaultFont(m_pControl->GetMarkupContext(), (HFONT)GetTextFont()->GetSafeHandle(), COLORREF_NULL);
  208. CSize sz = XTPMarkupMeasureElement(m_pUIElement, m_rcItem.Width());
  209. m_rcItem.right = m_rcItem.left + sz.cx;
  210. m_rcItem.bottom = m_rcItem.top + sz.cy;
  211. return;
  212. }
  213. CalculateWidth();
  214. CalculateHeight();
  215. }
  216. void CXTPPopupItem::CalculateWidth()
  217. {
  218. if (m_pRichRender)
  219. {
  220. return;
  221. }
  222. if (m_pUIElement)
  223. {
  224. XTPMarkupSetDefaultFont(m_pControl->GetMarkupContext(), (HFONT)GetTextFont()->GetSafeHandle(), COLORREF_NULL);
  225. CSize sz = XTPMarkupMeasureElement(m_pUIElement, m_rcItem.Width());
  226. m_rcItem.right = m_rcItem.left + sz.cx;
  227. m_rcItem.bottom = m_rcItem.top + sz.cy;
  228. return;
  229. }
  230. CXTPImageManagerIcon* pIcon = GetImage();
  231. if (pIcon)
  232. {
  233. m_rcItem.right = m_rcItem.left + pIcon->GetWidth();
  234. return;
  235. }
  236. if (m_nAlign & DT_WORDBREAK) return;
  237. CWindowDC dc(NULL);
  238. CRect rcText(0, 0, 0, m_rcItem.Height());
  239. CFont fntUnderline;
  240. CFont* pFont = GetTextFont();
  241. if (IsHyperLink() || IsBold())
  242. {
  243. LOGFONT lpLogFont;
  244. pFont->GetLogFont(&lpLogFont);
  245. lpLogFont.lfUnderline = IsHyperLink() ? true : false;
  246. lpLogFont.lfWeight = IsBold() ? FW_BOLD : FW_NORMAL;
  247. VERIFY(fntUnderline.CreateFontIndirect(&lpLogFont));
  248. pFont = &fntUnderline;
  249. }
  250. CXTPFontDC font(&dc, pFont);
  251. dc.DrawText(m_strCaption, rcText, m_nAlign | DT_CALCRECT);
  252. if (m_nAlign & DT_RIGHT)
  253. {
  254. m_rcItem.left = m_rcItem.right - rcText.Width();
  255. }
  256. else if (m_nAlign & DT_CENTER)
  257. {
  258. LONG lCentrl = m_rcItem.left + m_rcItem.Width()/2;
  259. m_rcItem.left = lCentrl - rcText.Width()/2;
  260. m_rcItem.right = m_rcItem.left + rcText.Width();
  261. }
  262. else
  263. {
  264. m_rcItem.right = m_rcItem.left + rcText.Width();
  265. }
  266. }
  267. void CXTPPopupItem::SetIcon(HICON hIcon, XTPPopupItemIcon itemIcon)
  268. {
  269. ASSERT(hIcon);
  270. m_pControl->GetImageManager()->SetIcon(hIcon, GetIconIndex(), 0,
  271. itemIcon == xtpPopupItemIconNormal ? xtpImageNormal: itemIcon == xtpPopupItemIconSelected ? xtpImageHot : xtpImageChecked);
  272. }
  273. BOOL CXTPPopupItem::SetIcons(UINT nIDBitmap, COLORREF clrTransparent, int itemIcon)
  274. {
  275. CBitmap bmp;
  276. if (!bmp.LoadBitmap(nIDBitmap))
  277. return FALSE;
  278. return SetIcons((HBITMAP)bmp.GetSafeHandle(), clrTransparent, itemIcon);
  279. }
  280. BOOL CXTPPopupItem::SetIcons(HBITMAP hBitmap, COLORREF clrTransparent, int itemIcon)
  281. {
  282. BITMAP bmpInfo;
  283. ZeroMemory(&bmpInfo, sizeof(BITMAP));
  284. ::GetObject(hBitmap, sizeof(BITMAP), &bmpInfo);
  285. int nCount = (itemIcon & xtpPopupItemIconNormal ? 1 : 0) +
  286. (itemIcon & xtpPopupItemIconSelected ? 1 : 0) +
  287. (itemIcon & xtpPopupItemIconPressed ? 1 : 0);
  288. CImageList il;
  289. il.Create(bmpInfo.bmWidth / nCount, bmpInfo.bmHeight, ILC_COLOR24 | ILC_MASK, 0, 1);
  290. il.Add(CBitmap::FromHandle(hBitmap), clrTransparent);
  291. int nIndex = 0;
  292. if ((itemIcon & xtpPopupItemIconNormal) != 0)
  293. {
  294. HICON hIcon = il.ExtractIcon(nIndex++);
  295. SetIcon(hIcon, xtpPopupItemIconNormal);
  296. DestroyIcon(hIcon);
  297. }
  298. if ((itemIcon & xtpPopupItemIconSelected) != 0)
  299. {
  300. HICON hIcon = il.ExtractIcon(nIndex++);
  301. SetIcon(hIcon, xtpPopupItemIconSelected);
  302. DestroyIcon(hIcon);
  303. }
  304. if ((itemIcon & xtpPopupItemIconPressed) != 0)
  305. {
  306. HICON hIcon = il.ExtractIcon(nIndex++);
  307. SetIcon(hIcon, xtpPopupItemIconPressed);
  308. DestroyIcon(hIcon);
  309. }
  310. return TRUE;
  311. }
  312. CXTPImageManagerIcon* CXTPPopupItem::GetImage() const
  313. {
  314. return m_pControl->GetImageManager()->GetImage(GetIconIndex(), m_rcItem.Width());
  315. }
  316. void CXTPPopupItem::CenterIcon()
  317. {
  318. m_ptOffset = CPoint(0, 0);
  319. CXTPImageManagerIcon* pIcon = GetImage();
  320. if (!pIcon)
  321. return;
  322. CSize sz = pIcon->GetExtent();
  323. CRect rc = GetRect();
  324. if (rc.Width() > sz.cx) m_ptOffset.x = rc.Width()/2 - sz.cx/2;
  325. if (rc.Height() > sz.cy) m_ptOffset.y = rc.Height()/2 - sz.cy/2;
  326. }