FontCombo.cpp
上传用户:ledldq
上传日期:2007-01-04
资源大小:95k
文件大小:4k
源码类别:

打印编程

开发平台:

Visual C++

  1. // FontCombo.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PrintManager.h"
  5. #include "FontCombo.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #define WM_INITFONTS (WM_USER + 123)
  12. /////////////////////////////////////////////////////////////////////////////
  13. // CFontCombo
  14. CFontCombo::CFontCombo()
  15. {
  16. m_enStyle = FONTS;
  17. m_clrHilight = GetSysColor (COLOR_HIGHLIGHT);
  18. m_clrNormalText = GetSysColor (COLOR_WINDOWTEXT);
  19. m_clrHilightText = GetSysColor (COLOR_HIGHLIGHTTEXT);
  20. m_clrBkgnd = GetSysColor (COLOR_WINDOW);
  21. m_bInitOver = FALSE;
  22. }
  23. CFontCombo::CFontCombo(STYLE enStyle)
  24. {
  25. m_enStyle = enStyle;
  26. m_clrHilight = GetSysColor (COLOR_HIGHLIGHT);
  27. m_clrNormalText = GetSysColor (COLOR_WINDOWTEXT);
  28. m_clrHilightText = GetSysColor (COLOR_HIGHLIGHTTEXT);
  29. m_clrBkgnd = GetSysColor (COLOR_WINDOW);
  30. m_bInitOver =FALSE;
  31. }
  32. CFontCombo::~CFontCombo()
  33. {
  34. }
  35. BEGIN_MESSAGE_MAP(CFontCombo, CComboBox)
  36. //{{AFX_MSG_MAP(CFontCombo)
  37. ON_WM_DESTROY()
  38. ON_WM_CREATE()
  39. //}}AFX_MSG_MAP
  40. ON_MESSAGE (WM_INITFONTS,OnInitFonts)
  41. END_MESSAGE_MAP()
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CFontCombo message handlers
  44. void CFontCombo::OnDestroy() 
  45. {
  46. if (m_enStyle == FONTS)
  47. {
  48. int nCount;
  49. nCount = GetCount ();
  50. for (int i = 0; i < nCount; i++)
  51. {
  52. delete ((LOGFONT*)GetItemData (i)); //delete the LOGFONTS actually created..
  53. }
  54. }
  55. // TODO: Add your message handler code here
  56. CComboBox::OnDestroy();
  57. }
  58. int CFontCombo::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  59. {
  60. if (CComboBox::OnCreate(lpCreateStruct) == -1)
  61. return -1;
  62. if (m_enStyle == FONTS)
  63. {
  64. PostMessage (WM_INITFONTS,0,0);
  65. }
  66. return 0;
  67. }
  68. void CFontCombo::DrawFont(LPDRAWITEMSTRUCT lpDIS)
  69. {
  70. CDC* pDC = CDC::FromHandle(lpDIS->hDC);
  71. CRect rect;
  72. TRACE0 ("In Draw Fontn");
  73. // draw the colored rectangle portion
  74. rect.CopyRect(&lpDIS->rcItem);
  75. pDC->SetBkMode( TRANSPARENT );
  76. if (lpDIS->itemState & ODS_SELECTED)
  77. {
  78. pDC->FillSolidRect (rect,m_clrHilight);
  79. pDC->SetTextColor (m_clrHilightText);
  80. }
  81. else
  82. {
  83. pDC->FillSolidRect (rect,m_clrBkgnd);
  84. pDC->SetTextColor (m_clrNormalText);
  85. }
  86. if ((int)(lpDIS->itemID) < 0) // Well its negetive so no need to draw text
  87. {
  88. }
  89. else
  90. {
  91. CString strText;
  92. GetLBText (lpDIS->itemID,strText);
  93. CFont newFont;
  94. CFont *pOldFont;
  95. ((LOGFONT*)lpDIS->itemData)->lfHeight = 90; //9 point size
  96. ((LOGFONT*)lpDIS->itemData)->lfWidth = 0;
  97. newFont.CreatePointFontIndirect ((LOGFONT*)lpDIS->itemData);
  98. pOldFont = pDC->SelectObject (&newFont);
  99. pDC->DrawText(strText, rect, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
  100. pDC->SelectObject (pOldFont);
  101. newFont.DeleteObject ();
  102. }
  103. }
  104. void CFontCombo::InitFonts ()
  105. {
  106. CDC *pDC = GetDC ();
  107. ResetContent (); //Delete whatever is there
  108. EnumFonts (pDC->GetSafeHdc(),NULL,(FONTENUMPROC) EnumFontProc,(LPARAM)this);//Enumerate
  109. m_bInitOver = TRUE;
  110. }
  111. BOOL CALLBACK CFontCombo::EnumFontProc (LPLOGFONT lplf, LPTEXTMETRIC lptm, DWORD dwType, LPARAM lpData)
  112. {
  113. if (dwType == TRUETYPE_FONTTYPE && lplf->lfCharSet != SYMBOL_CHARSET) //Add only TTF fellows, If you want you can change it to check for others
  114. {
  115. int index = ((CFontCombo *) lpData)->AddString(lplf->lfFaceName);
  116. TRACE1("FONT: %sn", lplf->lfFaceName);
  117. LPLOGFONT lpLF;
  118. lpLF = new LOGFONT;
  119. CopyMemory ((PVOID) lpLF,(CONST VOID *) lplf,sizeof (LOGFONT));
  120. ((CFontCombo *) lpData)->SetItemData (index,(DWORD) lpLF);
  121. }
  122. return TRUE;
  123. }
  124. long CFontCombo::OnInitFonts (WPARAM, LPARAM)
  125. {
  126. InitFonts ();
  127. return 0L;
  128. }
  129. int CFontCombo::GetSelFont (LOGFONT& lf)
  130. {
  131. int index = GetCurSel ();
  132. if (index == LB_ERR)
  133. return LB_ERR;
  134. LPLOGFONT lpLF = (LPLOGFONT) GetItemData (index);
  135. CopyMemory ((PVOID)&lf, (CONST VOID *) lpLF, sizeof (LOGFONT));
  136. return index; //return the index here.. Maybe the user needs it:-)
  137. }
  138. void CFontCombo::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
  139. {
  140. switch (m_enStyle)
  141. {
  142. case FONTS:
  143. DrawFont(lpDrawItemStruct);
  144. break;
  145. }
  146. }
  147. void CFontCombo::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
  148. {
  149. lpMeasureItemStruct->itemHeight = 14;
  150. }