MFC SetFont用于特定对话框控件无法正常工作

时间:2015-08-19 11:23:55

标签: c++ mfc

我有一个标准的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
}

但是,这只会导致字体变粗,但大小不会改变。我做错了什么?

2 个答案:

答案 0 :(得分:1)

字体变得更大胆,因此CreateFont和SetFont正在做一些事情。这使得Font Mapper成为下一个嫌疑人。 “Arial”是一个建议,但字体映射器将首先查看其他特征。您看到的字体很可能是FW_BLACK权重中可用的最大栅格(非True Type)字体。获取所需的确切字体将需要填写CreateFont的其他参数,以便找到所需的字体。

对于调试,请通过调用GetLogFont来跟随CreateFont调用,并查看数据结构以查看实际映射的字体。

以上关于字体生命周期的评论是正确的。这可能不是您面临的第一个问题,但这是一个问题。 CFont需要是一个对话框类变量,而不是函数中的局部变量,因此字体对象的持续时间与对话框中的控件一样长。

答案 1 :(得分:1)

看起来你不需要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>)并稍后删除/ all对象(析构函数)。

  

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