字体等宽问题

许振坪 2008-07-02 10:40:41
比如在Edit中显示字符:F和f;你会发现他们不等宽。用多行显示看得更明显。
有什么方法可以使得所有英文字符都等宽显示?如何设置字体?什么时候设置?
...全文
700 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wqvbjhc 2008-07-03
  • 打赏
  • 举报
回复
SYSTEM_FIXED_FONT 系统等宽字体
HBRUSH CCtrTestDlg::OnCtlColor(CDC* pDC,CWnd* pWnd,UINT nCtlColor)
{

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor==CTLCOLOR_EDIT)
{
pDC->SelectStockObject(SYSTEM_FIXED_FONT);
}
return hbr;
}
许振坪 2008-07-03
  • 打赏
  • 举报
回复
字体有分两种,一种是等宽字体,一种是变宽字体。LOGFONT 结构体中的lfPitchAndFamily就可以设置字体是等宽,还是变宽。
lfPitchAndFamily 值的低2位
0 DEFAULT_PITCH
1 FIXED_PITCH
2 VARIABLE_PITCH

lfPitchAndFamily 值的高4位
0x00 FW_DONTCARE
0x10 FF_ROMAN(变宽,serifs)
0x20 FF_SWISS(变宽,非serifs)
0x30 FF_MODERN(定宽)
0x40 FF_SCRIPT(模仿手写)
0x50 FF_DECORATIVE
我发现并不是所有的字体都能这样来实现设置等宽还是变宽,“Tahoma“字体就是这样,即时设置了等宽,显示还是变宽。下面是我在::OnInitDialog()添加的代码,已经可以实现了字体的等宽和变宽设置。
LOGFONT lf;
HFONT hFontNew;
TEXTMETRIC tm = {0};
TCHAR szFaceName[LF_FACESIZE] = {0};

// 先用GetTextMetrics 获取字体信息
HDC dc =::GetDC(GetDlgItem(IDC_EDIT1)->m_hWnd);
memset(&tm, 0, sizeof(TEXTMETRIC));
GetTextMetrics (dc, &tm);
GetTextFace(dc,LF_FACESIZE,szFaceName);

// 创建新字体
memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = tm.tmHeight;
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = tm.tmWeight;
lf.lfItalic = tm.tmItalic;
lf.lfUnderline = TRUE;
lf.lfStrikeOut = tm.tmStruckOut;
lf.lfCharSet = tm.tmCharSet;
lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
lf.lfQuality = DEFAULT_QUALITY;
// 变宽和等宽设置
//lf.lfPitchAndFamily = (tm.tmPitchAndFamily & 0xFC) | FIXED_PITCH;
lf.lfPitchAndFamily = (tm.tmPitchAndFamily & 0xFC) | VARIABLE_PITCH;
// 如果szFaceName = “Tahoma“字体,不管是设变宽还是等宽,显示的字体都是变宽
_tcscpy(lf.lfFaceName, szFaceName);

hFontNew = CreateFontIndirect(&lf);
if(hFontNew)
// 改变EDIT的字体
::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_SETFONT,(WPARAM)hFontNew,MAKELPARAM(TRUE, 0));
FORTUNATE99 2008-07-02
  • 打赏
  • 举报
回复
Courier New ,windows系统自带
大概这样设置
CFont m_fontSample; //这个要定义成类变量
m_fontSample.CreatePointFont(80,_T("Courier New"));
GetDlgItem(IDC_EDIT1)->SetFont(&m_fontSample);
可以在InitDialog的时候设置字体

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧