2011-05-04 61 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

相关问题