本人最近心血来潮,正在看《vc++技术内幕》这本书,以下内容可以说是一个《vc++技术内幕》这本书的读书笔记。
我用的是vs2010编译器,根据向导创建一个简单的单文档项目。
简单说一下创建过程:
文件->新建->项目,选MFC中的MFC应用程序,下面的路径,名称填好,点击确定会弹出MFC应用程序向导。
点击下一步,应用程序类型选单文档,项目类型选MFC标准,一直默认下一步到用户界面功能这里,命令栏使用经典菜单,点击完成,好了,一个简单的单文档项目建立成功,编译运行一下。
接下来画圆
以类视图查看项目,在view类(如果你创建的项目名为test,那么view类就是Ctestview)中找到OnDraw。为什么是view类呢?因为view类是此应用程序的核心,与该应用程序的视窗相关联,应用程序的所有动作都会在该视窗中反映出来。
OnDraw函数是CView类中的一个虚成员函数,每次当视窗需要被重绘时,应用程序框架都要调用OnDraw函数。调用Invalidate后会触发对OnDraw函数的调用,我们这里就是用到了这个来使鼠标点击圆变色。
在OnDraw函数中原有的代码我们这里用不到可以删掉。(GetDocument()的返回值指向的是当前文档的指针)
在View类中添加两个变量
int m_nColor;
CRect m_rectEllipse;
在构造函数里初始化
CtestView::CtestView()
: m_rectEllipse(20,20,120,120)
, m_nColor(GRAY_BRUSH)
{
// TODO: 在此处添加构造代码
}
在OnDraw函数中添加以下代码:
void CtestView::OnDraw(CDC* pDC)
{
pDC->SelectStockObject(m_nColor);//灰色画刷
pDC->Ellipse(m_rectEllipse);//画一椭圆,左上角坐标(0,20),右下角坐标(100,120)
}
pDC是一CDC指针,在MFC库中,设备环境是由C++的CDC类对象来表示的,该对象被作为参数传给OnDraw函数。
SelectStockObject方法选用系统设备不需要释放,也可以自己构造颜色画刷,调用SelectObject用完之后再释放,这里暂时不详说,就用SelectStockObject选用系统画刷。
Ellipse函数是用来画一个椭圆,这里传的是一个CRect参数进去,CRect的四个参数分别是left,top,right,和bottom
编译运行一下,一个灰色的圆出现了。
接下来实现鼠标点击变色
要响应鼠标点击消息,对着早类试图CtestView类点击右键选择类向导,消息里面找到WM_LBUTTONDOWN,添加处理程序,编辑代码。
void CtestView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRgn rgn;
rgn.CreateEllipticRgnIndirect(m_rectEllipse);
if (rgn.PtInRegion(point)) {
if (m_nColor == GRAY_BRUSH) {
m_nColor=BLACK_BRUSH;
} else {
m_nColor=GRAY_BRUSH;
}
InvalidateRect(m_rectEllipse);
}
CView::OnLButtonDown(nFlags, point);
}
编译运行,这一次的目地就达到了。
(点击鼠标左键过快可能会被系统解释为双击左键,而不会触发WM_LBUTTONDOWN消息。)
CRgn对象能保存一个椭圆区域,调用CreateEllipticRgnIndirect方法,参数是一个CRect矩形区域。rgn,PtInRegion检查点是否在矩形区域内,InvalidateRect更新一个矩形区域。
以上内容多为本人自行理解,如哪有错误欢迎大家指出,如初学者哪有不懂也可以提出来,我能解答的一定认真解答。