「字體」通用對話框列出了系統中安裝的字體,用戶能夠在上面選擇字體名稱,同時能夠選擇字體大小、顏色,以及一些效果如斜線、粗體、刪除線或下劃線等,顯示選擇「字體」對話框的函數是ChooseFont:編程
BOOL WINAPI ChooseFont(函數
__inout LPCHOOSEFONT lpcf字體
);spa
lpcf指向CHOOSEFONT結構:.net
typedef struct {指針
DWORD lStructSize; //結構長度blog
HWND hwndOwner; //所屬窗口ip
HDC hDC; //當Flags標誌指定CF_PRINTERFONTS標誌時,它是打印機的DC句柄內存
LPLOGFONT lpLogFont; //指向一個LOGFONT結構ci
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;
}