为什么我的子窗口对鼠标事件不响应?

5

我已经创建了一个自定义的静态窗口,它显示一个位图图像,这个窗口是其他窗口的子窗口。现在我想为这个窗口捕获鼠标事件,以便我可以提供裁剪图像的功能。

但问题是鼠标事件没有传递到这个子窗口......以下是子窗口的 WndProc 代码片段:

WNDPROC origStatProc;
    // Variable which stores the handle of BITMAP image
HBITMAP hBitmap=NULL;
LRESULT CALLBACK dispWndProc(HWND hwnd,UINT msg, WPARAM wParam, LPARAM lParam)
{
    static HDC hdc;
    static PAINTSTRUCT paintSt;
    static RECT aRect;

    switch(msg)
    {
        case WM_PAINT:
        {
            hdc = BeginPaint(hwnd,&paintSt);
            GetClientRect(hwnd,&aRect);
            if(hBitmap!=NULL)
            {               
                HDC memDC = CreateCompatibleDC(hdc);
                if(memDC!=NULL)
                {
                    BITMAP bmp;
                    GetObject(hBitmap,sizeof(bmp),&bmp);
                    SelectObject(memDC,hBitmap);
                    SetStretchBltMode(hdc,HALFTONE);
                    StretchBlt(hdc,0,0,aRect.right,aRect.bottom,
                    memDC,0,0,bmp.bmWidth,bmp.bmHeight,
                    SRCCOPY);
                    DeleteObject(&bmp);
                    ReleaseDC(hwnd,memDC);
                }
            }           
            // the code for painting 
            EndPaint(hwnd,&paintSt);
        }
        break;
        case STM_SETIMAGE:
        {           
            InvalidateRect(hwnd,&aRect,true);           
        }
            break;  
        case WM_LBUTTONDOWN:
            {
                int xPos = GET_X_LPARAM(lParam);
                int yPos = GET_Y_LPARAM(lParam);
                char xstr[10];
                _itoa(xPos,xstr,10);
                MessageBox(NULL,xstr,"X Value ",MB_OK);
            }
            break;

        default:
            return origStatProc(hwnd,msg,wParam,lParam);

    }
    return 0;
}

请问还需要哪些内容才能在这个子窗口内捕获鼠标事件...

3个回答

2

你用于窗口的窗口类将确定窗口的某些默认行为。Static窗口类特别难以处理,因为Windows假定该窗口永远不会更改其内容,并且不会与用户进行任何交互。你可能会发现WM_LBUTTONDOWN被传递到父窗口。


2
如果我没记错的话:静态窗口通过在响应WM_NCHITTEST时返回HTTRANSPARENT来声明它们对鼠标点击是“不可见”的。因此,窗口会将鼠标点击传递给父级窗口。如果你想在静态窗口中处理鼠标点击,你需要重写这个行为并返回HTCLIENT。

1

我调用了DefWndProc()而不是origStatProc(hwnd,msg,wParam,lParam),问题得到解决...

无论如何,感谢大家...


1
这个能够工作的可能原因是DefWndProc默认情况下会为窗口内部返回HTCLIENT。但如果你在响应所有窗口消息时调用DefWndProc(),那么你实际上不再拥有自定义静态控件;你本质上拥有一个新的控件——原始静态控件已经不存在了(除非它的其他WNDCLASS值)。你最好创建自己的窗口类,而不是一开始就基于静态控件。你计划保留静态控件的任何行为吗? - BrendanMcK
@BrendanMck:STM_SETMESSAGE... 我想要使用静态控件的这个消息。 - Amit
2
关于消息的事情是它们基本上只是数字。您可以拥有一个自定义控件,响应任何您想要的消息 - 您不需要基于任何特定控件来执行此操作。因此,使用自定义控件,您可以创建自己的STM_SETIMAGE等效项,具有新名称和新值 - 或者您可以只“重用”现有的STM_SETIMAGE值。Windows无论如何都不会在意,它仍将向目标窗口传递消息,而不管目标窗口是否“理解”消息的含义。 - BrendanMcK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接