MFC控件字体的改变

设置字体
函数原型:
     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            :字体高度. 三中情况 1、>0:字体的高度值(设备坐标);2、=0:字体采用缺省值. 3、<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       :字体名称


888888888888888*****************************************************************************************

方法一:

步骤一:在Dlg类中增加一个类成员变量:   

[cpp]  view plain  copy
  1. CFont m_editFont;   


注意:
这里Font对象必须是类成员变量,不能是局部变量,否则会出现只改变了光标的大小,而不能改变字体的大小。

步骤二:在OnInitDialog方法中增加下列语句:

[cpp]  view plain  copy
  1. m_editFont.CreatePointFont(180, "宋体");   
  2.   
  3. m_editPlace.SetFont(&m_editFont); // 设置新字体  


方法二:

在OnInitDialog方法中增加下列语句也可以实现:

[cpp]  view plain  copy
  1. CFont* ptf=m_editPlace.GetFont(); // 得到原来的字体  
  2.   
  3. LOGFONT lf;   
  4.   
  5. ptf->GetLogFont(&lf);   
  6.   
  7. lf.lfHeight = 20; // 改变字体高度   
  8.   
  9. strcpy (lf.lfFaceName, "隶书"); // 改变字体名称   
  10.   
  11. m_editFont.CreateFontIndirect(&lf);   
  12.   
  13. m_editPlace.SetFont(&m_editFont); // 设置新字体  


注意:If是个新的结构体变量,GetLogFont函数是实现将ptf中的LOGFONT结构体变量拷贝给If了,所以改变If不等于是改变ptf中的LOGFONT变量。所以下面必须加这两句来创建新的字体对象

m_editFont.CreateFontIndirect(&lf);

m_editPlace.SetFont(&m_editFont); // 设置新字体

MFC内 CFont  ,要修改成功,CFont的对象 的销毁不能早于对话框的销毁。


一直以为是我的程序编码问题?然而问题却不是出现在那,又花了很长时间的跟踪,最后发现问题居然出现在CListCtr组件上,倒。

  在 InsertItem(n, csText, nIndex); 这句话中设置了断点,发现csText 明明是中文,偏偏插进去显示出来却是乱码,网上查了资料,有人说这是资源设置成英文的原因,于是工程的资源设置成中文,然而,问题却没有解决,还是乱码,把我气得个半死。

   又找了很多“网文野史”,终于有人说要设置一下对话框字体才会显示正常,于是,抱着死马当活马医的态度去试试,没想到最后却成功。靠,害我白白搞了一天半。很痛苦,现在写下来,如果有碰到和我一样的人能少走弯路。

   我的程序是继承CListCtrl 这个组件的。于是我在其初始化中插入下面这几行:

 //组件中文乱码是因为没有设置字体//
 LOGFONT   lf;   
 memset(&lf,   0,   sizeof(LOGFONT));                       
 lf.lfHeight   =   18;                                                     
 strcpy(lf.lfFaceName,   "宋体");                         
 HFONT   hfont   =   ::CreateFontIndirect(&lf);       
 CFont*   font   =   CFont::FromHandle(hfont);   
 SetFont(font);
 

重新编译一下,过去了。吐血!

   搞不懂为什么程序会有这种很偏的疑难问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值