您好,有个问题困扰我很久了,希望您能指点一下,谢谢.关键代码:HDC hWindowDC = GetWindowDC( NULL ); void DrawDragRect( HDC DC, int X, int Y, int Cx, int Cy, int Size, HBRUSH Brush ) 

    HRGN RgnIn = CreateRectRgn( X + Size, Y + Size, X + Cx - Size, Y + Cy - Size ); 
    HRGN RgnOut = CreateRectRgn( X, Y, X + Cx, Y + Cy ); 
    HRGN RgnNew = CreateRectRgn( 0, 0, 0, 0 ); 
    CombineRgn( RgnNew, RgnOut, RgnIn, RGN_XOR ); 
    SelectClipRgn( DC, RgnNew ); 
    HBRUSH BrushOld = ( HBRUSH )SelectObject( DC, Brush ); 
    PatBlt( DC, X, Y, X + Cx, Y + Cy, PATINVERT ); 
    SelectObject( DC, BrushOld ); 
    SelectClipRgn( DC, NULL ); 
    DeleteObject( RgnNew ); 
    DeleteObject( RgnOut ); 
    DeleteObject( RgnIn ); 
} 我自己实现了拖动窗口的虚框,和系统的差不多,但是,我用上面函数在屏幕上绘制的虚框,当遇到DirectDraw的窗口(一般是游戏窗口,以及Vista Areo模式)时,虚框就被覆盖掉了,但是系统绘制的虚框不会被覆盖,这个问题困扰我很久了.我尝试过把遮盖虚框的窗口都枚举出来,然后用SetWindowRgn把他们覆盖我虚框的部分全排除掉,依然没有效果

解决方案 »

  1.   

    今天用IDA跟踪了一下DefwindowProc,message=WM_SYSCOMMAND, wParam=SC_MOVE | 2, lParam=MAKELPARAM( Pt.x, Pt.y )对于SC_MOVE
    低4位的大致含义是:0表示该消息来自系统菜单
    2表示拖动标题栏对于SC_SIZE
    低4位的大致含义是:
    拖动的位置4   |  3  |  5
    ----------------
    1   |     |  2
    ----------------
    7   |  6  |  8
    看来还是不要自己实现了,用系统的算了
      

  2.   

    自从调用了DefwindowProc,鼠标消息都被系统拦截了,除了WM_ENTERSIZEMOVE和WM_EXITSIZEMOVE,直到WM_EXITSIZEMOVE