[MFC]如何改变对话框EDIT Control内控件的字体?

MFC 同时被 2 个专栏收录
8 篇文章 0 订阅
11 篇文章 0 订阅

[MFC]如何改变对话框EDIT Control内控件的字体?

  (2012-09-19 11:47:55)
标签: 

it

分类: 计算机

 [问题提出]

 你有没有感到Edit,Static....控件的字体太单调,没什么新新样?下面的内容,给你一

个解答.

 [解决方法]

 简单的步骤:在Windows中,每个窗体都有自己的字体.要改变其字体首先要

CFont::CreateFont创建一个字体,然后用CWnd::SetFont选择此字体,赋给控件.但很多

人可能会因为CreateFont的参数之多,望而却步.下面我介绍一下参数.

 

 函数原型:

 BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int

nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut,

BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE

nPitchAndFamily, LPCTSTR lpszFacename );

 

 参数说明:

 nHeight         :字体高度.>0:字体的高度值;=0:字体采用缺省直.<0:此值的绝对

值为高度.

 nWidth          :字体宽度.

 nEscapement     :文本行的倾斜度.

 nOrientation    :字符基线的倾斜度.

 nWeight         :字体的粗细.如下:

    .FW_DONTCARE

    .FW_THIN

    .FW_EXTRALIGHT

     .....

 bItalic         :字体是否为斜体

 bUnderline      :字体是否带下划线

 cStrikeOut      :字体是否带删除线

 nCharSet        :字体的字符集

    .ANSI_CHARSET

    .DEFAULT_CHARSET

    .SYMBOL_CHARSET

     ......

 nOutPrecision   :字符的输出精度

 nClipPrecision :字符裁剪的精度

 nQuality        :字符的输出质量

 nPitchAndFamily :字符间距和字体族(低位说明间距,高位说明字符族)

 lpszFacename    :字体名称

 [程序实现]

 假设你已有了名为My的对话框工程.并有一个ID=IDC_EDIT1的Edit控件.

 class CMyDlg : public CDialog

 {

 public:

         CFont m_Font;

 ........

 };

 

 BOOL CTMyDlg::OnInitDialog()

 {

     CDialog::OnInitDialog();

 

     // TODO: Add extra initialization here

     //CFont m_Font;

     m_Font.CreateFont(-

11,0,0,0,100,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRE

CIS,DEFAULT_QUALITY,FF_SWISS,"Arial");

    CEdit *m_Edit=(CEdit *)GetDlgItem(IDC_EDIT1);

     m_Edit->SetFont(&m_Font,FALSE);

     return TRUE; // return TRUE unless you set the focus to a control

 }

 说明:在OnInitDialog()中的//CFont m_Font;前的"//"号去掉,将类声明中的CFont

m_Font;去掉会是什么结果?请自己试试.

 

*

*

*

按照以上步骤后,程序编译运行会报错:error C2664: 'CFont::CreateFontW' : cannot convert parameter 14 from 'const char [6]' to 'LPCTSTR'

 

解决方法:

        试下m_Font.CreatePointFont(300,_T("华文行楷"),NULL);即可











MFC改变对话框中静态文本的字体大小收藏

MFC改变对话框中静态文本的字体大小

2010/08/09 11:30

转:

 

VC的对话框字体设置对所有控件都有效,你不能单独地改变某个静态文本的字体。对于你的问题,需要首先用CreateFont来建立一个字体对象,然后调用控件的SetFont,就可以了。

例子:

1、改静态文体的ID,如:IDC_STATIC1

2、添加一个Edit控件,建立一个关联的控件m_editControl。

3、在OnInitDialog中添加如下代码:

CFont * f;

f = new CFont;

f->CreateFont(16,            // nHeight

    0,           // nWidth

    0,           // nEscapement

    0,           // nOrientation

    FW_BOLD,     // nWeight

    TRUE,        // bItalic

    FALSE,       // bUnderline

     0,          // cStrikeOut

    ANSI_CHARSET,              //nCharSet

    OUT_DEFAULT_PRECIS,        //nOutPrecision

    CLIP_DEFAULT_PRECIS,       //nClipPrecision

    DEFAULT_QUALITY,           //nQuality

    DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily

    _T("Arial"));             // lpszFac

 

m_editControl.SetFont(f);

m_editControl.SetWindowText("问专家");

GetDlgItem(IDC_STATIC1)->SetFont(f);

 

运行结果如下图所示,下载完整例子 CtrlFont.zip。

 

需要注意的是,这里我们使用的是CFont指针,而不是普通的CFont局部变量,如果把程序改成下面这样:

CFont f;

f.CreateFont(16,             // nHeight

    0,           // nWidth

    0,           // nEscapement

    0,           // nOrientation

    FW_BOLD,     // nWeight

    TRUE,        // bItalic

    FALSE,       // bUnderline

    0,           // cStrikeOut

    ANSI_CHARSET,              //nCharSet

    OUT_DEFAULT_PRECIS,        //nOutPrecision

    CLIP_DEFAULT_PRECIS,       //nClipPrecision

    DEFAULT_QUALITY,           //nQuality

    DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily

     _T("Arial"));

 

m_editControl.SetFont(&f);

m_editControl.SetWindowText("问专家");

GetDlgItem(IDC_STATIC1)->SetFont(&f);

 

运行后就得不到想要的效果了,因为OnInitDialog函数执行完毕,CFont f就会被清除。必须保证SetFont设置的字体对象在对话框关闭前一直有效。所以通常是使用指针或类成员的方式来保存所建立的字体对象。

非MFC程序,首先用CreateFont来建立一个字体句柄,然后再用SendMessage发给控件WM_SETFONT消息,将建立的字体句柄赋值过去,就可以了。

 

cHeight是字体的高度。

cWidth是字体的宽度。

cEscapement是字体的倾斜角。

cOrientation是字体的倾斜角。

cWeight是字体的粗细。

bItalic是字体是否斜体。

bUnderline是字体是否有下划线。

bStrikeOut是字体是否有删除线。

iCharSet是字体使用的字符集。

iOutPrecision是指定如何选择合适的字体。

iClipPrecision是用来确定裁剪的精度。

iQuality是怎么样跟选择的字体相符合。

iPitchAndFamily是间距标志和属性标志。

 

pszFaceName是字体的名称。

 

CreateFont()函数的MSDN翻译

 

函数功能:该函数创建一种有特殊性的逻辑字体,此逻辑字体可以在后面被任何设备选择。

 

    函数原型:HFONT CreateFont(int nHeight,

                           int nWidth,

                           int nEscapement,

                           int nOrientation,

                           int fnWeight,

                           DWORD fdwltalic,

                           DWORD fdwUnderline,

                           DWORD fdwStrikeOut,

                          DWORD fdwCharSet,

                           DWORDfdwOutputPrecision,

                           DWORDfdwClipPrecision,

                           DWORD fdwQuality,

                           DWORDfdwPitchAndFamily,

                           LPCTSTR lpszFace);

 

    参数:

 

   nHeight:指定字体的字符单元或字符的逻辑单位高度,字符的高度值(也被称为em高度)是指字符单元高度值减去内部标头值。字体映射器以如下方式解释nHeight指定的值,各值含义为:

 

   >0:字体映射器转换这个值以设备单位,并和已有字体的单元高度相匹配。

 

    0:字体映射器转换在选择匹配时用一个缺省的高度值。

 

   <0:字体映射器转换这个值到设备单位,并将它的绝对值和已有字体的字符高度相匹配。

 

    比较所有的高度,字体映射器选择不超过要求大小的最大字体。

 

    此映射当字体第一次被使用时发生。

 

    对于MM_TEXT映射方式,可以用下面的公式为一种指定了点大小的字体确定高度:

 

   nHeight=-MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY),72)

 

   nWidth:指定所要求字体的字符的逻辑单位的平均宽度。如果此值为0,字体映射器选择一个closestmatch值,closestmatch值是由比较当前设备的特征系数与可使用字体的数字化特征系数之差的绝对值而确定的。

 

   nEscapement:指定移位向量和设备X轴之间的一个角度,以十分之一度为单位。移位向量平行于正文行的基线。

 

   Windows NT:当图形设备设置为GM_ADVANCED时,可以不依赖字符串的字符的定位角而指定字符串的移位角。

 

    当图形模式被设置为GM_COMPATIBLE时,nEscapement同时指定移位角和定位角,可以设置nEscapement和nOrientation为相同的值。

 

   Windows 95:nEscapement同时指定移位角和定位角,可设置nEscapement和nOrientation为相同的值。

 

   nOrientation:指定每个字符的基线和设备X轴之间的角度。

 

   FnWeight:在0到1000之间指定字体的权值,如400表示标准体,700表示黑(粗)体,如果此值为0,则使用缺省的权值。

 

    为方便定义,可使用如下值:

 

   FW_DONTCARE:0;FW_THIN;100;FW_EXTRALIGHT;200;FW_ULTRALIGHT;200;FW_LIGHT;300;

 

   FW_NORMAL:400;FW_REGULAR;400;FW_MEDIUM;500;FW_SEMIBOLD;600;FW_DEMIBOLD;600;

 

   FW_BOLD:700;FW_EXTRABOLD;800;FW_ULTRABOLD;800;FW_HEAVY;900;FW_BLACK;900。

 

   fdwItalic:如果设置为TRUE则指定斜体。

 

   fdwUnderline:如果设置为TRUE,则指定加下划线的字全。

 

   fdwStrikeOut:如果设置为TRUE,则strikeout指定字体。

 

   fdwCharSet:指定字符集,下列值是预定义的:

 

   ANSI_CHARSET; BALTIC_CHARSET; CHINESEBIG5_CHARSET; DEFAULT_CHARSET;

 

   EASTEUROPE_CHARSET; GB2312_CHARSET; GREEK_CHARSET; HANGUL_CHARSET;MAC_CHARSET; OEM_CHARSET; RUSSIAN_CHARSET; SHIFTJIS_CHARSET;

 

   SYMBOL_CHARSET; TURKISH_CHARSET。

 

    韩国Windows:JOHAB_CHARSET;

 

    中东地区Windows:HEBREW_CHARSSET; ARABIC_CHARSET

 

    泰国Windows:THAI_CHARSET

 

   OEM_CHARSET指定的字符集与操作系统有关。

 

    可以使用DEFAULT_CHARSET值来允许字体的名字和大小来充分描述逻辑字体。如果指定的字体名不存在,任何字符集的字体都可以替代指定的字体,所以应该小心地用DEFAULT_CHARSET来避免不期望的结果出现。

 

    操作系统中存在其他字符集的字体。如果一个应用程序用一种未知字符集的字体,则应用程序不会试图去翻译或解释用那种字体写出来的字符串。

 

    在字体映射过程中此参数很重要。为确保获得一致的结果,指定一个特殊的字符集。如果在lpszFace参数中指定了一个字体名,确定fdwCharSet值与由lpszFace指定的字体字符集是否匹配。

 

   fdwOutputPrecision:指定输出精度,输出精度义输出与要求的字体高度、宽度、字符定位、移位、字符间距和字符类型的匹配程序,它可取下列值之一:

 

   OUT_CHARACTER_PRECIS;未用。

 

   OUT_DEFAULT_PRECIS:指定缺省的字体映射器状态。

 

   OUT_DEVICE_PRECIS:指示字体映射器在当系统里有多种字体使用同一个字体使用同一个名字时选择一种设备字体。

 

   OUT_OUTLINE_PRCIS:在Windows NT中此值指示字体映射器从TrueType和其他基于边框的字体中选择。

 

   OUT_RASTER_PRECIS:指示字体映射器在当系统里有多种字体使用同一个名字时选择一种光栅字体。

 

   OUT_STRING_PRECIS:此值没有被字全映射器使用,但是当扫描字体被列举时作为返回值。

 

   OUT_STROKE_PRECIS:在Windows NT中此值没有被字体映射器使用,但是当TrueType字体、其他基于边框的字体和向量字体被列举时,作为返回值。

 

   Windows 95:此值没有被字体映射器使用,但是当TrueType字体或向量字体被列举时,作为返回值。

 

   OUT_TT_ONLY_PRECIS:指示字体映射器仅从TrueType字体中选择,如果系统中没有安装TrueType字体,则字体映射返回缺省状态。、

 

   OUT_TT_PRECIS:指示字体映射器在当系统里有多种同名的字体时选择一种TrueType字体。

 

    当操作系统含有多种与指定名字同名的字体时,应用程序可以使用OUT_DEVICE_PRECIS,OUT_RASTER_PRECIS和OUT_TT_PRECIS值来控制字体映射器如何选择一种字体,例如,如果操作系统含有名字Symbol的光栅和TrueType两种字体,指定OUT_TT_PRECIS使字体映射器选择TrueType方式。指定OUT_TT_ONLY_PRECIS使字体映射器选择一种TrueType字体,尽管这会给TrueType字体换一个名字。

 

   fdwClipPrecision;指定裁剪精度,裁剪精度定义如何裁剪部分超出裁剪区的字符,它可取一个或多个下列值:

 

   CLIP_DEFAULT_PRECIS:指定缺省裁剪状态。CLIP_CHARACTER_PRECIS:未用。

 

   CLIP_STROKE_PRECIS:未被字体映射器使用,但是当光栅字体、向量字体或TrueType字体被列举时作为返回值。在Windows环境下,为保证兼容性,当列举字体时这个值总被返回。

 

   CLIP_MASK:未用。CLIP_EMBEDDED:要使用嵌入式只读字体必须使用此标志。

 

   CLIP_LH_ANGLES:当此值被使用时,所有字体的旋转依赖于坐标系统的定位是朝左的还是朝右的。

 

    如果未使用此值,设备字体总是逆时针方向旋转,但其他字体的旋转依赖于坐标系统的定向。要得到更多关于坐标系统定向的信息,参见参数orientation。

 

   CLIP_TT_ALWAYS:未用。

 

   fdwQuality:指向输出质量,输出质量定义GDI如何仔细地将逻辑字体属性与实际物理字体属性相匹配。它可取下列值之一:

 

   DEFAULT_QUALITY:字体的外观不重要。

 

   DRAFT_QUALITY:字体外观的重要性次于使用PROOF_QUALITY时,对GDI光栅字体,缩放比例是活动的,这意味着多种字体大小可供选择,但质量可能不高,如果有必要,粗体、斜体、下划线、strikeout字体可被综合起来使用。

 

   PROOF_QUALITY:字符质量比精确匹配逻辑字体字体属性更重要。对GDI扫描字体,缩放比例是活动的,并选择最接近的大小。尽管当使用PROOF_QUALITY时,选择字体大小并不完全匹配,但字体的质量很高,并没有外观上的变形。如果有必要,粗体、斜体、下划线、strikeout字体可被综合起来使用。

 

   fdwPitchAndFamily:指定字体间距和字体族,低端二位指定字体的字符间距,它可取下列值之一:

 

   DEFAULT_PITCH;FIXED_PITCH; VARIABLE_PITCH

 

    高端四位指定字体族,可取下列值之一:

 

   FF_DECORATIVE:新奇的字体,如老式英语(Old English)。FF_DONTCARE:不关心或不知道。

 

   FF_MDERN:笔划宽度固定的字体,有或者无衬线。如Pica、Elite和Courier New。

 

   FF_ROMAN:笔划宽度变动的字体,有衬线。如MS Serif。

 

   FF_SCRIPT:设计成看上去象手写体的字体。如Script和Cursive。

 

   FF_SWISS:笔划宽度变动的字体,无斜线。如MS Sans Serif。

 

    应用程序可以用运算符OR将字符间距和字体族组合起来给fdwPitchAndFamily赋值。

 

    字体族描述一种字体的普通外观,当所有的精确字样都不能使用时,可用它们来指定字体。

 

   lpszface:指向指定字体的字样名的、以\0结束的字符串指针,字符串的长度不能超过32个字符(包括字符\0),函数EnumFontFamilies可用来列举所有当前可用字体的字样名。

 

    如果lpszFace为NULL或指向一个空串,GDI使用能匹配其他属性的第一种字体。

 

    返回值:如果函数调用成功,返回值是一种逻辑字体句柄;如果函数调用失败,返回值为NULL。

 

   Windows NT:若想获得更多错误信息,请调用GetLastError函数。

 

    备注:当一种字体不再使用时,可用DeleteObject来删除。

 

    为保护那些提供字体给Windows和Windows NT的卖主的版权,基于Win32的应用程序总是列出所选择字体的准确名字。由于不同的系统会使用不同的字体,不要认为所选择字体就是要求的字体。例如,如果要求名叫Palatino的字体,但系统没提供那样一种字体,则字体映射器将会以一种不同名但有相似属性的字体取而代之。系统总是将用户选择的字体名报告出来

 

 

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangjun2003/archive/2010/10/09/5928







  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值