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);
}
执行效果: