c++简单画图程序 whut 下载本文

精品文档

在OnLButtonDown()函数中调用SetCapture()函数捕捉鼠标,OnLButtonUp()函数中调用ReleaseCapture()函数释放鼠标。整个绘图过程就是在鼠标左键按下时确定绘图起点,移动鼠标实时显示绘制的图形,鼠标左键弹起即完成图形的绘制的过程。

4. 结论与心得体会

这次课设我成功地完成了设计要求,能用鼠标拖动绘制直线段、椭圆、矩形等基本图形;能控制所绘制图形的线宽、线色、填充色等。经过程序调试,该简单画图程序能够绘制指定线宽、线色、填充色的图形,在鼠标移动的过程中能实时显示当前绘制的图形。

在拿到任务书后,我通过查阅资料,不断编程调试,以及请教同学,最终实现绘图程序的要求。我学会了鼠标消息的分类,鼠标消息处理函数的常见编程方法,以及捕捉鼠标SetCapture()函数,释放鼠标ReleaseCapture()函数。同时,利用橡皮筋技术实现鼠标绘图的实时显示是我最大的收获。

我在调试程序时,发现绘制直线时鼠标左键弹起直线并没有绘制结束,而再次单击鼠标左键,又以上次绘制的直线段终点作为起点绘制直线,即绘制出的直线段是一段连着一段的。在自己检查数遍并未发现错误之处后,我求助了同学,在OnLButtonDown()函数中添加了一句cpoint=opoint=point0之后问题得以解决。

通过这次课程设计,我学到了很多与计算机绘图相关的基础知识,并进一步体会到面向对象的程序设计的强大,以及Windows应用程序用户界面统一、友好,独立于设备的图形操作特点。这次的课程设计虽只是做了一个简单的绘图工具,但是也让我从设计者的角度了解了设计一个程序的过程,看似一个很简单的工具,其制作的背后工作是繁琐的。哪怕是平时我们使用的很顺手的一个小工具,其开发的一切步骤都不可小觑,所以,关于编程还有太多的东西等着我们去了解,学习。

5. 思考题

1) 说明直线、椭圆、矩形绘制使用的函数,及其参数含义?

答:直线、椭圆、矩形绘制使用的函数是OnPaint()。函数里面定义和创建了绘图的画笔pen和填充图形的画刷brush,3种图形本身对应的消息处理函数里分别赋给shape3个不同的值:1,2,3,在OnPaint()里有3个if语句,用来这实现这三个图形的绘制:当选择画直线时,shape=1,则执行绘制直线代码,当选择画矩形时,shape =2,则执行绘制矩形的代码,当性选择画椭圆时,shape=3,则执行绘制椭圆的代码。

2) 如何控制菜单项的状态,使用的消息类型?

.

精品文档

答:通过添加UPDATE_COMMAND_UI消息函数,在生成的函数里添加相关代码来控制菜单项的状态及使用的消息类型。如选择直线时,使shape=1,则OnUpdateLine里添加pCmdUI->SetCheck(shape==1),那么当shape的值为1时,即代表选择了直线项,此时菜单中的直线选项前就打勾了,代表选中。矩形和椭圆类似。

3) 如何设置菜单和工具栏按钮的快捷键操作?

答:切换到资源视图,选择Accelerator资源类型,双击IDR_MAINFRAME加速键资源,打开加速键编辑窗口。 在ID下拉列表框中选择相应菜单项的ID,在Key一栏中输入相应键值(比如L),选择Ctrl复选框和VirtKey单选按钮,关闭加速键编辑窗口,即可完成加速键设置,如图12所示。

图12 快捷键设置

6. 附录

6.1 调试报告

1) 一开始我并没有添加刷新函数Invalidate(),这就使程序运行之后,无论鼠标左键按下时如何移动无法绘图,这是因为当一个窗口内键入内容其实就是将窗口刷新了,相当于更新了窗口,故必须有刷新函数。

2) 在调试程序时,发现绘制直线时鼠标左键弹起直线并没有绘制结束,而再次单击鼠标左键,又以上次绘制的直线段终点作为起点绘制直线,即绘制出的直线段是一段连着一段的。在OnLButtonDown()函数中添加了一句cpoint=opoint=point0之后问题得以解决。这是因为要给初始坐标和终止坐标赋个0值,不然系统无法判断坐标位置。

6.2 测试结果

编译、连接、运行程序后,在窗口中绘制不同线宽,不同线色,不同填充色的图形后窗口如图13所示。

.

精品文档

图13 绘制各个图形

6.3 关键源代码

1) 在“MainFrm.h”中,在class CMainFrame : public CFrameWnd里的protected下定义:CToolBar m_drawToolBar; //工具栏

2) 在“MainFrm.cpp”中,在CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)里添加以下代码:

if (!m_drawToolBar.Create(this) ||

!m_drawToolBar.LoadToolBar(IDR_DRAW)) {

TRACE0(\return -1;

}

3) 在“LiYuJingView.h”中,在class CLiYuJingiew : public CView里的public下定义相关变量:

.

CLiYuJingDoc* GetDocument();

精品文档

COLORREF m_nColor; COLORREF m_fColor; CPoint cpoint; CPoint opoint; BOOL m_Down; int w; int shape;

HCURSOR m_Cursor;//光标资源句柄

4) 在“LiYuJingViewView.cpp”中,添加如下函数及代码: CLiYuJingView::CLiYuJingView() {

// TODO: add construction code here

w=1; //初始线宽默认为1 shape=0;

m_fColor=RGB(255,255,255);//初始填充色为白色

m_Cursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS); }

void CLiYuJingView::OnW5() {

w=5; //令线宽为5

} void CLiYuJingView::OnW1() { }

void CLiYuJingView::OnW2() { }

.

w=1; //令线宽为1

w=2; //令线宽为2

精品文档

void CLiYuJingView::OnW3() { }

void CLiYuJingView::OnW4() { }

void CLiYuJingView::OnUpdateW1(CCmdUI* pCmdUI) { }

void CLiYuJingView::OnUpdateW2(CCmdUI* pCmdUI) { }

void CLiYuJingView::OnUpdateW3(CCmdUI* pCmdUI) { }

void CLiYuJingView::OnUpdateW4(CCmdUI* pCmdUI) { }

.

w=3; //令线宽为3

w=4; //令线宽为4

pCmdUI->SetRadio(w==1); //当线宽为1时,此选项前标有圆点

pCmdUI->SetRadio(w==2); //当线宽为2时,此选项前标有圆点

pCmdUI->SetRadio(w==3); //当线宽为3时,此选项前标有圆点

pCmdUI->SetRadio(w==4);