之前的学习都是对现有MFC程序的了解,对比之前窗口创建过程,在MFC中判断每一步的具体流程,现在有了比较清晰的认识,但具体的细节还要在之后的学习中不断完善。
现在知道了MFC创建后就有许多的代码,这些代码为我们的窗口创建提供了许多便利,我们不需要考虑太多关于窗口框架的问题。那么,我们如何在现有的MFC结构下编写自己的程序呢,接下来我们就学习一下如何在窗口中画线。
我们要实现的效果是,按下鼠标左键并拖动鼠标到另一点,屏幕显示两点之间的线段。
首先在VC6.0菜单中点击查看——建立类向导,即可增加响应函数,需要在CDrawView类下增加响应函数LButtonDown,并选择编辑就跳转到编译环境。
注:当增加一个消息响应函数时,实际上在3个地方进行了修改。第一个是在头文件中加入消息响应函数原型的声明,第二个是在源文件(.cpp)中加入消息响应函数的一个宏,通过这个宏把我们的消息和消息响应函数关联起来了。第三个是在源文件中增加了消息响应函数的定义(实现部分)。
然后在CDrawView类中创建一个私有成员变量,在结构体中进行初始化
private:
CPoint m_ptOrigin;
CDrawView::CDrawView()
{
// TODO: add construction code here
m_ptOrigin = 0;
}
在OnLButtonDown中保存当前鼠标左键按下的点
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_ptOrigin = point;
CView::OnLButtonDown(nFlags, point);
}
接下来要确定线段的终点,需要另一个按键松开的响应,同前一个步骤类似
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CView::OnLButtonUp(nFlags, point);
}
接下来就利用4种方法创建了画线命令,同时介绍了线型和颜色的选择。
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/****************wjl***********************
方法一:
这个是用平台SDK 来完成的划线功能
用的API函数(全局函数)来完成的
*********************************
HDC hdc;
hdc = ::GetDC(m_hWnd);
MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL);
LineTo(hdc, point.x, point.y);
::ReleaseDC(m_hWnd, hdc);
******************wjl*********************/
/****************wjl***********************
方法二:
因为MFC具有高度的封装性,MFC中所有和窗口
相关的操作都封装到CWnd类中了,
所有和作图相关的操作都封装到CDC类中了。
接下来利用MFC里面的CDC类来进行划线的操作
CDC *pDC=GetDC(); // 这里的GetDC是CWnd类中的函数
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);
***************wjl************************/
/****************wjl***********************
方法三:
介绍另外一个类 CClientDC,它在创建对象的时候
自动调用了GetDC,并且在结束的时候自动释放DC
// CClientDC dc(this); // 这个是和View窗口相关的操作,
CClientDC dc(GetParent()); //这个时候框架窗口相关的操作
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
***************wjl************************/
/****************wjl***********************
方法四:
另外一个类CWindowDC,和CClientDC类似,他们都自动
调用GetDC,并且在结束的时候自动释放DC。不同的是
CWindowDC可以访问整个窗口区域,包括客户区和非客户区
//CWindowDC dc(this);
//CWindowDC dc(GetParent());
CWindowDC dc(GetDesktopWindow()); // 划线到整个屏幕
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
***************wjl************************/
/****************wjl***********************
<*如何改变线宽和颜色*>
1. 首先要创建画笔,利用MFC提供的CPen类
CPen pen(参数一,参数二,参数三);
第一个参数指画笔的类型 实线PS_SOLID、虚线PS_DASH、点线PS_DOT
第二个参数指的是画笔的宽度
第三个参数是笔的颜色RGB(0-255)
2. 当你创建完画笔之后并不会生效,你需要将这个笔
选择到设备描述表DC当中,这样当你调用DC的时候才能
使用你定义好的画笔。
利用SelectObject()把当前的画笔选择到DC中,同时保存先前的
画笔(SelectObject的返回值就是先前的画笔类型)
3.注意:虚线PS_DASH和点线PS_DOT 只有在线宽小于等于1的时候才会效果
CPen pen(PS_DOT,1,RGB(0,0,255));
CClientDC dc(this);
CPen *pOldPen = dc.SelectObject(&pen); // 这里保存了先前画笔类型的指针
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen); // 将之前的画笔类型还原
***************wjl************************/
CView::OnLButtonUp(nFlags, point);
}