首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的子窗口对鼠标事件没有反应?

为什么我的子窗口对鼠标事件没有反应?
EN

Stack Overflow用户
提问于 2011-05-04 20:33:04
回答 3查看 2.1K关注 0票数 5

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

但问题是,鼠标事件不会传递到此子窗口...以下是子窗口的WndProc的代码片段。

代码语言:javascript
复制
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;
}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-04 23:12:54

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

票数 2
EN

Stack Overflow用户

发布于 2011-05-05 04:05:36

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

票数 2
EN

Stack Overflow用户

发布于 2011-05-05 14:31:52

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

anyWays感谢每一个人....

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5883414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档