我已经创建了一个自定义的静态窗口,它显示一个位图图像,这个窗口是其他窗口的子窗口。现在我想为这个窗口捕获鼠标事件,这样我就可以提供裁剪图像的功能。
但问题是,鼠标事件不会传递到此子窗口...以下是子窗口的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;
}谁能告诉我我还需要什么来捕获这个子窗口中的鼠标事件...
发布于 2011-05-04 23:12:54
用于窗口的窗口类将确定窗口的某些默认行为。静态窗口类尤其难以使用,因为Windows假设窗口永远不会更改其内容,并且不会以任何方式与用户交互。您可能会发现WM_LBUTTONDOWN正被传递到父窗口。
发布于 2011-05-05 04:05:36
如果我没记错的话:静态窗口通过返回HTTRANSPARENT作为对WM_NCHITTEST的响应,声明自己对于鼠标点击是“不可见的”。正因为如此,windows会将鼠标单击传递给父进程。如果您想要在statics中处理鼠标单击,则还需要覆盖此行为以返回HTCLIENT。
发布于 2011-05-05 14:31:52
我调用了DefWndProc()而不是origStatProc(hwnd,msg,wParam,lParam),问题就解决了……
anyWays感谢每一个人....
https://stackoverflow.com/questions/5883414
复制相似问题