在用C++ Builder进行程序设计时,很多时候需要在运行状态下更改控件的字体名称或大小,虽然VCL类库中提供了TFontDialog对话框组件,但有时候并不是很方便。而C++ Builder本身又没有提供类似Word工具栏中的字体名称及大小的选择下拉列表,为方便使用,作者特编写两个字体组件 TFontNameComboBox和TFontSizeComboBox,下简单介绍一下实现的方法及原理。
要想取得系统所支持的字体及字体的大小,需要用到Windows SDK中的EnumFontFamiliesEx或EnumFontFamilies函数。这两个函数的函数原型如下:
int EnumFontFamiliesEx(
HDC hdc, // handle to device context
LPLOGFONT lpLogfont,// pointer to logical font information
FONTENUMPROC lpEnumFontFamExProc, // pointer to callback function
LPARAM lParam, // application-supplied data
DWORD dwFlags // reserved; must be zero
);
int EnumFontFamilies(
HDC hdc, // handle to device control
LPCTSTR lpszFamily, // pointer to family-name string
FONTENUMPROC lpEnumFontFamProc,// pointer to callback function
LPARAM lParam// address of application-supplied data
);
这两个函数的功能基本相同,但相对而言EnumFontFamiliesEx函数提供了更多的字体信息。在这两个函数中,都用到一个类型为FONTENUMPROC的回调函数,该函数的原型如下:
int CALLBACK EnumFontFamProc(
ENUMLOGFONT FAR *lpelf, // pointer to logical-font data
NEWTEXTMETRIC FAR *lpntm, // pointer to physical-font data
int FontType, // type of font
LPARAM lParam // address of application-defined data
);
这两个函数更详细的说明请参考MSDN。 下面是组件的简单实现代码:
/*=========================================================================== TFontNameComboBox及TFontNameSizeComboBox组件头文件 文件名称:FontComboBox.H 程序设计:梁生红 创建日期:2003-03-20 ===========================================================================*/ #ifndef FontComboBoxH #define FontComboBoxH //--------------------------------------------------------------------------- #include <SysUtils.hpp> #include <Controls.hpp> #include <Classes.hpp> #include <Forms.hpp> #include <StdCtrls.hpp> #include <printers.hpp> #include <Math.h> //--------------------------------------------------------------------------- int static PixelsPerInch;
//下列两个回调函数一定不能为类成员函数 bool __stdcall EnumFontNameProc(ENUMLOGFONT FAR *lpelf,NEWTEXTMETRICEX FAR *lpntme, int FontType, LPARAM lParam);
bool __stdcall EnumFontSizeProc(ENUMLOGFONT FAR *lpelf,NEWTEXTMETRIC FAR *lpntm, int FontType, LPARAM lParam);
//--------------------------------------------------------------------------- /* TODO : TFontNameComboBox的声明 */ class PACKAGE TFontNameComboBox : public TCustomComboBox { private: protected: void [1] [2] [3] [4] [5] [6] 下一页 [VB.NET程序]VB的ShowInTaskbar功能分析以及用VC的实现 [Delphi程序]TManagedDataSet和DataSetPool的实现 [Delphi程序]MSN / QQ 中的动画表情 在Delphi中RichEdit的实现… [VB.NET程序]MD5加密算法(16位,32位)的C#,VB的实现 [Web开发]利用JS获取IE客户端IP及MAC的实现 [Web开发]ASP.Net ViewState的实现 [Web开发]vb.net_asp.net跨栏表头_滚动表体的DataGrid的实现 [Web开发]无限分类算法 js 的实现 [JAVA开发]关于UDDI的实现 [SyBase]InnoDB 中文参考手册 --- 10 multiversioning 的实…
|