我想将 CListCtrl 的标题 (CHeaderCtrl) 设为粗体。我不想开发自己的字体,因为我想尊重系统默认字体,而每台计算机上的字体都不同。我只想将默认字体设为粗体。可以吗?以下代码会抛出错误:
Microsoft Visual C++ Runtime Library
---------------------------
Debug Assertion Failed!
Program: C:\Windows\SYSTEM32\mfc140ud.dll
File: D:\a\_work\1\s\src\vctools\VC7Libs\Ship\ATLMFC\Src\MFC\wingdi.cpp
Line: 1113
在线:m_headerFont.CreateFontIndirect(&lf); – 参见下图。
断点时刻的 lf 的值是:
lfHeight: -12
lfWidth: 0
lfEscapement: 0
lfOrientation: 0
lfWeight: 700
lfItalic: 0 '\0'
lfUnderline: 0 '\0'
lfStrikeOut: 0 '\0'
lfCharSet: 1 '\x1'
lfOutPrecision: 0 '\0'
lfClipPrecision: 0 '\0'
lfQuality: 0 '\0'
lfPitchAndFamily: 0 '\0'
lfFaceName: 0x00000004b38fc8cc L"Segoe UI"
代码示例:
class CMFCtestDlg : public CDialogEx
{
CFont m_headerFont;
//....
//...
BOOL OnInitDialog();
}
BOOL CMFCtestDlg::OnInitDialog()
{
//.......
//.......
CFont *pDefaultFont = pHeaderCtrl->GetFont();
LOGFONT lf{0};
if(pDefaultFont != nullptr && pDefaultFont->GetLogFont(&lf))
{
// If the font is MS Shell Dlg, use SystemParametersInfo to get the system font
if(_tcscmp(lf.lfFaceName, _T("MS Shell Dlg")) == 0)
{
if(SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0))
{
lf.lfWeight = FW_BOLD;
m_headerFont.CreateFontIndirect(&lf);
pHeaderCtrl->SetFont(&m_headerFont);
}
}
}
}
5
最佳答案
1
好吧,我上面的评论是错误的,我认为它失败了,因为它无法使用您传递的参数创建字体。但原因是该m_headerFont
对象此时已经包含一个有效的字体句柄。您正在重复使用该对象,但CFont::CreateFontIndirect()
调用了CGdiObject::Attach()
,它“断言”该对象为“空”(m_hObject==NULL
)。因此,您必须使用另一个对象或在调用之前CFont
清除:m_headerFont
CreateFontIndirect()
.
.
DeleteObject(m_headerFont.Detach()); // detach and delete the old HFONT
m_headerFont.CreateFontIndirectW(&lf);
.
.
1
-
太棒了!谢谢。
–
|
–
CGdiObject::Attach()
断言失败是因为传递给函数(CFont
继承自CGdiObject
)的 GDI 对象句柄是(检查wingdi.cppNULL
中的第 1113 行)。这是因为先前对 Win32 的调用失败了。NULL
CreateFontIndirect()
–
–
–
–
|