MFC开发——点击页面生成图标功能

4 篇文章 1 订阅

由于一直在弄Qt,MFC基本没接触过,加上上课不认真听讲,没想到老师布置的一项简单作业就使我焦头烂额,最后通过各种百度,查MSDN,终于做完了作业,但觉得里面很多内容百度上都没有,很多都是自己一遍一遍尝试出来的,所以就写了博文,以便大家分享与指点

题目:鼠标处点击生成一张图标,图标中点为鼠标点击位置

第一步:导入bitmap图片
1、新建一个MFC单文档工程
2、导入bmp图片,vc6.0只支持bmp格式的图片,而且必须在24位及以下才显示得出来,这里推荐大家用电脑自带画图工具,导出时选择如下:在这里插入图片描述
3、将导出的图片放到项目文件夹中,在vc6.0中选择insert>>资源>>bitmap>>引入,选择所有文件类型,导入刚才的图片,id名默认为IDB_BITMAP1
在这里插入图片描述
第二步:实现鼠标点击响应函数
在这里插入图片描述
第三步:代码实现
在view类头文件中添加bitmap成员变量,防止局部变量被释放

private:
	CBitmap bitmap;

在鼠标事件中添加代码:


void CDrawIconView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);//实例绘画工具
	bitmap.LoadBitmap(IDB_BITMAP1);//加载图片
	CBrush brush(&bitmap);//创建画刷
	CPoint point1(point);
	CPoint point2(point.x+80,point.y+80);
	CRect xRect(point1,point2);//定义要画的矩形,矩形左上顶点为point1,右下顶点为point2
	dc.FillRect(&xRect,&brush);//用画刷出一个矩形
	CView::OnLButtonDown(nFlags, point);
}

在这里插入图片描述
发现绘制几次之后并不是我们想要的效果,没有实例化出一个一个图标,反而图标是连在一起的,而且图标大小也不对
解决方法
在构造函数加上


CDrawIconView::CDrawIconView()
{
	// TODO: add construction code here
	bitmap.LoadBitmap(IDB_BITMAP1);//加载图片
}

通过SetBrushOrg函数我们可以改变笔刷起点位置,每次鼠标事件均改变一次,则图案不连在一起,默认参数为(0,0),改为变量point,鼠标事件代码改为:


void CDrawIconView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);//实例绘画工具
	CBrush brush(&bitmap);//创建画刷
	dc.SetBrushOrg(point);//改变笔刷起点

	CPoint point2(point.x+80,point.y+80);
	CRect xRect(point,point2);//定义要画的矩形,矩形左上顶点为point1,右下顶点为point2
	dc.FillRect(&xRect,&brush);//用画刷出一个矩形
	CView::OnLButtonDown(nFlags, point);
}

效果为:
在这里插入图片描述
图标已经不连在一起了,但是大小不对,而且每次实例化的位置也不对,找到图标,点击属性,我们可以看到,图标的宽与高在这里插入图片描述
则我们通过代码 dc.SetBrushOrg(point.x-88,point.y-84);可以实现每次都在鼠标点击处实例化一个图标,并且图标不连在一起,
然后通过创建两个点作为矩形的左上角与右下角点参数,我们可以实现鼠标点击处生成图标,并且图标大小与原图标一致

	CPoint point1(point.x-88,point.y-84);
	CPoint point2(point.x+88,point.y+84);

所以鼠标事件代码如下:


void CDrawIconView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);//实例绘画工具
	CBrush brush(&bitmap);//创建画刷
	dc.SetBrushOrg(point.x-88,point.y-84);//改变笔刷起点
	CPoint point1(point.x-88,point.y-84);
	CPoint point2(point.x+88,point.y+84);
	CRect xRect(point1,point2);//定义要画的矩形,矩形左上顶点为point1,右下顶点为point2
	dc.FillRect(&xRect,&brush);//用画刷出一个矩形
	CView::OnLButtonDown(nFlags, point);
}

我们发现效果是这样的,明显已经达到了要求
在这里插入图片描述
补充:
虽然效果实现了,但并不是最好的,在上面我们是通过数字使得图标有效果,但是如果换了个图标,那么是不是又要改变数字。如果能够访问到图标的宽与高,就可以解决这个问题
代码如下:


void CDrawIconView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);//实例绘画工具
	BITMAP bmp;//通过该结构体可以访问图片宽高
	bitmap.GetBitmap(&bmp);
	CBrush brush(&bitmap);//创建画刷
	dc.SetBrushOrg(point.x-bmp.bmWidth/2,point.y-bmp.bmHeight/2);//改变笔刷起点
	CPoint point1(point.x-bmp.bmWidth/2,point.y-bmp.bmHeight/2);
	CPoint point2(point.x+bmp.bmWidth/2,point.y+bmp.bmHeight/2);
	CRect xRect(point1,point2);//定义要画的矩形,矩形左上顶点为point1,右下顶点为point2
	dc.FillRect(&xRect,&brush);//用画刷出一个矩形
	CView::OnLButtonDown(nFlags, point);
}

效果依然不变
在这里插入图片描述
虽然只是一个很简单的绘图事件的学习,但如果一个人做的话,在过程中寻找各种方法也可以学到许多内容

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值