首页 > 其他分享 >MessageBox弹出后无响应

MessageBox弹出后无响应

时间:2023-01-02 12:23:17浏览次数:40  
标签:lParam MessageBox pWnd funStyle pfn break 响应 弹出 wndClsEx

这几天学习了自定义模板对话框类,就是说不用系统定义的模板对话框类来创建对话框

消息处理就不用返回0了,可直接返回DefWindowProc

HINSTANCE hInstance = ::GetModuleHandle(NULL);

    if (bUserDlgClsName)
    {
        TCHAR szDlgClassName[] = TEXT("MyDialogClassName");

        WNDCLASSEX wndClsEx = { 0 };
        wndClsEx.cbSize = sizeof(WNDCLASSEX);
        if (FALSE == GetClassInfoEx(hInstance, szDlgClassName, &wndClsEx))
        {
            wndClsEx.lpfnWndProc = QWnd::AfxQWindowProc;
            wndClsEx.cbClsExtra = 0;
            wndClsEx.cbWndExtra = DLGWINDOWEXTRA;         //这个必填这
            wndClsEx.hInstance = hInstance;
            wndClsEx.hIcon = ::LoadIcon(hInstance, IDI_APPLICATION);
            wndClsEx.hIconSm = ::LoadIcon(hInstance, IDI_APPLICATION);
            wndClsEx.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1);
            wndClsEx.lpszClassName = szDlgClassName;
            wndClsEx.lpszMenuName = NULL;
            wndClsEx.style = CS_HREDRAW | CS_VREDRAW;
            wndClsEx.hCursor = ::LoadCursor(hInstance, IDC_ARROW);

            if (FALSE == RegisterClassEx(&wndClsEx))
                return FALSE;

        }
    }

    m_hWnd = ::CreateDialogParam(hInstance,
        MAKEINTRESOURCE(id),
        pParent ? pParent->m_hWnd : NULL,
        (DLGPROC)QWnd::AfxQWindowProc,
        (LPARAM)this);

 

可问题就来了,在这对话框上弹出MessageBox的时候就没反应了,

找了好久,跟踪消息后发现,

MessageBox的消息也进入了消息循环,它就不能直接返回DefWindowProc,要返回0

这就尴尬了,那这自定义对话类就没有意义了,

还是只能在消息循环中判断是否是模板对话框消息来处理了。

在窗口成员变量添加:BOOL m_bDialog;来判断是否是模板对话框的消息

QWnd* pWnd = nullptr;
    if (WM_CREATE == uMsg || WM_NCCREATE == uMsg)
    {
        pWnd = (QWnd*)((LPCREATESTRUCT)lParam)->lpCreateParams;
        if (pWnd != nullptr)
        {
            pWnd->m_hWnd = hWnd;
            ::SetWindowLongPtr(hWnd, GWLP_USERDATA, LONG_PTR(pWnd));

        }
    }
    else if (WM_INITDIALOG == uMsg)
    {
        QDialog* pDlg = (QDialog*)lParam;
        if (pDlg != nullptr)
        {
            pDlg->m_hWnd = hWnd;
            ::SetWindowLongPtr(hWnd, GWLP_USERDATA, LONG_PTR(pDlg));
            return pDlg->OnInitDialog(pDlg->m_lParam);

        }
    }
    else
    {
        pWnd = (QWnd*)::GetWindowLongPtr(hWnd, GWLP_USERDATA);
    }


    if (pWnd != nullptr)
    {
        LRESULT lResult = 0;

        const MESSAGE_MAP* pMsg = pWnd->FindMessageMap(uMsg, wParam, lParam);
        if (pMsg)
        {


            FuntionStyle funStyle;
            funStyle.pfn = pMsg->pfn;

            switch (pMsg->singStyle)
            {
                case sing_vv:
                    (pWnd->*funStyle.pfn_vv)();
                    break;

                case sing_v_l:
                    (pWnd->*funStyle.pfn_v_l)(lParam);
                    break;

                case sing_v_wl:
                    (pWnd->*funStyle.pfn_v_wl)(wParam, lParam);
                    break;

                case sing_v_uii:
                    (pWnd->*funStyle.pfn_v_uii)(wParam, LOWORD(lParam), HIWORD(lParam));
                    break;

                case sing_v_up:
                    (pWnd->*funStyle.pfn_v_up)(wParam, POINT{ LOWORD(lParam), HIWORD(lParam) });
                    break;

                case sing_v_uh:
                    (pWnd->*funStyle.pfn_v_uh)(LOWORD(wParam), (HWND)lParam);
                    break;

                case sing_l_v:
                    lResult = (pWnd->*funStyle.pfn_l_v)();
                    break;

                case sing_l_l:
                    lResult = (pWnd->*funStyle.pfn_l_l)(lParam);
                    break;

                case sing_l_wl:
                    lResult = (pWnd->*funStyle.pfn_l_wl)(wParam, lParam);
                    break;

                default:
                    break;
            }

            if (lResult)
                return lResult;

            
        }

        if (pWnd->m_bDialog)
            return 0;
    }
    

    return DefWindowProc(hWnd, uMsg, wParam, lParam);

 

在消息循环中判断:

if (pWnd->m_bDialog)
return 0;

否则返回DefWindowProc

 

标签:lParam,MessageBox,pWnd,funStyle,pfn,break,响应,弹出,wndClsEx
From: https://www.cnblogs.com/greenleaf1976/p/17019708.html

相关文章