MFC之画刷填充矩形函数、马赫带、加载图片资源

1.笔记

1.1画刷填充矩形函数

函数原型:

void CDC::FillRect(LPCRECT lpRect,CBrush* pBrush);

该函数相比FillSolidRect函数的优势在于可以选择颜色、阴影、图案3种方式填充矩形。

使用该函数的好处是不需要将画刷选入设备上下文,使用完后不需要恢复设备上下文。

2.使用练习

2.1将客户区沿宽度方向十二等分,分别使用12种灰度予以填充。

该图形称为马赫带(Mach Band),也称边缘对比效应,当观察两块亮度不同的区域时,边界处对比亮度加强,使轮廓表现得特别明显。马赫带现象突出了边界效应,破坏了颜色的连续过渡效果。

这里用到了矩形定义的另一种方法,确定上下左右边界法,在有参考矩形的时候比较好用。

编程实现:

void CExample1View::OnDraw(CDC* pDC)
{
	CExample1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CRect rect;
	GetClientRect(rect);

	int nWidth = rect.Width() / 12;
	BYTE clr[12];
	clr[0] = 0; clr[1] = 4; clr[2] = 28; clr[3] = 51;
	clr[4] = 77; clr[5] = 102; clr[6] = 128; clr[7] = 152;
	clr[8] = 178; clr[9] = 204; clr[10] = 228; clr[11] = 255;
	CRect machRect[12];
	CBrush brush[12];

	for (int i = 0; i < 12; ++i) {
		machRect[i].left = rect.left + i * nWidth;
		machRect[i].top = rect.top;
		machRect[i].right = rect.left + (i + 1) * nWidth;
		machRect[i].bottom = rect.bottom;

		brush[i].CreateSolidBrush(RGB(clr[i], clr[i], clr[i]));

		pDC->FillRect(machRect[i], &brush[i]);
	}
}

运行效果:客户区出现了大范围马赫带,表现为矩形的左右边界有凸起感,矩形似乎在左右边界之间凹陷。

 2.2将窗口客户区分为上下两部分,上半部分再划分为左右两个部分,上左部分用RGB(128,128,128)的实体画刷填充,上右部分用绿色的斜45°线、斜135°线交叉的阴影画刷填充,下半部分用图片画刷填充。

注意矩形的下边界属性bottom是指纵坐标数值大的那端下边界属性top是指纵坐标数值小的那端左边界属性left是指横坐标数值小的那端右边界属性right是指横坐标数值大的那端

MFC中只能导入位图资源,如果图片不是bmp格式,需要先转换为bmp格式,方法为:右键图片,打开方式->画图,进入软件后选择另存为bmp格式即可。

在VS2019中,切换到资源视图,点击工程,右键,添加->资源->bitmap,即可导入位图,在资源视图中可以给位图自定义ID,或者直接使用自动生成的位图ID。打开资源视图的方法:视图->其他窗口->资源视图,也可以直接在搜索框输入资源视图。

void CExample1View::OnDraw(CDC* pDC)
{
	CExample1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	CRect rect;
	GetClientRect(rect);
	pDC->SetMapMode(MM_ANISOTROPIC);
	pDC->SetWindowExt(rect.Width(), rect.Height());
	pDC->SetViewportExt(rect.Width(), -rect.Height());
	pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
	rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);

	CRect tlRect(CPoint(rect.left, 0), CPoint(0, rect.Height() / 2));//左上
	CRect trRect(CPoint(0, 0), CPoint(rect.right, rect.Height() / 2));//右上
	CRect bRect(CPoint(rect.left, rect.top), CPoint(rect.right, 0));//下
	CBrush tlBrush, trBrush, bBrush;
	tlBrush.CreateSolidBrush(RGB(128, 128, 128));
	trBrush.CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 0));
	CBitmap bmp;
	bmp.LoadBitmapW(IDB_BITMAP1);
	bBrush.CreatePatternBrush(&bmp);
	
	pDC->FillRect(tlRect, &tlBrush);
	pDC->FillRect(trRect, &trBrush);
	pDC->FillRect(bRect, &bBrush);
}

执行效果:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赴星辰大海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值