VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
dc.LineTo(point); m_ptEnd=point; } CView::OnMouseMove(nFlags, point); }
代码dc.SetROP2(R2_NOT);是一条很重要的语句,该句代码设置逆转当前屏幕颜色的绘图模式。这种模式下,在屏幕上首次画出的线是可见的,但在同一位置再画一遍时,线就不见了。这样可以方便的实现不断画线、擦线的效果。
请读者运行光盘中的例子体会与前两个画线程序的不同之处,在结合代码,认真的理解本例画线的过程。
5.5.2 画刷的使用
本节将通过两个简单的小程序来讲解画刷的具体使用步骤。假如我们要在屏幕上的一段区域内用我们自定义的画刷将其填充,那么首先想到的是,如何来确定这块区域,学过几何的读者都知道,两点可以确定一条直线,那么两点也可以确定一块矩形区域。 5.5.2.1 带颜色的画刷的使用
本例所要实现的功能就是,在窗口上,以鼠标按下的点为起点,以鼠标抬起的点为终点,在两点组成的矩形范围内用我们自定义的画刷给其填充颜色。完整例程请参见光盘中的例子代码EX05-03。
? 第一步:新建一个MFC应用程序工程。
1) 启动Visual C++,选择File|New,弹出新建对话框。
2) 在新建对话框左边选择MFC AppWizard(exe),右边工程名为EX05_03或用户
自定义工程名,文件存放位置用户自定义。
3) 单击OK按钮,弹出MFC AppWizard对话框,选择新建Single document单文
档应用程序,其他一切采用默认设置。
? 第二步:在工程的CEX05_03View类中添加成员变量CPoint m_ptOrigin,用于记录
用户鼠标左键按下时的点坐标。
? 第三步:打开ClassWizard,在工程的CEX05_03View类中添加鼠标左键按下和鼠标
左键抬起的消息响应,分别为WM_LBUTTONDOWN和WM_LBUTTONUP。
? 第四步:完成WM_LBUTTONDOWN消息执行代码,当鼠标左键按下时,用户只需要一
个操作,就是保存按下的点的坐标。
1) 在工作台CEX05_03View类下面找到OnLButtonDown函数,双击它,在左边的
代码编辑区中显示该函数体。 2) 在该函数中填写如下代码:
void CEX05_03View::OnLButtonDown(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default m_ptOrigin =point;
CView::OnLButtonDown(nFlags, point); }
其中point是调用OnLButtonDown函数时,系统自动给我们传入的鼠标按下的点的坐标。
? 第五步:完成WM_LBUTTONUP消息执行代码,当鼠标抬起时定义画刷,并用画刷填
VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
充鼠标按下和抬起之间的矩形区域,填充结束后,将原来的画刷选回。
1) 在工作台CEX05_03View类下面找到OnLButtonUp函数,双击它,在左边的代
码编辑区中显示该函数体。 2) 创建蓝色的画刷。
CBrush br(RGB(0,0,255));
3) 获取一个设备描述表。
CClientDC dc(this);
4) 定义一个指向画刷对象的指针变量,将新创建的画刷选入设备描述表,并将返
回的旧画刷保存在我们定义的指向画刷对象的指针变量中。
CBrush *pOldBr=dc.SelectObject(&br);
5) 在获取的设备描述表上,从原来保存的鼠标按下的点的位置到鼠标抬起的点的
位置内画一矩形,由于我们定义的带颜色的画刷已经选给设备描述表了,因此,设备描述表就用我们定义的带颜色的画刷来填充这块区域。
dc.Rectangle(CRect(m_ ptOrigin,point));
或者 dc.Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);
6) 绘图工作结束,将旧的画刷选回设备描述表。
dc.SelectObject(pOldBr);
OnLButtonUp函数中的完整代码如下: void CEX05_03View::OnLButtonUp(UINT nFlags, CPoint point)
{ // TODO: Add your message handler code here and/or call default CBrush br(RGB(0,0,255)); CClientDC dc(this); CBrush *pOldBr=dc.SelectObject(&br); dc.Rectangle(CRect(m_ptOrigin,point)); dc.SelectObject(pOldBr); CView::OnLButtonUp(nFlags, point);
}
代码中用到的Rectangle函数是设备描述表类CClient由基类CDC继承过来的成员函数,该函数实现的功能就是在用户指定的两点之间画一矩形,原形如下:
BOOL Rectangle( int x1, int y1, int x2, int y2 ); BOOL Rectangle( LPCRECT lpRect );
第一种参数形式是分别由两个点的x和y坐标来确定。
第二种参数形式是由一个CRect类的对象或一个指向RECT结构的指针来确定的。其中CRect类是由Windows RECT结构派生来的,因此,它继承了公用整数型数据类型。该类的构造函数如下所示:
CRect( );
CRect( int l, int t, int r, int b ); CRect( const RECT& srcRect ); CRect( LPCRECT lpSrcRect ); CRect( POINT point, SIZE size );
CRect( POINT topLeft, POINT bottomRight );
和CBrush有点类似的是,利用该类的构造函数就可以确定一块矩形区域。本例中用的
VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
是最后一种构造函数,通过两个点来确定矩形区域。
在先前的5.4.1节中讲自定义画刷的时候,我们给出了几个例子,如创建剖面线刷子、创建空刷子,读者不妨,将前面的代码带入本例子中体验一下。
5.5.2.2 带位图的画刷的使用
本例所要实现的功能就是,在窗口上,以鼠标按下的点为起点,以鼠标抬起的点为终点,在两点组成的矩形范围内用我们自定义的画刷给其填充位图。要定义一个位图画刷,那么至少应该在工程中添加一个位图资源。完整例程请参见光盘中的例子代码EX05-04。
? 第一步:新建一个MFC应用程序工程,工程名为EX05_04或用户自定义。 ? 第二步:给新建的工程添加一幅位图资源 IDB_BITMAP1。
1) 单击工作台的
ResourceView标签,使工作台窗口显示的资源面板页面。
2) 展开最顶层的EX05_04 resources结点,我们发现没有Bitmap这个资源。鼠
标右击结点EX05_04 resources,在弹出的快捷菜单中选择Insert。如图5-01所示。
3) 选择Insert之后会弹出插入资源对话框。如图5-02所示,在该对话框中有许
多资源允许用户添加,如位图资源(Bitmap)、光标资源(Cursor)、对话框资源(Dialog)、菜单资源(Menu)、字符串资源(String Table)等等。这些资源可以是用户自己定义制作的,也可以是机器中已经存在的。单击对话框上的New按钮,表示我们要自己制作一个新资源;单击Import按钮表示往工程中导入一个机器上已经存在的资源;按钮Custom允许用户自己定义一个加入到工程中的资源的ID号,如果用户不指定,系统会为我们新添加的资源自动生成一个ID号。本例中我们打算自己绘制一个位图,因此,选中Bitmap一项,然后单击对话框右边的New按钮。
图5-01 选择插入资源
VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
图5-02 插入资源对话框
4) 选择New以后,在工作台的资源面板中就多了一个位图资源,如图5-03所示,
并且系统自动为我们刚刚添加的位图资源命名了一个ID号为IDB_BITMAP1。 5) 同时,在工作台右边的代码编辑区中出现了一个位图编辑器,如图5-04所示,
在那里,我们可以利用编辑器右边的调色板和工具来编辑位图资源,还可以通过拉伸位图编辑器中网格周围的蓝色方点来调整位图的大小。例如,本例中画了一幅大小为15×15的红色五角星位图。
图5-03 资源面板中新添了位图资源
VC++培训教程草稿(2000年撰写) 张孝祥、袁龙友著 网址:http://www.it315.org
? ? ?
图5-04 在资源编辑器中编辑位图资源
第三步:在工程的CEX05_04View类中添加成员变量CPoint m_ptOrigin,用于记录用户鼠标左键按下时的点坐标。
第四步:打开ClassWizard,在工程的CEX05_04View类中添加鼠标左键按下和鼠标左键抬起的消息响应,分别为WM_LBUTTONDOWN和WM_LBUTTONUP。
第五步:完成WM_LBUTTONDOWN消息执行代码,当鼠标左键按下时,保存按下的点的坐标。
1) 在工作台CEX05_04View类下面找到OnLButtonDown函数,双击它,在左边的
代码编辑区中显示该函数体。 2) 在该函数中填写如下代码:
void CEX05_04View::OnLButtonDown(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default m_ptOrigin =point;
CView::OnLButtonDown(nFlags, point); }
其中point是调用OnLButtonDown函数时,系统自动给我们传入的鼠标按下的点的坐标。
第六步:完成WM_LBUTTONUP消息执行代码,当鼠标抬起时定义画刷,并用画刷填充鼠标按下和抬起之间的矩形区域,填充结束后,将原来的画刷选回。
1) 在工作台CEX05_04View类下面找到OnLButtonUp函数,双击它,在左边的代
码编辑区中显示该函数体。 2) 定义一个CBitmap类的对象,并加载上一步骤中添加的资源位图。利用该位图
创建一个位图画刷。
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1); CBrush br(&bmp);
?
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第5章(4)在线全文阅读。
相关推荐: