世界三大邪教:《Windows核心编程》の“字体”和“颜色”对话框

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 22:12:17

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

分类: Windows核心编程 2010-07-28 09:50 136人阅读 评论(0) 收藏 举报

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

}

分享到: