我用途:
MessageBox(nullptr, "Hello, World!", "Test", MB_OK);
字符串但是我需要使用SetCursor函数(我的抽象任务)。举例来说:
SetCursor(LoadCursor(nullptr, IDC_NO));
型有没有可能是MessageBox?或者任何带Windows的原始实现都可以...
ibrsph3r1#
如果你需要比MessageBox提供的功能更多的功能,使用DialogBoxParam更简单。但是,如果你想用MessageBox来做这件事,你可以使用SetWindowsHookExW来控制MessageBox调用,然后子类化它的窗口。
MessageBox
DialogBoxParam
SetWindowsHookExW
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); }
字符串
1条答案
按热度按时间ibrsph3r1#
如果你需要比
MessageBox
提供的功能更多的功能,使用DialogBoxParam
更简单。但是,如果你想用MessageBox
来做这件事,你可以使用SetWindowsHookExW
来控制MessageBox
调用,然后子类化它的窗口。字符串