Tveiker 发表于 2013-1-26 14:45:55

MFC基本绘图

一、实验目的:
1、了解vc 6.0开发工具
2、了解并学会使用绘图函数
3、了解并学会使用画刷
4、学会添加消息响应
二、实验内容:
1、画直线,椭圆、矩形
首先添加左键按下消息响应WM_LBUTTONDOWN,当按下左键,在窗口客户区画出椭圆和矩形。同时画出自己控制的直线。画一条直线只需有由两点确定。鼠标左键按下时一个键和弹起时的点。
故先添加两个点作为来存储这两个点,以及一个boolen变量以确定左键是否按下
代码如下:
响应WM_LBUTTONDOWN
void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultm_bLbuttonDown = TRUE;    //标记是否按下左键//Invalidate();//重画函数if(m_bLbuttonDown){CDC *pDC=GetDC();CBrush *pnew = CBrush::FromHandle((HBRUSH)GetStockObject(HOLLOW_BRUSH));//创建空话刷,以便在矩形和                                                                   //椭圆区域重绘时保留直线CBrush *pold = pDC->SelectObject(pnew); //选择新画刷                               CRect rect;GetClientRect(&rect);               //获得客户区的位置放在rect中pDC->Ellipse(&rect);//画一个充满整个客户区的椭圆pDC->Rectangle(100,100,200,200);//画一矩形pDC->SelectObject(pold);         //选绘画刷}m_OldPoint = point;//存储左键按下时的点CView::OnLButtonDown(nFlags, point);}
响应WM_LBUTTONUP
void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call default////当左键弹起时画线CDC *pDC=GetDC();pDC->MoveTo(m_OldPoint);pDC->LineTo(point);CView::OnLButtonUp(nFlags, point);}
程序结果截图:

http://dl.iteye.com/upload/attachment/464559/37f5803e-ca52-31ce-ad81-1f42242be6a5.png
2、画出鼠标左键在按下时所进过的曲线
首先,添加鼠标左键按下和弹起的消息响应,然后添加鼠标移动的消息响应。
添加2个BOOL型的值。m_buttondown判断左键是否按下,m_buttonup判断左键是否弹起。还添加一个按下时的点downpoint。
将这些变量在构造函数中初始化
CEx53View::CEx53View(){// TODO: add construction code herem_buttondown = FALSE;m_buttonup = FALSE;m_downpoint = 0;}三个消息响应函数如下,语句解释在其中void CEx53View::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultm_buttondown = TRUE;   //标志左键按下m_downpoint = point;   //保存当前点CView::OnLButtonDown(nFlags, point);}void CEx53View::OnLButtonUp(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultm_buttonup = TRUE;   //左键弹起m_buttondown = FALSE;//将按下的标志设为FALSECView::OnLButtonUp(nFlags, point);}void CEx53View::OnMouseMove(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call default//曲线其实就是很小一段段直线组成if(m_buttondown)//左键是否按下{CDC *pDC = GetDC();CPen NewPen;      NewPen.CreatePen(PS_SOLID,3,RGB(255,0,0));//创建新画笔红色的      CPen*pOldPen;      pOldPen=pDC->SelectObject(&NewPen); //将新画笔选入设备环境 pDC->MoveTo(m_downpoint);pDC->LineTo(point);m_downpoint = point;//将此时的点设为起点pDC->SelectObject(pOldPen); // 恢复设备环境中原来的画笔       NewPen.DeleteObject();}CView::OnMouseMove(nFlags, point);}
运行结果:

http://dl.iteye.com/upload/attachment/464561/9e25fbbc-56cf-3339-970f-a0effa8bc29d.png
3、为椭圆填充十字形。
void CEx54View::OnLButtonDown(UINT nFlags, CPoint point) {// TODO: Add your message handler code here and/or call defaultCDC *pDC=GetDC();CBrush newbrush(HS_CROSS,RGB(0,255,255));//创建一个新画刷绿色十字形CBrush *poldbrush;poldbrush=pDC->SelectObject(&newbrush);//将新画刷选入设备环境CRect rect;GetClientRect(&rect);pDC->Ellipse(&rect);//用新画刷画椭圆pDC->SelectObject(poldbrush);//恢复旧画刷CView::OnLButtonDown(nFlags, point);}
结果截图:
http://dl.iteye.com/upload/attachment/464563/574fa602-9c19-3c7c-8452-86488e36c397.png
页: [1]
查看完整版本: MFC基本绘图