“字体”通用对话框列出了系统中安装的字体,用户可以在上面选择字体名称,同时可以选择字体大小、颜色,以及一些效果如斜线、粗体、删除线或下划线等,显示选择“字体”对话框的函数是ChooseFont:
BOOL WINAPI ChooseFont(
__inout LPCHOOSEFONT lpcf
);
lpcf指向CHOOSEFONT结构:
typedef struct {
DWORD lStructSize; //结构长度
HWND hwndOwner; //所属窗口
HDC hDC; //当Flags标志指定CF_PRINTERFONTS标志时,它是打印机的DC句柄
LPLOGFONT lpLogFont; //指向一个LOGFONT结构
INT iPointSize; //选择的字体的大小,单位是1/10磅
DWORD Flags; //标志
COLORREF rgbColors; //选择的字体的颜色
LPARAM lCustData; //
LPCFHOOKPROC lpfnHook; //
LPCTSTR lpTemplateName; //
HINSTANCE hInstance; //
LPTSTR lpszStyle; //
WORD nFontType; //
INT nSizeMin; //
INT nSizeMax; //
} CHOOSEFONT, *LPCHOOSEFONT;
结构中一些重要的字段说明:
lpLogFont---指向一个包含LOGFONT结构的缓冲区。LOGFONT结构可以用来指定字体的名称和属性。如果Flags标志中指定CF_INITTOLOGFONTSTRUCT标志的话,对话框将根据这个结构初始化对话框,函数也在这里返回用户选择的字体名称:
typedef struct tagLOGFONT {
LONG lfHeight;
LONG lfWidth;
LONG lfEscapement;
LONG lfOrientation;
LONG lfWeight;
BYTE lfItalic;
BYTE lfUnderline;
BYTE lfStrikeOut;
BYTE lfCharSet;
BYTE lfOutPrecision;
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT, *PLOGFONT;
rgbColor---如果Flags标志中指定CF_EFFECTS,对话框将根据这个数值初始化“颜色”下拉式列表框。另外,函数在返回时在这里返回用户选择的字体颜色。
nFontType---返回用户选择的字体属于哪一类,可能返回值是:BOLD_FONTTYPE,ITALIC_FONTTYPE,PRINTER_FONTTYPE,REGULAR_FONTTYPE和SCREEN_FONTTYPE。
Flags---该字段的初始值决定对话框的不同行为,函数返回时也会在这里返回一些用户的选择,它可以是下列值的组合:
CF_BOTH //对话框同时列出打印机字体和屏幕字体
CF_TTONLY //对话框只显示TrueType字体
CF_EFFECTS //对话框只显示“效果”复选框
CF_FIXEDPITCHONLY //对话框的字体列表中只显示等宽字体
CF_LIMITSIZE //对话框显示的字体尺寸限于nSizeMin和nSizeMax字段指定的数值之间
CF_NOSTYLESEL //对话框不显示“字形”组合列表框
CF_NOSIZESEL //对话框不显示“大小”组合列表框
CF_SCREENFONTS //字体列表中只显示屏幕字体
调用ChooseFont函数时,函数会停留直到对话框关闭为止,当用户单击了对话框中的“确定”按钮时,函数返回TRUE;用户单击“取消”按钮时,函数返回FALSE。
在调用ChooseFont函数之前,lpLogFont字段被指向一个LOGFONT结构,对话框关闭时,函数在LOGFONT结构的lfFaceName字段中返回字体的名称,字体的效果和字形也在LOGFONT结构中返回。
用户选择的颜色在rgbColor字段中返回,字体大小在iPointSize字段中返回,由于单位是1/10磅,所以返回的数值等于对话框中选择的字体大小乘以10。
函数实例代码片段如下:
HWND hwnd; // owner window
HDC hdc; // display device context of owner window
CHOOSEFONT cf; // common dialog box structure
static LOGFONT lf; // logical font structure
static DWORD rgbCurrent; // current text color
HFONT hfont, hfontPrev;
DWORD rgbPrev;
// Initialize CHOOSEFONT
ZeroMemory(&cf, sizeof(cf));
cf.lStructSize = sizeof (cf);
cf.hwndOwner = hwnd;
cf.lpLogFont = &lf;
cf.rgbColors = rgbCurrent;
cf.Flags = CF_SCREENFONTS | CF_EFFECTS;
if (ChooseFont(&cf)==TRUE)
{
hfont = CreateFontIndirect(cf.lpLogFont);
hfontPrev = SelectObject(hdc, hfont);
rgbCurrent= cf.rgbColors;
rgbPrev = SetTextColor(hdc, rgbCurrent);
.
.
.
}
=======================================================
打开“颜色选择”对话框使用函数ChooseColor:
BOOL WINAPI ChooseColor(
__inout LPCHOOSECOLOR lpcc
);
lpcc指向结构CHOOSECOLOR:
typedef struct {
DWORD lStructSize; //结构长度
HWND hwndOwner; //所属窗口
HWND hInstance; //
COLORREF rgbResult; //如果Flags字段指定了CC_RGBINIT标志,那么创建对话框时使用这个字段
//来初始化选择框中的颜色;函数返回时在这里返回用户选择的颜色
COLORREF *lpCustColors; //指向一个16个双字的缓冲区,定义16种自定义颜色
DWORD Flags; //标志,如下的组合:
//CC_FULLOPEN---对话框显示右边的扩展部分,如果不指定这个标志,初始化时扩展
//部分不显示,但用户可以通过单击“规定自定义颜色”按钮将对话框打开
//CC_PREVENTFULLOPEN---禁止“规定自定义颜色”按钮,即不允许用户展开对话框
//的扩展部分
//CC_RGBINIT---对话框显示时用rgbResult字段的值初始化选择框中的颜色
LPARAM lCustData; //
LPCCHOOKPROC lpfnHook; //
LPCTSTR lpTemplateName; //
} CHOOSECOLOR, *LPCHOOSECOLOR;
其中COLORREF是用来指定一个RGB颜色值,如0x00bbggrr,定义如下:
typedef DWORD COLORREF;
typedef DWORD* LPCOLORREF
如果用户单击“确定”按钮,函数返回TRUE;否则函数返回FALSE。使用ChooseColor函数时要注意:lpCustColors指针不能为NULL,所以必须分配一个16个双字长度的缓冲区,如果指针是NULL会导致函数违规访问00000000h处的内存!
函数实例代码片段如下:
CHOOSECOLOR cc; // common dialog box structure
static COLORREF acrCustClr[16]; // array of custom colors
HWND hwnd; // owner window
HBRUSH hbrush; // brush handle
static DWORD rgbCurrent; // initial color selection
// Initialize CHOOSECOLOR
ZeroMemory(&cc, sizeof(cc));
cc.lStructSize = sizeof(cc);
cc.hwndOwner = hwnd;
cc.lpCustColors = (LPDWORD) acrCustClr;
cc.rgbResult = rgbCurrent;
cc.Flags = CC_FULLOPEN | CC_RGBINIT;
if (ChooseColor(&cc)==TRUE)
{
hbrush = CreateSolidBrush(cc.rgbResult);
rgbCurrent = cc.rgbResult;
}