我創建了一個顯示位圖圖像的自定義靜態窗口,該窗口是其他窗口的子窗口。現在我想捕獲此窗口的鼠標事件,以便我可以提供裁剪圖像的功能。爲什麼我的子窗口對鼠標事件沒有響應?
但問題是鼠標事件不會傳遞給此子窗口.... 以下是子窗口的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