\t\t孙鑫 第十课之二 字体选择对话框编程(笔记+转载)

本文介绍了如何使用CHOOSEFONT结构体和ChooseFont函数来创建一个字体选择对话框。通过设置不同的标志位,可以定制对话框的行为,如限制字体大小范围、仅显示屏幕字体等。并提供了实际应用代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 CFontDialog类

数据成员 m_cf

CHOOSEFONT m_cf; 是一个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; //当指定标志有CF_LIMITSIZE时,这个值是字体的最小点数

  INT          nSizeMax; //当指定标志有CF_LIMITSIZE时,这个值是字体的最大小点数

} CHOOSEFONT, *LPCHOOSEFONT;

结构体中成员lpLogFont是一个指向LOGFONT结构体的指针

Flags有几个可用的值:如果指定了标志CF_INITTOLOGFONTSTRUCT,打开该对话框时用lpLogFont指定值初始化对话框所显示的值。

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);

 . .....

}

 

2 自己遇到的例子

void CMy53View::OnFont() 

{

    CFontDialog dlg; 

    dlg.m_cf.Flags |= CF_INITTOLOGFONTSTRUCT | CF_EFFECTS | CF_LIMITSIZE;

    dlg.m_cf.rgbColors = color; //color 为上一次所选择的颜色

 

    dlg.m_cf.nSizeMin = 1;   //指定了标志CF_LIMITSIZE,所以这是字号最小点

    dlg.m_cf.nSizeMax = 72;   //字号最大点数

    if(IDOK == dlg.DoModal())

    {

        if (font.m_hObject) //如果字体已经创建,那么先把字体对象和字体资源分离

        {

            font.DeleteObject();

        }

        font.CreateFontIndirect(dlg.m_cf.lpLogFont); //用该指针变量来创建字体

        color = dlg.m_cf.rgbColors;    //选择字体

        strFontName = dlg.m_cf.lpLogFont->lfFaceName;   //字体名

        Invalidate();   //使窗口不可用,此时View类的OnDraw()函数调用重绘窗口,在OnDraw()函数里                  写使用这个          字体和颜色输出文字的代码

    } 

}

 

 

void CMy53View::OnDraw(CDC* pDC)

{

    CMy53Doc* pDoc = GetDocument();

    ASSERT_VALID(pDoc);

    // TODO: add draw code for native data here

    CFont *pOldFont = pDC->SelectObject(&font);

    pDC->SetTextColor(color);

    pDC->TextOut(0, 0, strFontName);

    pDC->SelectObject(pOldFont);

}


  孙鑫 第十课之二 字体选择对话框编程(笔记+转载) - 大灰狼 - 大灰狼 的博客?



 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值