16,467
社区成员
发帖
与我相关
我的任务
分享
//////////////////////////////////////////////////////////////////////////
/*实现窗口拖动不实时刷新,显示虚框,拖动结束后刷新,窗口高宽最小值限定
一共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;\
}
//////////////////////////////////////////////////////////////////////////