【问题标题】:Why is my child window unresponsive to mouse events?为什么我的子窗口对鼠标事件没有响应?
【发布时间】:2011-05-04 12:33:03
【问题描述】:

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

但问题是鼠标事件没有传递给这个子窗口...... 以下是子窗口WndProc的代码sn-p..

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;
}

谁能告诉我在这个子窗口中捕获鼠标事件还需要什么...

【问题讨论】:

    标签: c++ winapi visual-c++


    【解决方案1】:

    您用于窗口的窗口类将确定窗口的某些默认行为。静态窗口类特别难以使用,因为 Windows 假设窗口永远不会更改其内容,并且不会以任何方式与用户交互。您可能会发现 WM_LBUTTONDOWN 正在传递给父窗口。

    【讨论】:

      【解决方案2】:

      如果我没记错的话:静态窗口通过返回 HTTRANSPARENT 以响应 WM_NCHITTEST 来声明自己对鼠标单击“不可见”。因此,windows 会将鼠标点击传递给父级。如果您想在静态中处理鼠标点击,您还需要覆盖此行为以返回 HTCLIENT。

      【讨论】:

        【解决方案3】:

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

        谢谢大家....

        【讨论】:

        • 这个工作的可能原因是 DefWndProc 默认为窗口内部返回 HTCLIENT。但是,如果您调用 DefWndProc() 来响应所有窗口消息,那么您实际上就不再有自定义静态了。你基本上有一个新的控制 - 原来的静态没有任何东西(除了它的其他 WNDCLASS 值)。您也可以创建自己的窗口类,而不是一开始就基于静态。您是否打算保留任何静态行为?
        • @BrendanMck : STM_SETMESSAGE....我想使用这个静态控件的消息..
        • 关于消息的问题是它们基本上只是数字。您可以拥有一个自定义控件来响应您想要的任何消息 - 您不需要基于任何特定控件来执行此操作。因此,使用自定义控件,您可以使用新名称和新值创建自己的 STM_SETIMAGE 等效项 - 或者您可以“重用”现有的 STM_SETIMAGE 值。 Windows 不关心任何一种方式,它仍然会将消息传递到目标窗口,无论目标窗口是否“理解”消息的含义。
        猜你喜欢
        • 2010-10-14
        • 2014-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        相关资源
        最近更新 更多