WizFontsEnumerator.h
上传用户:xsxdsb
上传日期:2009-12-14
资源大小:672k
文件大小:4k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // WizFontsEnumerator.h: interface for the CWizFontsEnumerator class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_WIZFONTSENUMERATOR_H__0DB85CA3_8800_11D1_92BB_006097AEFD47__INCLUDED_)
  5. #define AFX_WIZFONTSENUMERATOR_H__0DB85CA3_8800_11D1_92BB_006097AEFD47__INCLUDED_
  6. #if _MSC_VER >= 1000
  7. #pragma once
  8. #endif // _MSC_VER >= 1000
  9. //////////////////////////////////////////////////////////////////////
  10. struct Font_EnumStep;
  11. class CWizFontsEnumerator  
  12. {
  13. public:
  14. class Font
  15. {
  16. friend class CWizFontsEnumerator;
  17. public:
  18. enum
  19. {
  20. normal = 1,
  21. italics = (normal >> 1),
  22. bold = (italics >> 1),
  23. underline = (bold >> 1)
  24. };
  25. Font() : m_bInited(false) {} // Only for ARRAY!!!
  26. Font(const LOGFONT& lf, DWORD fontType, LPCTSTR Script);
  27. Font(LPCTSTR Name, bool bItalics = true, bool bBold = true, bool bUnderline = true, DWORD fontType = TRUETYPE_FONTTYPE, LPCTSTR Script = _T(""))
  28. : m_Name (Name) , m_bItalics(bItalics), m_bBold(bBold), m_bUnderline(bUnderline),
  29.   m_dwFontType(fontType),  m_bInited(false)
  30. {
  31. if (Script && *Script)
  32. AddScript(Script);
  33. }
  34. const CString& Name () const { return m_Name; }
  35. bool CanBeItalics () const;
  36. bool CanBeBold () const;
  37. bool CanBeUnderline () const;
  38. bool CanBeRegular () const;
  39. bool MustBeItalics () const;
  40. bool MustBeBold () const;
  41. bool MustBeUnderline () const;
  42. bool MustBeRegular () const;
  43. void FillSizes(CWordArray& sizes) const;
  44. DWORD FontType () const { return m_dwFontType ; }
  45. BOOL IsTrueType () const { return (m_dwFontType & TRUETYPE_FONTTYPE); }
  46. int GetScriptsCount () const { return m_Script.GetSize(); }
  47. CString GetScript(int i) const  { return m_Script[i]; }
  48. void operator=(const Font& f);
  49. int DoEnumStep (const ENUMLOGFONTEX *lpelfe, const NEWTEXTMETRICEX *lpntme, unsigned long FontType, Font_EnumStep& data);
  50. private:
  51. CString m_Name;
  52. CStringArray m_Script;
  53. bool m_bRegular,
  54. m_bItalics, 
  55. m_bBold, 
  56. m_bUnderline;
  57. DWORD m_dwFontType; // DEVICE_FONTTYPE
  58. // RASTER_FONTTYPE
  59. // TRUETYPE_FONTTYPE 
  60. CWordArray m_sizes;
  61. mutable int m_bInited;
  62. private:
  63. void AddScript(LPCTSTR Script);
  64. void AddSize(int pp_size, int lf_height = 0);
  65. void Initialize() const;
  66. void DoInit();
  67. };
  68. CWizFontsEnumerator();
  69. virtual ~CWizFontsEnumerator();
  70. void Enumerate (HDC hdc);
  71. void Enumerate (CDC* pdc);
  72. void Enumerate (CWnd* pWnd);
  73. int GetFontsCount() const { return m_aFonts.GetSize(); }
  74. const Font* GetFont(int i) const;
  75. int FindFont(LPCTSTR Name) const;
  76. const Font* GetFont(LPCTSTR Name) const;
  77. protected:
  78. // Real functions
  79. void DoEnumerate (HDC hdc);
  80. void InternalEnumerate (CDC* pdc, bool bWayBack);
  81. void InternalEnumerate (CWnd* pWnd, bool bWayBack);
  82. void InternalEnumerate (HDC hdc, bool bWayBack);
  83. // Function called from callback in EnumProc
  84. friend int CALLBACK EnumProc (const ENUMLOGFONTEX *lpelfe, const NEWTEXTMETRICEX *lpntme, unsigned long FontType, LPARAM lParam);
  85. int DoEnumStep (const ENUMLOGFONTEX *lpelfe, const NEWTEXTMETRICEX *lpntme, unsigned long FontType); 
  86. protected:
  87. CArray<Font, Font&> m_aFonts;
  88. };
  89. //////////////////////////////////////////////////////////////////////
  90. inline const CWizFontsEnumerator::Font* CWizFontsEnumerator::GetFont(int i) const
  91. {
  92. return &(const_cast<CWizFontsEnumerator*>(this)->m_aFonts.ElementAt(i));
  93. }
  94. inline int CWizFontsEnumerator::FindFont(LPCTSTR Name) const
  95. {
  96. for (int i = 0; i < GetFontsCount(); i++)
  97. {
  98. const Font *p = GetFont(i);
  99. if (p->Name() == Name)
  100. return i;
  101. }
  102. return -1;
  103. }
  104. inline const CWizFontsEnumerator::Font* CWizFontsEnumerator::GetFont(LPCTSTR Name) const
  105. {
  106. int i = FindFont(Name);
  107. if (i >= 0)
  108. return GetFont(i);
  109. return NULL;
  110. }
  111. //////////////////////////////////////////////////////////////////////
  112. #endif // !defined(AFX_WIZFONTSENUMERATOR_H__0DB85CA3_8800_11D1_92BB_006097AEFD47__INCLUDED_)