2011-05-04 62 views
4

我創建了一個顯示位圖圖像的自定義靜態窗口,該窗口是其他窗口的子窗口。現在我想捕獲此窗口的鼠標事件,以便我可以提供裁剪圖像的功能。爲什麼我的子窗口對鼠標事件沒有響應?

但問題是鼠標事件不會傳遞給此子窗口.... 以下是子窗口的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; 
} 

誰能告訴我,我需要些什麼捕獲此子窗口內的鼠標事件...

回答

1

您用於窗口的窗口類將確定窗口的某些默認行爲。靜態窗口類特別難處理,因爲Windows會假定窗口永遠不會改變其內容,並且不會以任何方式與用戶交互。您可能會發現WM_LBUTTONDOWN正在傳遞給父窗口。

1

如果我沒有記錯的話:通過返回HTTRANSPARENT來響應WM_NCHITTEST,靜態窗口聲​​明自己是'不可見'的鼠標點擊。因此,窗口將鼠標單擊到父項。如果你想在靜態中處理鼠標點擊,你還需要重寫這個行爲來返回HTCLIENT。

1

我呼籲DefWndProc()而不是origStatProc(HWND,味精,wParam中,lParam的),並解決了這個問題....

反正感謝大家....

+1

可能的原因是這個工作是DefWndProc默認返回HTCLIENT作​​爲窗口的內部。但是,如果您調用DefWndProc()來響應所有窗口消息,那麼您不再有自定義靜態;你基本上有一個新的控制 - 原來的靜態(除了其他WNDCLASS值之外)沒有任何東西。你也可以創建自己的窗口類,而不是基於靜態。你有沒有計劃保持的靜態行爲? – BrendanMcK 2011-05-05 07:53:35

+0

@BrendanMck:STM_SETMESSAGE ....我想使用靜態控件的這個消息。 – aProgrammer 2011-05-05 13:05:06

+2

關於消息的事情是,它們基本上只是數字。你可以有一個自定義控件來響應你想要的任何消息 - 你不需要基於任何特定的控件來這樣做。因此,使用自定義控件,您可以使用新名稱和新值創建自己的STM_SETIMAGE等價物,或者可以「重新使用」現有的STM_SETIMAGE值。 Windows無論如何都不在乎,它仍然會將消息傳遞到目標窗口,而不管目標窗口是否「理解」消息的含義。 – BrendanMcK 2011-05-05 22:31:14

相關問題