《Windows核心编程》の“字体”和“颜色”对话框

“字体”通用对话框列出了系统中安装的字体,用户可以在上面选择字体名称,同时可以选择字体大小、颜色,以及一些效果如斜线、粗体、删除线或下划线等,显示选择“字体”对话框的函数是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_FONTTYPEITALIC_FONTTYPEPRINTER_FONTTYPEREGULAR_FONTTYPESCREEN_FONTTYPE

Flags---该字段的初始值决定对话框的不同行为,函数返回时也会在这里返回一些用户的选择,它可以是下列值的组合:

CF_BOTH //对话框同时列出打印机字体和屏幕字体

CF_TTONLY //对话框只显示TrueType字体

CF_EFFECTS //对话框只显示“效果”复选框

CF_FIXEDPITCHONLY //对话框的字体列表中只显示等宽字体

CF_LIMITSIZE //对话框显示的字体尺寸限于nSizeMinnSizeMax字段指定的数值之间

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;

}

你可能感兴趣的:(windows)