在win7中,OnCtlColor消息函数为何会一直进入导致不停地重绘
我在XP下编写了个程序,在XP中使用正常,然后放到win7下,发现部分控件会一直重绘,当在移动对话框时,才不会重复绘制,然后通过排查,确定了是在OnCtlColor该消息处,不停地进入,导致控件地重绘;
以下是该函数处的代码
HBRUSH CCommonSetDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: 在此更改 DC 的任何属性
int nCtrlID =pWnd->GetDlgCtrlID();
if ( nCtrlID == IDC_STATIC_TITLE||nCtrlID == IDC_STATIC_FREQ)
{
// pDC->SetBkColor(RGB(122,122,255));
pDC->SetTextColor(RGB(255,50,125));
CFont font;
font.CreateFont(10,10,0,0,FW_BLACK,FALSE,FALSE,
FALSE,GB2312_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
FIXED_PITCH|FF_MODERN, _T("华文楷体"));
GetDlgItem(nCtrlID)->SetFont(&font);
font.DeleteObject();
}
// TODO: 如果默认的不是所需画笔,则返回另一个画笔
return hbr;
}
若是有错误,麻烦请指出,最好说说是啥原因啊,难道就因为说事win7的消息流程有改变而导致的么?
[解决办法]
"部分控件会一直重绘" 一定是“SetFont(&font); ”后要 重绘的控件。
SetFont(&font); 要 放 初始化中。
[解决办法]
SetFont会导致重绘的,你在一开始对话框初始化的时候对控件SetFont就可以了.
[解决办法]
"多个控件都要进行绘制的话"
同一个 类 ,则可以派生 新类。
不同类,只能“每个都要写一遍”
[解决办法]
你可以每个写一遍,或者枚举子窗口再进行操作.
比如,设置所有Static控件的字体:
HWND hWnd=::FindWindowEx(m_hWnd,NULL,_T("Static"),NULL);
While(hWnd){
::SendMessage(hWnd,WM_SETFONT...);
hWnd=::FindWindowEx(m_hWnd,hWnd,_T("Static"),NULL);
}