【问题标题】:Detect mouse click outside child window检测鼠标在子窗口外的点击
【发布时间】:2021-06-10 14:05:35
【问题描述】:

当用户单击窗口外的某个位置时,我想销毁一个子窗口。我尝试使用 SetCapture() 来检测鼠标点击。代码如下:

HWND textbox;

//IN case WM_CREATE:
 CreateWindowEx(NULL, L"BUTTON", L"button!",
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 10, 150, 40, hwnd,
        (HMENU)IDC_TEXTBOX, NULL, NULL);

 textbox = CreateWindowEx(
        NULL, L"EDIT", NULL,
        WS_CHILD | WS_VISIBLE | ES_MULTILINE | WS_BORDER,
        100, 100, 300, 200, hwnd, (HMENU)ID_TEXTBOX, NULL, NULL
    );
 SetWindowText(textbox, L"the initial text");

//IN CASE WM_ONLBUTTONDOWN:
  if (textbox != NULL) {
        if (SetCapture(textbox) == NULL) {
            ReleaseCapture();
            DestroyWindow(textbox);
            textbox = NULL;
        }
    }

当我在其区域之外单击时,该窗口确实被破坏了。但是,当我单击按钮时,它并没有像我预期的那样被破坏。我希望当用户单击 WHEREVER 在其窗口之外 时,子窗口会被销毁。为什么我的代码失败了?我该怎么做呢?

编辑:这是一个屏幕截图,让事情变得清晰。该窗口只有一个带有初始文本和一个按钮的编辑窗口。如上所述,当我在其窗口外单击时,子窗口会消失,但是当我单击按钮(也是在窗口外)时,编辑窗口仍然存在。

【问题讨论】:

  • 很难说有什么问题,因为我们看不到minimal reproducible example。尽管您可能想在创建后立即SetCapture,并处理WM_CAPTURECHANGED

标签: c++ winapi


【解决方案1】:

根据this thread,我发现EN_KILLFOCUS 通知将在编辑控制文档中为您工作。

【讨论】:

  • 当用户使用键盘离开时,您会收到EN_KILLFOCUS。问题是专门要求鼠标输入。捕获鼠标输入并销毁WM_CAPTURECHANGED 上的窗口即可完成此操作。
猜你喜欢
  • 1970-01-01
  • 2017-08-19
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
相关资源
最近更新 更多