《Windows核心編程》の「字體」和「顏色」對話框

《Windows核心編程》の「字體」和「顏色」對話框



「字體」通用對話框列出了系統中安裝的字體,用戶能夠在上面選擇字體名稱,同時能夠選擇字體大小、顏色,以及一些效果如斜線、粗體、刪除線或下劃線等,顯示選擇「字體」對話框的函數是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_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;

}

相關文章
相關標籤/搜索