【问题标题】:MFC SetFont for specific dialog control not working特定对话框控件的 MFC SetFont 不起作用
【发布时间】: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 尝试使用原始指针进行调试,输出相同!还是谢谢你!

标签: c++ mfc


【解决方案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&lt;HFONT&gt;)并稍后删除/所有对象(析构函数)。

    当不再需要字体时,应用程序应调用DeleteObject函数删除字体;例如,在它破坏了控件之后。

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多