C++ p当点(应)在rect内时,不拾取rect

C++ p当点(应)在rect内时,不拾取rect,c++,winapi,controls,C++,Winapi,Controls,我有一个Win32程序,需要在其中检测按钮是否已被单击,但由于按钮位于另一个控件(选项卡控件)的顶部,因此该按钮的默认功能已被破坏。我的解决方案是尝试手动检测单击,如下所示: //在WM\u通知中: 案例TCN_sel变更: { RECT按钮; 点pt; int i=0; ScreenToClient(hWnd,&pt);/“hWnd”是主窗口 GetClientRect(button,&rcButton);/“button”是按钮的HWND处理程序 if(pIntrect(&rcButton,

我有一个Win32程序,需要在其中检测按钮是否已被单击,但由于按钮位于另一个控件(选项卡控件)的顶部,因此该按钮的默认功能已被破坏。我的解决方案是尝试手动检测单击,如下所示:

//在WM\u通知中:
案例TCN_sel变更:
{
RECT按钮;
点pt;
int i=0;
ScreenToClient(hWnd,&pt);/“hWnd”是主窗口
GetClientRect(button,&rcButton);/“button”是按钮的HWND处理程序
if(pIntrect(&rcButton,pt)){
消息框(hWnd,L“太棒了!点击了!”按钮,L“信息”,MB|U OK|MB|U图标信息);
返回TRUE;//如果单击了按钮,则停止更改选择
}
返回FALSE;//否则,允许更改选择
}
这似乎不起作用,因为我没有看到meassage框

我在文档中读到,我可能需要“规范化”我的
RECT
s。这就是问题所在吗?如果是,我该如何做


感谢您的帮助。

您的
点ptScreenToClient(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
}
或者,您可以获取按钮的客户端矩形,将其转换为屏幕坐标,然后将其与鼠标的屏幕坐标进行比较:

//在WM\u通知中:
案例TCN_sel变更:
{
RECT按钮;
点pt;
GetClientRect(按钮和rcButton);
MapWindowPoints(按钮,空,(LPPOINT)和rcButton,2);
GetCursorPos(&pt);
if(pIntrect(&rcButton,pt))
{
消息框(hWnd,L“太棒了!点击了!”按钮,L“信息”,MB|U OK|MB|U图标信息);
返回TRUE;//如果单击了按钮,则停止更改选择
}
返回FALSE;//否则,允许更改选择
}

现在,也就是说,可以使用鼠标或键盘更改选项卡选择。在您的情况下,您只需要单击鼠标,但
TCN\u SELCHANGING
不会告诉您选项卡选择正在更改的原因。为此,您必须对选项卡控件进行子类化,以处理左键单击的
WM_LBUTTONDOWN
消息,以及箭头键、主键和结束键的
WM_KEYDOWN
消息。然后您可以相应地标记
TCN\u sel更改
处理程序。

这非常有效!我(显然)完全糊涂了。非常感谢。