C++ 为什么我的子窗口对鼠标事件没有响应?
我已经创建了一个自定义的静态窗口,显示位图图像,这个窗口是其他窗口的子窗口。现在,我想捕获此窗口的鼠标事件,以便提供裁剪图像的功能 但问题是鼠标事件没有传递到此子窗口。。。。 下面是子窗口的C++ 为什么我的子窗口对鼠标事件没有响应?,c++,winapi,visual-c++,C++,Winapi,Visual C++,我已经创建了一个自定义的静态窗口,显示位图图像,这个窗口是其他窗口的子窗口。现在,我想捕获此窗口的鼠标事件,以便提供裁剪图像的功能 但问题是鼠标事件没有传递到此子窗口。。。。 下面是子窗口的WndProc的代码片段 WNDPROC origStatProc; // Variable which stores the handle of BITMAP image HBITMAP hBitmap=NULL; LRESULT CALLBACK dispWndProc(HWND hwnd,UIN
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;
}
有人能告诉我在这个子窗口中捕获鼠标事件还需要什么吗…用于窗口的窗口类将确定窗口的某些默认行为。静态窗口类尤其难以使用,因为Windows假定窗口永远不会更改其内容,并且不会以任何方式与用户交互。您可能会发现WM\u LBUTTONDOWN正在被传递到父窗口。如果我没记错的话:静态窗口通过返回HTTRANSPARENT以响应WM\u NCHITTEST来声明自己对鼠标单击“不可见”。因此,windows将鼠标单击传递给父对象。如果要处理静态中的鼠标单击,还需要重写此行为以返回HTCLIENT。我调用了DefWndProc()而不是origStatProc(hwnd、msg、wParam、lParam),问题就解决了
无论如何,感谢大家……这项工作的可能原因是默认情况下,DefWndProc返回窗口内部的HTCLIENT。但是,如果您调用DefWndProc()来响应所有窗口消息,那么实际上就不再有自定义静态;实际上,您有了一个新的控件-除了WNDCLASS的其他值之外,原始静态控件没有任何剩余内容。您也可以创建自己的窗口类,而不是首先基于静态。您是否计划保存来自静态的任何行为?@BrendanMck:STM_SETMESSAGE。。。。我想使用这个静态控件的消息..关于消息的事情是,它们基本上只是数字。您可以有一个自定义控件来响应您想要的任何消息-您不需要基于任何特定的控件来执行此操作。因此,使用自定义控件,您可以使用新名称和新值创建自己的STM_SETIMAGE等效项,或者您可以“重用”现有的STM_SETIMAGE值。Windows不在乎这两种方式,它仍然会将消息传递到目标窗口,而不管目标窗口是否“理解”消息的含义。