100分请教字体设置的问题!
我在一对话框上有一个ListCtrl控件。设置一按钮,点击按钮可以设置ListCtrl控件的字体大小。程序思路如下:
dlg.h文件
CListCtrl m_list;
LOGFONT lf;
int fontsize;
dlg.cpp文件
CDlg::OnInitDlg()
{
.......//其他代码
m_list.GetFont()->GetLogFont( &lf );
fontsize = (从文件中读出的字体大小值)//字体大小在上次设置后保存到文件
ResetFont();//这里调用此函数跟在OnSetFont()函数中调用该函数得到的效果不一样,这里调用后字体大小没有改变。效果等于ResetFont()函数中没有最后那句m_list.RedrawWindow();
......
}
CDlg::ResetFont()
{
lf.lfHeight = fontsize;
CFont font;
font.CreateFontIndirect( &lf );
m_list.SetFont( &font );
m_list.RedrawWindow();//这里必须要调用此函数。否则m_list内的字的大小//根本不会改变
}
CDlg::OnSetFont()
{
CSetSizeDlg sizedlg;
if( sizedlg.DoModal() == IDOK )
{
fontsize = sizedlg.m_fontsize;//m_fontsize的值从0到20
ResetFont();//这里调用此函数与在对话框初始化时调用的效果不一样。这里调用后,ResetFont()里的最后一句m_list.RedrawWindow()生效。
}
}
请各位想想怎么回事!高分相送。
我也找了原因,初步结论是OnInitDlg()函数调用之后,对话框开始绘制,此时,MFC机制会自动调用Invalidate().而Invalidate()函数似乎正是造成此问题的根源。因为我如果在ResetFont()函数中最后再加上一句Invalidate()或m_list.Invalidate(),结果都出现字体不能发送大小上的改变这一现象。这与OnInitDlg()函数之后的效果是一样的。