如何在MessageBox()中改变光标?WinAPI,C++(23)

fwzugrvs  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(123)

我用途:

MessageBox(nullptr, "Hello, World!", "Test", MB_OK);

字符串
但是我需要使用SetCursor函数(我的抽象任务)。
举例来说:

SetCursor(LoadCursor(nullptr, IDC_NO));


有没有可能是MessageBox?
或者任何带Windows的原始实现都可以...

ibrsph3r

ibrsph3r1#

如果你需要比MessageBox提供的功能更多的功能,使用DialogBoxParam更简单。但是,如果你想用MessageBox来做这件事,你可以使用SetWindowsHookExW来控制MessageBox调用,然后子类化它的窗口。

class __declspec(novtable) SubClsWnd
{
    static LRESULT CALLBACK s_MySubclassProc(
        HWND hWnd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        UINT_PTR uIdSubclass,
        DWORD_PTR dwRefData
        )
    {
        return reinterpret_cast<SubClsWnd*>(dwRefData)->MySubclassProc(hWnd, uMsg, wParam, lParam, uIdSubclass);
    }

protected:
    virtual LRESULT CALLBACK MySubclassProc(HWND hWnd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        UINT_PTR uIdSubclass) = 0;

public:

    BOOL SetSubclass(_In_ HWND hwnd, _In_ UINT_PTR uIdSubclass)
    {
        return SetWindowSubclass(hwnd, s_MySubclassProc, uIdSubclass, (ULONG_PTR)this);
    }

    BOOL RemoveSubclass(_In_ HWND hwnd, _In_ UINT_PTR uIdSubclass)
    {
        return RemoveWindowSubclass(hwnd, s_MySubclassProc, uIdSubclass);
    }
};

class CDemo : public SubClsWnd
{
    HCURSOR _M_hc = 0;

    virtual LRESULT CALLBACK MySubclassProc(HWND hWnd,
        UINT uMsg,
        WPARAM wParam,
        LPARAM lParam,
        UINT_PTR uIdSubclass)
    {
        switch (uMsg)
        {
        case WM_SETCURSOR:
            SetCursor(_M_hc);
            return TRUE;

        case WM_NCDESTROY:
            RemoveSubclass(hWnd, uIdSubclass);
            delete this;
            break;
        }

        return DefSubclassProc(hWnd, uMsg, wParam, lParam);
    }

public:
    ~CDemo()
    {
        if (_M_hc) DestroyCursor(_M_hc);
    }

    BOOL Init()
    {
        return 0 != (_M_hc = LoadCursorW(0, IDC_SIZEALL));
    }
};

LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam )
{
    if (nCode == HCBT_CREATEWND)
    {
        CBT_CREATEWND* pccw = reinterpret_cast<CBT_CREATEWND*>(lParam);

        if (pccw->lpcs->lpszClass == WC_DIALOG)
        {
            if (CDemo* p = new CDemo)
            {
                if (!p->Init() || !p->SetSubclass((HWND)wParam, 0))
                {
                    delete p;
                }

            }
        }
    }

    return CallNextHookEx(0, nCode, wParam, lParam);
}

///////////////////////////////////////////////////////////////////
if (HHOOK hhk = SetWindowsHookExW(WH_CBT, CBTProc, 0, GetCurrentThreadId()))
{
    MessageBoxW(0,0,0,MB_ICONINFORMATION);
    UnhookWindowsHookEx(hhk);
}

字符串

相关问题