我用途:
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);}
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_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;
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);
~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
调用,然后子类化它的窗口。字符串