如何解决当点应该在矩形内时,PtInRect无法拾取
我有一个Win32程序,我需要在其中检测是否单击了一个按钮,但是由于该按钮位于另一个控件(选项卡控件)的顶部,因此该按钮的默认功能已被破坏。我的解决方案是尝试手动检测点击,例如:
//within WM_NOTIFY:
case TCN_SELCHANGING:
{
RECT rcButton;
POINT pt;
int i = 0;
ScreenToClient(hWnd,&pt); //"hWnd" is the main window
GetClientRect(button,&rcButton); //"button" is the button's HWND handler
if (PtInRect(&rcButton,pt)) {
MessageBox(hWnd,L"Wonderful! Button was clicked!",L"Info",MB_OK | MB_ICONinformatION);
return TRUE; //stop selection from changing if button was clicked
}
return FALSE; //otherwise,allow selection to change
}
这似乎不起作用,因为我看不到按摩框。
我阅读了文档,可能需要“规格化”我的RECT
。这是问题吗?如果是这样,我该怎么办?
谢谢您的帮助。
解决方法
您的POINT pt;
变量在调用ScreenToClient(hWnd,&pt);
时未初始化,因此,其值在调用PtInRect(&rcButton,pt)
时无效。在输入时,您必须指定要ScreenToClient()
转换为客户坐标的屏幕坐标。
您可以使用GetCursorPos()
来获取鼠标光标的当前屏幕坐标。
但是,您试图通过主窗口而不是在按钮内将屏幕坐标转换为客户坐标。尝试以下类似的方法:
//within WM_NOTIFY:
case TCN_SELCHANGING:
{
POINT pt;
RECT rcButton;
GetCursorPos(&pt);
ScreenToClient(button,&pt);
GetClientRect(button,&rcButton);
if (PtInRect(&rcButton,pt))
{
MessageBox(hWnd,L"Wonderful! Button was clicked!",L"Info",MB_OK | MB_ICONINFORMATION);
return TRUE; //stop selection from changing if button was clicked
}
return FALSE; //otherwise,allow selection to change
}
或者,您可以获取按钮的客户矩形,将其转换为屏幕坐标,然后将其与鼠标的屏幕坐标进行比较:
//within WM_NOTIFY:
case TCN_SELCHANGING:
{
RECT rcButton;
POINT pt;
GetClientRect(button,&rcButton);
MapWindowPoints(button,NULL,(LPPOINT)&rcButton,2);
GetCursorPos(&pt);
if (PtInRect(&rcButton,allow selection to change
}
现在,可以说,可以使用鼠标或键盘来更改选项卡选择。在您的情况下,您只希望单击鼠标,但是TCN_SELCHANGING
不能告诉您选项卡选择正在更改的原因。为此,您将必须将选项卡控件子类化以处理WM_LBUTTONDOWN
消息(用于左键单击)和WM_KEYDOWN
消息(用于箭头,Home和End键)。然后,您可以相应地标记TCN_SELCHANGING
处理程序。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。