特定对话框控件的 MFC SetFont 不起作用
Posted
技术标签:
【中文标题】特定对话框控件的 MFC SetFont 不起作用【英文标题】:MFC SetFont for specific dialog control not working 【发布时间】:2015-08-19 11:23:55 【问题描述】:我有一个标准的 MFC SDI 应用程序。在关于对话框(使用 MFC 向导创建)中,我正在尝试更改一些静态文本格式(标签)。这是我的代码:
BOOL CAboutDlg::OnInitDialog()
CDialogEx::OnInitDialog();
auto font_programname = std::make_shared<CFont>();
font_programname->CreateFontW(25, 0, 0, 0, FW_BLACK, 0, 1, 0, 0, 0, 0, 0, 0, _T("Arial"));
_label_programname.SetFont(font_programname.get());
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
但是,这只会导致字体变粗,但大小不会改变。我做错了什么?
【问题讨论】:
您确定 25 是有效值吗? CreateFontW 是否返回 0? 另一件事:根据 MS 文档,您不应该在标签被销毁之前传递可能被销毁的 Font 对象(此处链接:support.microsoft.com/en-us/kb/85518)。您应该让 font_programname 成为 CAboutDlg 中的类成员。 @o_weisman 它返回 1 那么,我的第二个建议怎么样? @o_weisman 尝试使用原始指针进行调试,输出相同!还是谢谢你! 【参考方案1】:字体变得更粗了,所以 CreateFont 和 SetFont 正在做一些事情。这使得字体映射器成为下一个嫌疑人。 “Arial”是一个建议,但字体映射器将首先查看其他特征。您看到的字体很可能是 FW_BLACK 粗细中可用的最大光栅(非 True Type)字体。获得您想要的确切字体将需要填写 CreateFont 的其他参数,以便找到所需的字体。
对于调试,在 CreateFont 调用之后调用 GetLogFont 并查看数据结构以查看实际映射的字体。
上面关于字体生命周期的评论是正确的。这可能不是您面临的第一个问题,但它是一个问题。 CFont需要是对话框类的变量,而不是函数中的局部变量,所以字体对象的存在时间与对话框上的控件一样长。
【讨论】:
【参考方案2】:看起来您不需要 CFont
对象来满足您的目的,因为您让它超出了范围。
另见WM_SETFONT
。
const int iFontSize = 25;
const CString sFont = L"Arial";
HFONT hFont = CreateFontW(iFontSize, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, sFont);
yourControl.SendMessageW(WM_SETFONT, reinterpret_cast<WPARAM>(hFont), TRUE);
lParam 的低位字指定是否应在设置字体后立即重绘控件。如果此参数为 TRUE, 控件会自行重绘。
虽然您应该将对象也保存在容器中,(例如std::vector<HFONT>
)并稍后删除/所有对象(析构函数)。
当不再需要字体时,应用程序应调用DeleteObject函数删除字体;例如,在它破坏了控件之后。
【讨论】:
以上是关于特定对话框控件的 MFC SetFont 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 MFC 中,当 CEdit 控件达到最大字符时,退格不起作用