【问题标题】:how to determine if a POINT is inside the area of a button如何确定一个点是否在按钮区域内
【发布时间】:2011-03-02 07:40:05
【问题描述】:

如何判断一个点是否在按钮区域内? POINT 在屏幕坐标中,我有按钮所在的窗口的句柄和按钮的句柄。 我试过 ::ScreenToClient(okBtnH , &tempPosition) 其中 okBtnH 是按钮的句柄, tempPosition 是屏幕坐标中的 POINT 结构。但它不起作用。 除了手动计算按钮的屏幕位置,然后将其与 POINT str 进行比较之外,还有什么方法可以做到这一点?

【问题讨论】:

  • 定义“它不起作用”
  • ::ScreenToClient 返回 false 并且 GetLastError 返回错误 1400。无效的 Windows 句柄
  • 错误 1400 对应于 'ERROR_INVALID_WINDOW_HANDLE',您可以发布一些代码来展示您是如何使用该函数的,或者再看看您是如何使用窗口句柄的。
  • 这是我的代码:HWND okBtnH;顶部窗口 * guiWindow; guiWindow = new TopWindow(NULL); guiWindow->Create(TopWindow::IDD, NULL); guiWindow->ShowWindow(SW_SHOW); HWND okBtnH = ::GetDlgItem(guiWindow->m_hWnd,IDOK);点 tempPosition = popsition; if (!::ScreenToClient(okBtnH , &tempPosition)){DWORD i = ::GetLastError();}
  • 你不只是向窗口发送命中测试消息吗?

标签: c++ c windows winapi mfc


【解决方案1】:

您确定okBtnH 是按钮控件的句柄,而不仅仅是其 ID?如果ScreenToClient 因“无效句柄”而失败,那么您的句柄可能无效。

【讨论】:

  • 这是我获得它的方法 HWND okBtnH = ::GetDlgItem(guiWindow->m_hWnd,IDOK);并且在 msdn 上说 GetDlgItem 如果失败则返回 NULL 并且如果它返回某些内容则它是一个有效的句柄。所以也许问题更像是 ScreenToClient 是否也适用于按钮和其他控件?
  • 是的,ScreenToClient 适用于按钮和其他控件 --- 任何具有有效 HWND 的东西。如果您有嵌套的框架和视图,那么您的按钮也可能不是您认为的窗口的直接子级。
【解决方案2】:

如果您使用的是 MFC,那么您只需调用成员函数 ScreenToClient。为什么叫全局版本,你确定手柄是按钮手柄?

【讨论】:

  • 很抱歉它所依赖的问题是一个无效的句柄。当我初始化它时,我会做这样的事情“HWND okBtnH = ::GetDlgItem(guiWindow->m_hWnd,IDOK);”它创建了一个新变量,而不是写入成员变量。谢谢;
  • @ghet:您应该将此添加到原始问题中(事实上,您还应该在问题的评论中添加代码作为问题的一部分)。在我阅读此评论之前,我不明白您为什么接受安东尼的回答。只需单击问题中的 edit 选项并首先添加代码,您可以正确格式化选择它并使用 {} 按钮,然后实际问题是什么.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多