vc学习(一)单文档画圆,鼠标点击变色

本人最近心血来潮,正在看《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更新一个矩形区域。

以上内容多为本人自行理解,如哪有错误欢迎大家指出,如初学者哪有不懂也可以提出来,我能解答的一定认真解答。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值