这个问题很困扰。我知道使用 CWnd.SetFont(pFont),但现在问题如下对话框创建多个控件,而且数量不定,可能需要对每个控件设置不同的字体。如果每个控件字体都不一样,是否每个控件,每种字体,都要建立一个 CFont 成员变量?
加上需要设置1000种字体,要添加1000个成员变量啊?这个好像不太现实吧?如果多个控件共用一个 CFont ,这个似乎也不行,因为第一个控件 SetFont()后,第二个控件字体变量要改变字体大小或字体样式,要重新建立字体 CReateFont,而重新建立的字体,则第一个控件的字体就不起作用了,因为已经被第二个控件的字体覆盖了。界面一旦重绘,就发现字体不对了。这个问题如何解决????
加上需要设置1000种字体,要添加1000个成员变量啊?这个好像不太现实吧?如果多个控件共用一个 CFont ,这个似乎也不行,因为第一个控件 SetFont()后,第二个控件字体变量要改变字体大小或字体样式,要重新建立字体 CReateFont,而重新建立的字体,则第一个控件的字体就不起作用了,因为已经被第二个控件的字体覆盖了。界面一旦重绘,就发现字体不对了。这个问题如何解决????
设置1000个控件,每个控件的字体都不一样,这时,需要建立1000个CFont吗?如果只用一个 CFont,各个控件,各种字体又如何共享?
{CDialog::OnInitDialog();
//m_lsCtrl//控件列表
CFont font = GetFont();//全设成和父窗口字体一样,控件这里用CWnd.要别的自己改
for (int i = 0; i < 1000; i++)
{
CWnd* pWnd = new CWnd();
pWnd->Create();
pWnd.SetFont(font);
m_lsCtrl.add(pWnd);
}
}
无非你是觉得1000个成员变量太多。其实你为什么要保存为成员变量呢?
你完全可以一个成员变量也不要,在初始化对话框的函数里面:
for (i = 0 i < 1000; ++i)
{
::CreateFont
::SetFont
}
记得SetFont要用API,不要用CWnd的成员函数SetFont,创建字体也可以用API,如果非要用CFont的话,如下:
SetFont(..., font.Detach());
这是因为CFont是一个类,在析构的时候,会删除字体,调用Detach之后,就不会删除了。
m_font = new CFont;
m_font->CreateFont(30, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_BOLD, // nWeight
0, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
_T("宋体")); m_List.SetFont(m_font);
谢谢,我要问的是:如果有 n 个控件需要设置不同的字体,我是否要创建 n 个m_font?
如果这个 n 不是一个定数,那应该怎么办?
谢谢,这样应该是没问题,但字体配置文件读取之后,还是要放到 n 个 CFont 中,才能设置控件字体。现在的问题是,我不希望创建那么多个 CFont对象,但如果只要一个CFont,字体对象就不能保存了。
HFONT hFont=font.Detach(); //切断CFont 和 HFONT的关联,保存了句柄
SetFont(hwnd, hFont); //设置字体之后,显然字体对象被保存了,但是否会产生资源泄露?这里的hFont没有被删除。
GetFont
DeleteObject
你本来就有1000种字体,所以创建1000次是肯定需要的
局部变量创建后,在作用域离开后,释放对象,不过你可以new cfont
然后用一个成员数组变量记录他
最后退出识释放