📄 04.4 绘制连续线条.txt
字号:
4.4 绘制连续线条
Windows系统为我们提供了一个画图应用程序,在该程序中,利用画笔可以绘制连续的线条,下面我们就在 Draw程序中实现这样的功能。
为了绘制连续的线条,首先需要得到线条的起点,这在前面的内容已经实现了。然后需要捕获鼠标移动过程中的每一个点,这可以通过捕获鼠标移动消息 C WM_MOUSEMOVE)来实现。在此消息响应函数中,在依次捕获到的各个点之间绘制一条条非常短的线段,从而就可以绘制出一条连续的线条。
遵照这一思路,我们开始增加 Draw程序的功能。首先为视类增加鼠标移动消息 CWM_MOUSEMOVE)的响应函数(默认名称为 OnMouseMove)。这样,只要鼠标在应用程序窗口中移动时,都会进入到这个消息响应函数中。但这并不是我们所期望的,我们希望在鼠标左键按下去之后才开始绘图。因此,我们需要有一个变量来表示鼠标左键是否按下去了这一状态,然后在鼠标移动消息响应函数中对这一变量进行判断。当此变量为真,即鼠标左键已经按下去时,我们就开始绘图。于是,为视类添加一个 BOOL型的私有成员变量 m_bDraw,当鼠标左键按下去时,此变量为真:当鼠标左键弹起来时,此变量为假,这时,我们就不再绘制线条了。该变量的在视类头文件中的定义代码如下所示。
private:
BOOL ffi_bDraw;
接下来在视类的构造函数中,将此变量初始化为 FALSE。
ffi_bDraw = FALSE;
当鼠标左键技下去时,即在视类的 OnLButtonDown函数中将此变量设置为真。
ffi_bDraw = TRUE;
当鼠标左键弹起来时,即在视类的 OnLButtonUp函数中将此变量设置为假。
ffi_bDraw = FALSE;
提酥示:11<读者轩可以叫将 OωButton
固 i侃此 盹饥ω阳∞叫
然后在 On曲MOuseMoωve函数中首先对 m
1由岛∞臼 bDraw变量进行判断,如果其值为真,说明鼠标左键已经按下去了,这时就可以开始进行画线操作。还有一点需要注意,因为每给制一条线段后,下次应该从这条线段的终点开始继续绘制。因此,绘制完当前线段后,应该修
.
'4 <411 <411 I 131
第4
改线段的起点,将当前线段的终点作为下一条线段的起点,具体代码如例 4-23所示。例 4-23
void CDrawView : : OnMouseMove(U工NT nFlags , CPoint point) { CClientDC dc(this); if(m_bDraw TRUE)
dc . MoveTo(m-ptOrigin) ;
dc . LineTo(point);
//修改钱段的起点
m-ptOrigin = point;
CView: :OnMouseMove(nFlags , point);
Build井运行 Draw程序,按下鼠标左键并在程序窗口中拖动鼠标,可以发现就像 Windows提供的画图程序中的画笔那样能够绘制连续的线条了,结果如图 4.27所示。.l!IIi础。....."泪'
…
十
黯. r r:.
图 4 .27在窗口中绘制连续线条
如果希望给线条增加颜色的话,就需要使用前面介绍的画笔类 (CPen类〉来实现。如例 4-24所示代码创建了一个红色的画笔,于是绘出的线条就是红色的。
.lJ 4-24
void CDrawview: : OnMouseMove(U工NT nFlags , CPoint point) { CClientDC dc(this); //创建一个红色的、宽度为 1的实线画笔 CPen pen(PS_SOLID , 1 , RGB(255 , O, O)); //把创建的画笔选入设备描述表 CPen *pOldPen = dc.SelectObject(&pen); if(m_bDraw TRUE)
dc.MoveTo(m-ptOrigin) ;
dc . LineTo(point) ;
//修改线段的起点食 m-ptOr工g工n = point;
1/恢复设备描述表
dc . SelectObject(pOldPen) ; CView : :OnMouseMove(nFlags , point) ;
读者可以 Build井运行 Draw程序,看看效果。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -