我创建了一个显示位图图像的自定义静态窗口,该窗口是其他窗口的子窗口。现在我想捕获此窗口的鼠标事件,以便我可以提供裁剪图像的功能。为什么我的子窗口对鼠标事件没有响应?
但问题是鼠标事件不会传递给此子窗口.... 以下是子窗口的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;
}
谁能告诉我,我需要些什么捕获此子窗口内的鼠标事件...
可能的原因是这个工作是DefWndProc默认返回HTCLIENT作为窗口的内部。但是,如果您调用DefWndProc()来响应所有窗口消息,那么您不再有自定义静态;你基本上有一个新的控制 - 原来的静态(除了其他WNDCLASS值之外)没有任何东西。你也可以创建自己的窗口类,而不是基于静态。你有没有计划保持的静态行为? – BrendanMcK 2011-05-05 07:53:35
@BrendanMck:STM_SETMESSAGE ....我想使用静态控件的这个消息。 – aProgrammer 2011-05-05 13:05:06
关于消息的事情是,它们基本上只是数字。你可以有一个自定义控件来响应你想要的任何消息 - 你不需要基于任何特定的控件来这样做。因此,使用自定义控件,您可以使用新名称和新值创建自己的STM_SETIMAGE等价物,或者可以“重新使用”现有的STM_SETIMAGE值。 Windows无论如何都不在乎,它仍然会将消息传递到目标窗口,而不管目标窗口是否“理解”消息的含义。 – BrendanMcK 2011-05-05 22:31:14