26.2.3 设计画图程序
除了通过程序控制图形的绘制外,经常会遇到需要根据用户的输入来绘制指定样式的图形,本节以一个简单的例子,讲解如何设计画图程序。介绍如何通过捕获用户的输入来绘制矩形和直线。用户可以根据自己的需要,增加其他形状和样式的绘制。设计画图程序主要分为两个步骤。
(1)处理按钮事件,本节定义了3个按钮,分别是绘制直线、绘制矩形、切换成箭头。在这3个按钮的处理函数中,分别将全局变量type的值设置为1、2、0。代码如下:
- void CDrawPictureSampleView::OnMenuitemDrawLine()
- { //绘制直线
- type = 1;
- }
- void CDrawPictureSampleView::OnMenuitemDrawRect()
- { //绘制矩形
- type = 2;
- }
- void CDrawPictureSampleView::OnMenuitemArrow()
- { //箭头
- type = 0;
- }
(2)处理鼠标按下事件和鼠标抬起事件。当鼠标按下时,会记录鼠标按下时的鼠标位置点,并存入全局变量ptBegin中。当鼠标抬起时,会根据当前的操作种类来执行相应的操作。代码如下:
- void CDrawPictureSampleView::OnLButtonDown(UINT
nFlags, CPoint point) -
// 鼠标按下处理函数 - {
- ptBegin.x = point.x;
- ptBegin.y = point.y;
- CView::OnLButtonDown(nFlags, point);
- }
- void CDrawPictureSampleView::OnLButtonUp(UINT
nFlags, CPoint point) - {
// 鼠标抬起处理函数 - CDC* pDC = GetDC();
// 获取设备上下文 - if (type == 1)
- {
- hPen = CreatePen(PS_SOLID,8, RGB(255,0,255));
// 创建画笔 - pDC->SelectObject(hPen);
// 选择画笔 - ptEnd.x = point.x;
- ptEnd.y = point.y;
// 记录点信息 - pDC->MoveTo(ptBegin.x, ptBegin.y);
// 移动到起点 - pDC->LineTo(ptEnd.x, ptEnd.y);
// 绘制直线 - DeleteObject(hPen);
// 删除画笔 - DeleteDC(pDC->m_hDC);
// 删除上下文 - }
- else if (type == 2)
- {
- hPen = CreatePen(PS_SOLID,5,RGB(0,255,0));
// 创建画笔 - hBrush = CreateSolidBrush(RGB(125, 125, 0));
- // 创建画刷
- pDC->SelectObject(hPen);
// 选择画笔 - pDC->SelectObject(hBrush);
// 选择画刷 - ptEnd.x = point.x;
- ptEnd.y = point.y;
- Rectangle(pDC->m_hDC,ptBegin.x, ptBegin.y,
ptEnd.x, ptEnd.y); -
// 绘制矩形 - DeleteObject(hPen);
// 删除画笔 - DeleteObject(hBrush);
// 删除画刷 - DeleteDC(pDC->m_hDC);
// 删除上下文句柄 - }
- CView::OnLButtonUp(nFlags, point);
- }
在上面代码中,OnLButtonDown()函数是鼠标按下事件的处理函数。OnLButtonUp()函数是鼠标抬起事件的处理函数,当当前命令是绘制直线时,会创建宽度为8的粉红色画笔,在画布上绘制从鼠标按下点开始到鼠标抬起点结束的直线。当当前命令是绘制矩形时,会绘制绿色边框,RGB(125,125,0)颜色为填充颜色的矩形,此矩形的对角线点的坐标是鼠标按下点和鼠标抬起点。用户可以根据需要,增加绘制多边形、三角形、折线等其他形式的图形工具。程序的运行效果如图26-2所示。
|
| 图26-2 画图程序运行效果图 |