通过重写WNDPROC进行按钮换肤时遇到的一个奇怪的有关问题

通过重写WNDPROC进行按钮换肤时遇到的一个奇怪的问题
本帖最后由 aaa354984213 于 2013-09-04 21:59:50 编辑
我在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);