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

CA认证

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include "PPHtmlDrawer.h"
  3. #include "atlconv.h"    // for Unicode conversion - requires #include <afxdisp.h> // MFC OLE automation classes
  4. #include <shellapi.h>
  5. #pragma comment(lib, "comctl32.lib")
  6. /*
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. */
  13. #define PPHTMLDRAWER_NO_HOVERLINK -2 //A hot area is not exist under the cursor
  14. #define PPHTMLDRAWER_BREAK_CHARS _T(" -.,!:;)}]?") //A set of the chars to break line in the text wrap mode
  15. enum {
  16. MODE_DRAW = 0,
  17. MODE_FIRSTPASS,
  18. MODE_SECONDPASS
  19. };
  20. /*
  21. #define m_szOffsetShadow.cx 4 //
  22. #define m_szOffsetShadow.cy 4 //
  23. #define m_szDepthShadow.cx 7 //
  24. #define m_szDepthShadow.cy 7 //
  25. #define PPHTMLDRAWER_SHADOW_COLOR RGB (64, 64, 64) //A gradient shadow's color
  26. */
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CPPHtmlDrawer
  29. CPPHtmlDrawer::CPPHtmlDrawer()
  30. {
  31. m_nNumPass = MODE_FIRSTPASS;
  32. m_hInstDll = NULL;
  33. m_bFreeInstDll = FALSE;
  34. m_hDC = NULL;
  35. m_hImageList = NULL;
  36. m_csCallbackRepaint.hWnd = NULL;
  37. m_csCallbackRepaint.nMessage = 0;
  38. m_csCallbackRepaint.lParam = 0;
  39. m_csCallbackRepaint.wParam = 0;
  40. m_csCallbackLink.hWnd = NULL;
  41. m_csCallbackLink.nMessage = 0;
  42. m_csCallbackLink.lParam = 0;
  43. m_csCallbackLink.wParam = 0;
  44. // m_clrShadow = PPHTMLDRAWER_SHADOW_COLOR;
  45. m_hLinkCursor = NULL; // No cursor as yet
  46. m_nHoverIndexLink = PPHTMLDRAWER_NO_HOVERLINK;
  47. SetListOfTags();
  48. SetListSpecChars();
  49.     SetTableOfColors();
  50. SetDefaultCursor();
  51. EnableEscapeSequences();
  52. SetMaxWidth(0);
  53. // EnableTextWrap(FALSE); //A text warpping was disabled by default
  54. // EnableTextWrap(TRUE); //A text warpping was disabled by default
  55. SetImageShadow(4, 4);
  56. SetTabSize(32);
  57. SetDefaultCssStyles();
  58. EnableOutput();
  59. SetDisabledColor(::GetSysColor(COLOR_BTNSHADOW));
  60. }
  61. CPPHtmlDrawer::~CPPHtmlDrawer()
  62. {
  63. SetResourceDll(NULL);
  64. if (NULL != m_hLinkCursor)
  65. {
  66. ::DestroyCursor(m_hLinkCursor);
  67. m_hLinkCursor = NULL;
  68. }
  69. if (NULL != m_hImageList)
  70. ::DeleteObject(m_hImageList);
  71. }
  72. void CPPHtmlDrawer::EnableOutput(BOOL bEnable /* = TRUE */)
  73. {
  74. m_bIsEnable = bEnable;
  75. } //End of EnableOutput
  76. void CPPHtmlDrawer::SetDisabledColor(COLORREF color)
  77. {
  78. m_crDisabled = color;
  79. }
  80. HICON CPPHtmlDrawer::GetIconFromResources(DWORD dwID, int nWidth /* = 0 */, int nHeight /* = 0 */) const
  81. {
  82. if (0 == dwID) return NULL;
  83. // Find correct resource handle
  84. #ifdef _MFC_VER
  85. HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(dwID), RT_GROUP_ICON);
  86. #else
  87. HINSTANCE hInstResource = ::GetModuleHandle(NULL);
  88. #endif
  89. // Set icon when the mouse is IN the button
  90. HICON hIcon = (HICON)::LoadImage(hInstResource, MAKEINTRESOURCE(dwID), IMAGE_ICON, nWidth, nHeight, LR_DEFAULTCOLOR);
  91. return hIcon;
  92. }
  93. HICON CPPHtmlDrawer::GetIconFromFile(LPCTSTR lpszPath, int nWidth /* = 0 */, int nHeight /* = 0 */) const
  94. {
  95. HICON hIcon = (HICON)::LoadImage(NULL, lpszPath, IMAGE_ICON, nWidth, nHeight, LR_LOADFROMFILE | LR_DEFAULTCOLOR);
  96. return hIcon;
  97. }
  98. HICON CPPHtmlDrawer::GetIconFromDll(DWORD dwID, int nWidth /* = 0 */, int nHeight /* = 0 */, LPCTSTR lpszPathDll /* = NULL */) const
  99. {
  100. if (0 == dwID) return NULL;
  101. HICON hIcon = NULL;
  102. HINSTANCE hInstDll = NULL;
  103. BOOL bNewDll = FALSE;
  104. if (NULL == lpszPathDll)
  105. {
  106. if (NULL != m_hInstDll)
  107. hInstDll = m_hInstDll;
  108. }
  109. else
  110. {
  111. //Load New Library
  112. hInstDll = ::LoadLibraryEx(lpszPathDll, NULL, 0);
  113. if (NULL != hInstDll)
  114. bNewDll = TRUE;
  115. }
  116. if (NULL != hInstDll)
  117. {
  118. hIcon = (HICON)::LoadImage(hInstDll, MAKEINTRESOURCE(dwID), IMAGE_ICON, nWidth, nHeight, LR_DEFAULTCOLOR);
  119. if (bNewDll)
  120. ::FreeLibrary(hInstDll);
  121. }
  122. return hIcon;
  123. }
  124. HBITMAP CPPHtmlDrawer::GetBitmapFromResources(DWORD dwID) const
  125. {
  126. if (0 == dwID) return NULL;
  127. // Find correct resource handle
  128. #ifdef _MFC_VER
  129. HINSTANCE hInstResource = AfxFindResourceHandle(MAKEINTRESOURCE(dwID), RT_BITMAP);
  130. #else
  131. HINSTANCE hInstResource = ::GetModuleHandle(NULL);
  132. #endif
  133. // Load bitmap
  134. HBITMAP hBitmap = (HBITMAP)::LoadImage(hInstResource, MAKEINTRESOURCE(dwID), IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR);
  135. return hBitmap;
  136. }
  137. HBITMAP CPPHtmlDrawer::GetBitmapFromFile(LPCTSTR lpszPath) const
  138. {
  139. HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, lpszPath, IMAGE_BITMAP,
  140. 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
  141. return hBitmap;
  142. }
  143. HBITMAP CPPHtmlDrawer::GetBitmapFromDll(DWORD dwID, LPCTSTR lpszPathDll /* = NULL */) const
  144. {
  145. if (0 == dwID) return NULL;
  146. HBITMAP hBitmap = NULL;
  147. HINSTANCE hInstDll = NULL;
  148. BOOL bNewDll = FALSE;
  149. if (NULL == lpszPathDll)
  150. {
  151. if (NULL != m_hInstDll)
  152. hInstDll = m_hInstDll;
  153. }
  154. else
  155. {
  156. //Load New Library
  157. hInstDll = ::LoadLibraryEx(lpszPathDll, NULL, 0);
  158. if (NULL != hInstDll)
  159. bNewDll = TRUE;
  160. }
  161. if (NULL != hInstDll)
  162. {
  163. hBitmap = (HBITMAP)::LoadImage(hInstDll, MAKEINTRESOURCE(dwID), IMAGE_BITMAP,
  164. 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
  165. if (bNewDll)
  166. ::FreeLibrary(hInstDll);
  167. }
  168. return hBitmap;
  169. }
  170. CPPString CPPHtmlDrawer::GetStringFromResource(DWORD dwID) const
  171. {
  172. if (0 == dwID) return _T("");
  173. CPPString str;
  174. str.LoadString(dwID);
  175. return str;
  176. }
  177. CPPString CPPHtmlDrawer::GetStringFromDll(DWORD dwID, LPCTSTR lpszPathDll /* = NULL */) const
  178. {
  179. if (0 == dwID) return _T("");
  180. CPPString str = _T("");
  181. HINSTANCE hInstDll = NULL;
  182. BOOL bNewDll = FALSE;
  183. if (NULL == lpszPathDll)
  184. {
  185. if (NULL != m_hInstDll)
  186. hInstDll = m_hInstDll;
  187. }
  188. else
  189. {
  190. //Load New Library
  191. hInstDll = ::LoadLibraryEx(lpszPathDll, NULL, 0);
  192. if (NULL != hInstDll)
  193. bNewDll = TRUE;
  194. }
  195. if (NULL != hInstDll)
  196. {
  197. #ifdef _UNICODE
  198. #define CHAR_FUDGE 1    // one TCHAR unused is good enough
  199. #else
  200. #define CHAR_FUDGE 2    // two BYTES unused for case of DBC last char
  201. #endif
  202. // try fixed buffer first (to avoid wasting space in the heap)
  203. TCHAR szTemp[256];
  204. DWORD dwLen = ::LoadString(hInstDll, dwID, szTemp, (sizeof(szTemp) * sizeof(TCHAR)));
  205. // If resource not found (or ::LoadString failure)
  206. if (0 != dwLen) 
  207. {
  208. if ((sizeof(szTemp) * sizeof(TCHAR)) - dwLen > CHAR_FUDGE)
  209. {
  210. str = szTemp;
  211. } // if
  212. else
  213. {
  214. // try buffer size of 512, then larger size until entire string is retrieved
  215. int nSize = 256;
  216. do
  217. {
  218. nSize += 256;
  219. dwLen = ::LoadString(hInstDll, dwID, str.GetBuffer(nSize-1), nSize);
  220. } while (nSize - dwLen <= CHAR_FUDGE);
  221. str.ReleaseBuffer();
  222. }
  223. #undef CHAR_FUDGE
  224. }
  225. if (bNewDll)
  226. ::FreeLibrary(hInstDll);
  227. }
  228. return str;
  229. }
  230. ///////////////////////////////////////////////////////////
  231. // Get tooltip string for menu and toolbar items from the 
  232. // resources of the application.
  233. // 
  234. // Parameters:
  235. // nID - Resource ID of the string
  236. // nNumParam - Which parameter will gets:
  237. //  0=long,
  238. //  1=short,
  239. //  2=disable
  240. //
  241. //
  242. // Format prompt string:  long prompt n short prompt n disable prompt
  243. ////////////////////////////////////////////////////////////
  244. CPPString CPPHtmlDrawer::GetResCommandPrompt(UINT nID, UINT nNumParam /* = 0 */)
  245. {
  246. CPPString str = GetStringFromResource(nID);
  247. if (!str.IsEmpty())
  248. {
  249. int nFirst = 0;
  250. int nLast = nFirst;
  251. UINT nCount = 0;
  252. while ((nCount <= nNumParam) && (nFirst < str.GetLength()))
  253. {
  254. nLast = str.Find(_T('n'), nFirst);
  255. if (nLast < 0)
  256. {
  257. //Char wasn't found
  258. if (nCount == nNumParam)
  259. str = str.Mid(nFirst, str.GetLength() - nFirst);
  260. else
  261. str.Empty();
  262. return str;
  263. }
  264. else
  265. {
  266. //Char was found
  267. if (nCount == nNumParam)
  268. {
  269. str = str.Mid(nFirst, nLast - nFirst);
  270. return str;
  271. }
  272. else
  273. {
  274. nFirst = nLast + 1;
  275. } //if
  276. } //if
  277. nCount ++;
  278. } //while
  279. } //if
  280. return _T("");
  281. } //End of GetResCommandPrompt
  282. /////////////////////////////////////////////////////////////////////////////
  283. // 
  284. void CPPHtmlDrawer::SetListSpecChars()
  285. {
  286. AddSpecChar(_T("&amp;"), _T("&")); // ampersand
  287. AddSpecChar(_T("&bull;"), _T("x95")); // bullet  NOT IN MS SANS SERIF
  288. AddSpecChar(_T("&copy;"), _T("xA9")); // copyright
  289. // AddSpecChar(_T("&euro;"), _T("x80")); // euro sign IN NOT CYRILLIC FONTS
  290. AddSpecChar(_T("&euro;"), _T("x88")); // euro sign IN CYRILLIC FONTS
  291. AddSpecChar(_T("&gt;"), _T(">")); // greater than
  292. AddSpecChar(_T("&iquest;"), _T("xBF")); // inverted question mark
  293. AddSpecChar(_T("&lt;"), _T("<<")); // less than
  294. AddSpecChar(_T("&nbsp;"), _T(" ")); // nonbreaking space
  295. AddSpecChar(_T("&para;"), _T("xB6")); // paragraph sign
  296. AddSpecChar(_T("&pound;"), _T("xA3")); // pound sign
  297. AddSpecChar(_T("&quot;"), _T(""")); // quotation mark
  298. AddSpecChar(_T("&reg;"), _T("xAE")); // registered trademark
  299. AddSpecChar(_T("&trade;"), _T("x99")); // trademark NOT IN MS SANS SERIF
  300. } //End of SetListSpecChars
  301. void CPPHtmlDrawer::AddSpecChar(LPCTSTR lpszAlias, LPCTSTR lpszValue)
  302. {
  303. iter_mapStyles iter = m_mapSpecChars.find(lpszAlias);
  304. if (iter != m_mapSpecChars.end())
  305. iter->second = lpszValue; //Modifies
  306. else
  307. m_mapSpecChars.insert(std::make_pair(lpszAlias, lpszValue)); //Add new
  308. } //End of AddSpecialChar
  309. void CPPHtmlDrawer::ReplaceSpecChars()
  310. {
  311. CPPString sAlias, sValue;
  312. for (iter_mapStyles iter = m_mapSpecChars.begin(); iter != m_mapSpecChars.end(); ++iter)
  313. {
  314. sAlias = iter->first;
  315. sValue = iter->second;
  316. m_csHtmlText.Replace(sAlias, sValue);
  317. } //for
  318. m_csHtmlText.Remove(_T('r'));
  319. if (!m_bEnableEscapeSequences)
  320. {
  321. //ENG: Remove escape sequences
  322. //RUS: 愉嚯