微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当点应该在矩形内时,PtInRect无法拾取

如何解决当点应该在矩形内时,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 举报,一经查实,本站将立刻删除。