通过重写WNDPROC进行按钮换肤时遇到的一个奇怪的有关问题
通过重写WNDPROC进行按钮换肤时遇到的一个奇怪的问题
我在OnInitDialog中修改了按钮A的窗口过程,并且添加了一个按钮A单击的相应函数,其中调用MessageBox。可是一旦单机按钮A之后,整个程序就会卡住,一点反应都没有,直到数秒后才会弹出MessageBox,甚至一直卡住,直到手动结束(只是MB这样,进入消息处理函数时还都正常)。开始想到是否默认的窗口函数设置了定时器,就把WM_TIMER消息也吃掉,可是问题依旧。实在没办法了,求各位帮忙,多谢!
OnInitDialog函数中:
窗口过程:
------解决方案--------------------
去掉WM_PAINT中的return 1,然后添加下面的代码
我在OnInitDialog中修改了按钮A的窗口过程,并且添加了一个按钮A单击的相应函数,其中调用MessageBox。可是一旦单机按钮A之后,整个程序就会卡住,一点反应都没有,直到数秒后才会弹出MessageBox,甚至一直卡住,直到手动结束(只是MB这样,进入消息处理函数时还都正常)。开始想到是否默认的窗口函数设置了定时器,就把WM_TIMER消息也吃掉,可是问题依旧。实在没办法了,求各位帮忙,多谢!
OnInitDialog函数中:
HWND hBtn = ::GetDlgItem(m_hWnd,IDC_BTN1);
defproc = (WNDPROC)::GetWindowLong(hBtn,GWL_WNDPROC);
::SetWindowLong(hBtn,GWL_WNDPROC,(LONG)WinSunProc);
窗口过程:
LRESULT CALLBACK WinSunProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HDC hdc = (HDC)wParam;
switch(uMsg)
{
case WM_PAINT:
{
return 1;
}
case WM_ERASEBKGND:
{
::MoveToEx(hdc,0,0,NULL);
::LineTo(hdc,100,100);
return 1;
}
}
return ::CallWindowProc(defproc,hwnd,uMsg,wParam,lParam);
}
void CButtonSkinDlg::OnClickedBtn1()
{
CClientDC dc(this);
dc.TextOut(0,0,_T("COMMAND"),7);
MessageBox(_T("COMMAND"));
}
界面
MFC
VC++
窗口过程
换肤
------解决方案--------------------
去掉WM_PAINT中的return 1,然后添加下面的代码
long lStyle = ::GetWindowLong(hBtn,GWL_STYLE);
lStyle
------解决方案--------------------
= BS_OWNERDRAW;
SetWindowLong(hBtn,GWL_STYLE, lStyle);
defproc = (WNDPROC)::GetWindowLong(hBtn,GWL_WNDPROC);
::SetWindowLong(hBtn,GWL_WNDPROC,(LONG)WinSunProc);