gpt4 book ai didi

MFC:动态更改控件字体大小?

转载 作者:行者123 更新时间:2023-12-04 20:20:00 26 4
gpt4 key购买 nike

我有一个 CListCtrl 类,我希望能够轻松更改其字体大小。我将 CListCtrl 子类化为 MyListControl。我可以在 PreSubclassWindow 事件处理程序中使用此代码成功设置字体:

void MyListControl::PreSubclassWindow()
{
CListCtrl::PreSubclassWindow();

// from http://support.microsoft.com/kb/85518
LOGFONT lf; // Used to create the CFont.

memset(&lf, 0, sizeof(LOGFONT)); // Clear out structure.
lf.lfHeight = 20; // Request a 20-pixel-high font
strcpy(lf.lfFaceName, "Arial"); // with face name "Arial".
font_.CreateFontIndirect(&lf); // Create the font.
// Use the font to paint a control.
SetFont(&font_);
}

这有效。但是,我想要做的是创建一个名为 SetFontSize(int size) 的方法,该方法将简单地更改现有字体大小(保持面部和其他特征不变)。所以我相信这种方法需要获取现有字体,然后更改字体大小,但我尝试这样做失败了(这会杀死我的程序):
void MyListControl::SetFontSize(int pixelHeight)
{
LOGFONT lf; // Used to create the CFont.

CFont *currentFont = GetFont();
currentFont->GetLogFont(&lf);
LOGFONT lfNew = lf;
lfNew.lfHeight = pixelHeight; // Request a 20-pixel-high font
font_.CreateFontIndirect(&lf); // Create the font.

// Use the font to paint a control.
SetFont(&font_);

}

如何创建此方法?

最佳答案

我找到了一个可行的解决方案。我愿意接受改进建议:

void MyListControl::SetFontSize(int pixelHeight)
{
// from http://support.microsoft.com/kb/85518
LOGFONT lf; // Used to create the CFont.

CFont *currentFont = GetFont();
currentFont->GetLogFont(&lf);
lf.lfHeight = pixelHeight;
font_.DeleteObject();
font_.CreateFontIndirect(&lf); // Create the font.

// Use the font to paint a control.
SetFont(&font_);
}

使其发挥作用的两个关键是:
  • 删除 LOGFONT 的副本 lfNew。
  • 调用 font_.DeleteObject();在创建新字体之前。显然已经不可能有一个现有的字体对象。 MFC 代码中有一些 ASSERT 检查现有指针。 ASSERT 是导致我的代码失败的原因。
  • 关于MFC:动态更改控件字体大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7617199/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com