参考:http://topic.csdn.net/t/20020830/19/984150.html

解决方案 »

  1.   

    自己写的玩意,还真没给别人用过,帮我验证一下吧~~//////////////////////////////////////////////////////////////////////////
    /*实现窗口拖动不实时刷新,显示虚框,拖动结束后刷新,窗口高宽最小值限定一共4类宏
    1,声明 : DECLARE_SIZING_FRAME
      写在类定义中,最好写在开始出,否则Protected:可能影响后面的声明2,构造 : CONSTRUCT_SIZING_FRAME(,)
      写在类构造函数中,参数为显示尺寸最小值3,命令 : COMMAND_SIZING_FRAME
      写在BEGIN_MESSAGE_MAP一对宏中,AFX_MSG_MAP宏之外4,实现 : IMPLEMENT_SIZING_FRAME(,)
      写在cpp文件任意位置,参数为类名,基类名注 : 宏中使用的变量和函数见DECLARE_SIZING_FRAME_WITH_CUSTOM_SIZING,注意不要出现重名
         处理了ON_WM_GETMINMAXINFO,WM_EXITSIZEMOVE,WM_ENTERSIZEMOVE三个消息,不要再处理
     对于WM_SIZING命令,如果要特殊处理,请使用带有 _WITH_CUSTOM_SIZING的一系列宏
     然后再WM_SIZING中使用IMPLEMENT_SIZING_FRAME_IN_SIZING//*///////////////////////////////////////////////////////////////////////#define DECLARE_SIZING_FRAME_WITH_CUSTOM_SIZING \
    protected:\
    CPen m_penFrame ;\
    CRect m_rectOld ;\
    CRect m_rectWnd ;\
    BOOL m_bSizing ;\
    void DrawFrame ( CRect & rect ) ;\
    int SP_MIN_WIDTH ;\
    int SP_MIN_HEIGHT ;\
    afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI);\
        afx_msg LRESULT OnExitSizeMove(WPARAM,LPARAM);\
        afx_msg LRESULT OnEnterSizeMove(WPARAM, LPARAM);#define DECLARE_SIZING_FRAME \
    DECLARE_SIZING_FRAME_WITH_CUSTOM_SIZING \
    afx_msg void OnSizing(UINT fwSide, LPRECT pRect);\
    //////////////////////////////////////////////////////////////////////////#define CONSTRUCT_SIZING_FRAME(min_width,min_height) \
    m_bSizing = FALSE ;\
    LOGBRUSH lb ;\
    lb.lbColor = RGB ( 128 , 128 , 128 ) ;\
    lb.lbHatch = HS_DIAGCROSS ;\
    lb.lbStyle = BS_HATCHED ;\
    m_penFrame.CreatePen ( PS_GEOMETRIC , 3 , &lb , 0 , NULL ) ;\
    SP_MIN_WIDTH = min_width ;\
    SP_MIN_HEIGHT = min_height ;//////////////////////////////////////////////////////////////////////////#define COMMAND_SIZING_FRAME_WITH_CUSTOM_SIZING \
    ON_WM_GETMINMAXINFO()\
    ON_MESSAGE(WM_EXITSIZEMOVE,OnExitSizeMove)\
    ON_MESSAGE(WM_ENTERSIZEMOVE,OnEnterSizeMove)#define COMMAND_SIZING_FRAME \
    ON_WM_GETMINMAXINFO()\
    ON_WM_SIZING()\
    ON_MESSAGE(WM_EXITSIZEMOVE,OnExitSizeMove)\
    ON_MESSAGE(WM_ENTERSIZEMOVE,OnEnterSizeMove)//////////////////////////////////////////////////////////////////////////#define IMPLEMENT_SIZING_FRAME_WITH_CUSTOM_SIZING(class_name,base_class_name) \
    void class_name##::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) \
    {\
    if(lpMMI->ptMinTrackSize.x<=SP_MIN_WIDTH)\
    lpMMI->ptMinTrackSize.x=SP_MIN_WIDTH;\
    if(lpMMI->ptMinTrackSize.y<=SP_MIN_HEIGHT)\
    lpMMI->ptMinTrackSize.y=SP_MIN_HEIGHT;\
    base_class_name##::OnGetMinMaxInfo(lpMMI);\
    }\
    LRESULT class_name##::OnEnterSizeMove ( WPARAM wParam , LPARAM lParam )\
    {\
    GetWindowRect ( &m_rectOld ) ;\
    m_rectWnd = m_rectOld ;\
    return TRUE ;\
    }\
    LRESULT class_name##::OnExitSizeMove ( WPARAM wParam , LPARAM lParam )\
    {\
    if ( m_bSizing )\
    {\
    m_bSizing = FALSE ;\
    DrawFrame ( m_rectOld ) ;\
    SetWindowPos ( NULL , m_rectOld.left , m_rectOld.top , m_rectOld.Width () , m_rectOld.Height () , SWP_NOSENDCHANGING ) ;\
    }\
    return TRUE ;\
    }\
    void class_name##::DrawFrame ( CRect &rect )\
    {\
    CPen * pOldPen ;\
    CWnd * pDesktop = GetDesktopWindow () ;\
    CDC * pdc = pDesktop->GetWindowDC () ;\
    int oldRop2 = pdc->SetROP2 ( R2_XORPEN ) ;\
    pOldPen = pdc->SelectObject ( &m_penFrame ) ;\
    pdc->MoveTo ( rect.left , rect.top ) ;\
    pdc->LineTo ( rect.right , rect.top ) ;\
    pdc->LineTo ( rect.right , rect.bottom ) ;\
    pdc->LineTo ( rect.left , rect.bottom ) ;\
    pdc->LineTo ( rect.left , rect.top ) ;\
    pdc->SetROP2 ( oldRop2 ) ;\
    pdc->SelectObject ( pOldPen ) ;\
    pDesktop->ReleaseDC ( pdc ) ;\
    }#define IMPLEMENT_SIZING_FRAME(class_name,base_class_name) \
    IMPLEMENT_SIZING_FRAME_WITH_CUSTOM_SIZING(class_name,base_class_name) \
    void class_name##::OnSizing(UINT fwSide, LPRECT pRect) \
    {\
    if ( !m_bSizing )\
    {\
    DrawFrame ( m_rectOld ) ;\
    m_bSizing = TRUE ;\
    }\
    else\
    {\
    CRect rect = CRect(pRect);\
    DrawFrame(m_rectOld);\
    DrawFrame(rect);\
    pRect->left = m_rectWnd.left;\
    pRect->right = m_rectWnd.right;\
    pRect->top = m_rectWnd.top;\
    pRect->bottom = m_rectWnd.bottom;\
    m_rectOld = rect;\
    }\
    }\#define IMPLEMENT_SIZING_FRAME_IN_SIZING \
    if ( !m_bSizing )\
    {\
    DrawFrame ( m_rectOld ) ;\
    m_bSizing = TRUE ;\
    }\
    else\
    {\
    CRect rect = CRect(pRect);\
    DrawFrame(m_rectOld);\
    DrawFrame(rect);\
    pRect->left = m_rectWnd.left;\
    pRect->right = m_rectWnd.right;\
    pRect->top = m_rectWnd.top;\
    pRect->bottom = m_rectWnd.bottom;\
    m_rectOld = rect;\
    }
    //////////////////////////////////////////////////////////////////////////