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

fwzugrvs  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(185)

我用途:

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

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

  1. SetCursor(LoadCursor(nullptr, IDC_NO));


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

ibrsph3r

ibrsph3r1#

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

  1. class __declspec(novtable) SubClsWnd
  2. {
  3. static LRESULT CALLBACK s_MySubclassProc(
  4. HWND hWnd,
  5. UINT uMsg,
  6. WPARAM wParam,
  7. LPARAM lParam,
  8. UINT_PTR uIdSubclass,
  9. DWORD_PTR dwRefData
  10. )
  11. {
  12. return reinterpret_cast<SubClsWnd*>(dwRefData)->MySubclassProc(hWnd, uMsg, wParam, lParam, uIdSubclass);
  13. }
  14. protected:
  15. virtual LRESULT CALLBACK MySubclassProc(HWND hWnd,
  16. UINT uMsg,
  17. WPARAM wParam,
  18. LPARAM lParam,
  19. UINT_PTR uIdSubclass) = 0;
  20. public:
  21. BOOL SetSubclass(_In_ HWND hwnd, _In_ UINT_PTR uIdSubclass)
  22. {
  23. return SetWindowSubclass(hwnd, s_MySubclassProc, uIdSubclass, (ULONG_PTR)this);
  24. }
  25. BOOL RemoveSubclass(_In_ HWND hwnd, _In_ UINT_PTR uIdSubclass)
  26. {
  27. return RemoveWindowSubclass(hwnd, s_MySubclassProc, uIdSubclass);
  28. }
  29. };
  30. class CDemo : public SubClsWnd
  31. {
  32. HCURSOR _M_hc = 0;
  33. virtual LRESULT CALLBACK MySubclassProc(HWND hWnd,
  34. UINT uMsg,
  35. WPARAM wParam,
  36. LPARAM lParam,
  37. UINT_PTR uIdSubclass)
  38. {
  39. switch (uMsg)
  40. {
  41. case WM_SETCURSOR:
  42. SetCursor(_M_hc);
  43. return TRUE;
  44. case WM_NCDESTROY:
  45. RemoveSubclass(hWnd, uIdSubclass);
  46. delete this;
  47. break;
  48. }
  49. return DefSubclassProc(hWnd, uMsg, wParam, lParam);
  50. }
  51. public:
  52. ~CDemo()
  53. {
  54. if (_M_hc) DestroyCursor(_M_hc);
  55. }
  56. BOOL Init()
  57. {
  58. return 0 != (_M_hc = LoadCursorW(0, IDC_SIZEALL));
  59. }
  60. };
  61. LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam )
  62. {
  63. if (nCode == HCBT_CREATEWND)
  64. {
  65. CBT_CREATEWND* pccw = reinterpret_cast<CBT_CREATEWND*>(lParam);
  66. if (pccw->lpcs->lpszClass == WC_DIALOG)
  67. {
  68. if (CDemo* p = new CDemo)
  69. {
  70. if (!p->Init() || !p->SetSubclass((HWND)wParam, 0))
  71. {
  72. delete p;
  73. }
  74. }
  75. }
  76. }
  77. return CallNextHookEx(0, nCode, wParam, lParam);
  78. }
  79. ///////////////////////////////////////////////////////////////////
  80. if (HHOOK hhk = SetWindowsHookExW(WH_CBT, CBTProc, 0, GetCurrentThreadId()))
  81. {
  82. MessageBoxW(0,0,0,MB_ICONINFORMATION);
  83. UnhookWindowsHookEx(hhk);
  84. }

字符串

展开查看全部

相关问题