随便新建一个MFC项目,我选了MDI,SDI差不多吧。
先把视图背景改成灰色,在BOOL CMFCMDIView::PreCreateWindow(CREATESTRUCT& cs)中:
BOOL CMFCMDIView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 cs.lpszClass = AfxRegisterWndClass(CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS, LoadCursor(NULL, IDC_ARROW), (HBRUSH)GetStockObject(LTGRAY_BRUSH)); return CView::PreCreateWindow(cs); }
当然还有一个方法,响应WM_ERASEBKGND消息:
BOOL CMFCMDIView::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 RECT rcClient; GetClientRect(&rcClient); pDC->FillSolidRect(&rcClient, GetSysColor(COLOR_APPWORKSPACE)); return TRUE; //return CView::OnEraseBkgnd(pDC); }都行。在OnDraw中画一遍也行。
在视图类添加一个成员变量:
protected: CRectTracker m_Tracker;找个地方初始化一下,视图类的构造函数也行:
m_Tracker.m_rect.SetRect(5, 5, 69, 69); m_Tracker.m_nStyle = CRectTracker::resizeOutside | CRectTracker::dottedLine;
为了给拉伸句柄一个鼠标指针变化的指示,响应WM_SETCURSOR消息:
BOOL CMFCMDIView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: 在此添加消息处理程序代码和/或调用默认值 POINT pt; GetCursorPos(&pt); ScreenToClient(&pt); switch( m_Tracker.HitTest(pt)) { case CRectTracker::hitRight: SetCursor(LoadCursor(NULL, IDC_SIZEWE)); break; case CRectTracker::hitBottom: SetCursor(LoadCursor(NULL, IDC_SIZENS)); break; case CRectTracker::hitBottomRight: SetCursor(LoadCursor(NULL, IDC_SIZENWSE)); break; default: return CView::OnSetCursor(pWnd, nHitTest, message); } return TRUE; }响应鼠标消息WM_LBUTTONDOWN:
void CMFCMDIView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 int nHitTest = m_Tracker.HitTest(point); if (nHitTest == CRectTracker::hitRight || nHitTest == CRectTracker::hitBottom || nHitTest == CRectTracker::hitBottomRight) { if (m_Tracker.Track(this, point)) { Invalidate(); } } CView::OnLButtonDown(nFlags, point); }好了,下面就是绘图:
void CMFCMDIView::OnDraw(CDC* pDC) { CMFCMDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; pDC->FillSolidRect(m_Tracker.m_rect, RGB(255, 255, 255)); m_Tracker.Draw(pDC); CRgn rgnClip; rgnClip.CreateRectRgnIndirect(m_Tracker.m_rect); pDC->SelectClipRgn(&rgnClip); // 设置剪裁区域免得画到画布外面去 // TODO: 在此处为本机数据添加绘制代码 pDC->MoveTo(0, 500); pDC->LineTo(500, 0); pDC->MoveTo(100, 50); pDC->LineTo(350, 100); pDC->SelectClipRgn(NULL); rgnClip.DeleteObject(); }搞定。
初始状态-〉拉伸后