绘制像素点函数
使用CDC类时需要先调用GetDC函数
第二种速度比第一种快的多通常使用第二种像素绘图函数
第一种COLOREF类型函数绘制图形慢的原因
绘制像素点测试代码:
CPoint P0(100, 100);
CPoint P1(P0.x + 100, P0.y);
pDC->SetPixel(P0, RGB(255, 0, 0));//设置p0点的颜色
COLORREF clr = pDC->GetPixel(P0);//获取p0点的颜色
pDC->SetPixel(P1, clr);//设置p1点的颜色
2.绘制矩形
1.定义画刷
2.将定义好的画刷选入设备上下文才能使用
原题:
绘制矩形并填充代码:
rect.DeflateRect(100, 50);//上下边界收缩100像素,左右边界收缩50像素
CRect rect(100, 100, 300, 300);
CPen NewPen, * OldPen;
NewPen.CreatePen(0, 3, RGB(0, 255, 0));//创建画刷
OldPen = pDC->SelectObject(&NewPen);//将画刷选入设备上下文
CBrush NewBrush, * OldBrush;
NewBrush.CreateSolidBrush(RGB(0, 0, 255));//创建实体画刷
OldBrush = pDC->SelectObject(&NewBrush);
pDC->Rectangle(rect);
pDC->SelectObject(OldPen);//将画刷和画笔回复原设备上下文
pDC->SelectObject(OldBrush);
总结:矩形边界由画笔绘制,可以通过设置画笔的属性改变边界的一些属性;
矩形的内部是由画刷绘制,可以通过设置画刷的属性改变矩形内部的一些属性;
3.绘制椭圆函数
自定义坐标系:
如果采用如下的这种画法,最终只能画出一个矩形,因为这些图形的内部默认的都是填充白色,所以最外边的矩形会把里边的内容覆盖掉;
这样就需要选入库对象函数的作用,要使用透明画刷,这样里边的内容自然就能显现出来;
例题
例题代码:
//绘制嵌套的矩形,椭圆和圆
CRect rect;
GetClientRect(&rect);
rect.DeflateRect(100, 100);
CBrush* pOldBrush = (CBrush*)pDC->SelectStockObject(5);//使用库画刷
int r = rect.Height() / 2;
CRect rect1(CPoint(-r, -r), CPoint(r, r));
pDC->Ellipse(rect1);
pDC->Ellipse(rect);
pDC->Rectangle(rect);
4.绘制椭圆弧函数
参数分别为:矩形左上坐标,矩形右下坐标,起点坐标,终点坐标设置图线方向的函数,方向为顺时针
5.绘制扇形函数
原理同绘制椭圆弧函数相同
6.绘制多边形函数
//绘制多边形(菱形),并且中心区域使用阴影填充
CRect rect;
GetClientRect(&rect);
CPen NewPen, * OldPen;
NewPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
OldPen = pDC->SelectObject(&NewPen);
CBrush NewBrush, * OldBrush;
NewBrush.CreateHatchBrush(HS_BDIAGONAL, 0x00);//创建阴影画刷,并选择一种阴影模式
OldBrush = pDC->SelectObject(&NewBrush);
CPoint p[4];//x是横着的,Y是竖着的
p[3].x = rect.left, p[3].y = rect.top + rect.Height() / 2;//注意这个是需要按照一定顺序的,因为多边形是顺序连线和顺序填充的
p[2].x = rect.left + rect.Width() / 2, p[2].y = rect.bottom;
p[1].x = rect.right, p[1].y = rect.top + rect.Height() / 2;
p[0].x = rect.left + rect.Width() / 2, p[0].y = rect.top;
pDC->Polygon(p, 4);//绘制多边形函数
pDC->SelectObject(OldPen);
pDC->SelectObject(OldBrush);
6.颜色填充矩形函数
用黑色的背景色填充客户区的颜色;先设置背景色,再获取背景色用于填充客户的颜色
7.画刷填充矩形函数
填充效果:
代码实现:
CRect rect;
GetClientRect(&rect);
int nWidth = rect.Width() / 12;//将客户区等分成12份;
BYTE clr[12];//注意:RGB的参数类型是BYTE型的不是int型,由于12个格子,所以对应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];//表示12个小矩形
CBrush Brush[12];//用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]);//对12个矩形分别进行填充,两个参数分别对应矩形区域和画刷指针
}
路径层函数
可以使用路径层函数进行多边形的绘制
说一下我对路径层函数的理解:就是可以先划线,然后画好一个封闭图形之后对路径层所覆盖的面积进行填充;
例题:2.1给定4个顶点P0(200,300)、P1(700,500)、P2(1200,300)、P3(700,100),使用直线函数分别绘制三角形P0P1P2、P0P2P3,三角形内部使用GRAY_BRUSH库画刷填充,在设备坐标系中使用路径层函数编程,实现通过绘制两个三角形来绘制一个四边形。
编程实现:
代码:
//路径层填充函数
CPoint p0(200, 300), p1(700, 500), p2(1200, 300), p3(700, 100);
CBrush* p0ldBrush = (CBrush*)pDC->SelectStockObject(GRAY_BRUSH);
pDC->BeginPath();//打开路径层
pDC->MoveTo(p0);
pDC->LineTo(p1);
pDC->LineTo(p2);
pDC->LineTo(p0);
pDC->EndPath();//关闭路径层
pDC->FillPath();
pDC->BeginPath();//打开路径层
pDC->MoveTo(p0);
pDC->LineTo(p2);
pDC->LineTo(p3);
pDC->LineTo(p0);
pDC->EndPath();//关闭路径层
pDC->FillPath();//对路径层进行填充
9.位图
位图操作函数
内存设备上下文,是一块代表显示器的内存块,用来准备图像
函数的作用是将dib转化为btp
10.交互式绘图技术
这里仅介绍回显+引力域+橡皮筋技术
10.1回显
2.引力域
引力域就是你的鼠标在某一个区域的时候即可出发对某一个点的操作
3.橡皮筋技术使得线条的变化看起来效果平滑,使用双缓冲机制实现;
在View类里边定义函数声明变量然后添加消息处理函数onbuttonup,onbuttondown用来改变boDown的状态,
双缓冲代码:
void CMouseDrawLineView::doubleBuffer(CDC* pDC)
{
CRect rect;
GetClientRect(&rect);
CDC memDC;//声明一个设备上下文对象
memDC.CreateCompatibleDC(pDC);//创建于pDC兼容的内存设备上下文指针
CBitmap NewBitmap, * OldBitmap;
NewBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
OldBitmap = memDC.SelectObject(&NewBitmap);
memDC.FillSolidRect(rect, pDC->GetBkColor());
DrawObject(&memDC);//绘制三角形函数
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(OldBitmap);
NewBitmap.DeleteObject();
memDC.DeleteDC();
}
绘制三角形代码:
void CMouseDrawLineView::DrawObject(CDC* pDC)
{
pDC->SelectStockObject(GRAY_BRUSH);//灰色画刷填充代表顶点引力域
CPen NewPen, * OldPen;
NewPen.CreatePen(PS_SOLID,3,RGB(0, 0, 255));
pDC->SelectObject(&NewPen);
//的正方形区域
for (int i = 0; i < 3; i++) {
CString str;
str.Format(CString("x=%d,y=%d"), p[i].x, p[i].y);
pDC->SetTextColor(RGB(255, 0, 0));
pDC->TextOutW(p[i].x, p[i].y, str);
pDC->Rectangle(p[i].x - 5, p[i].y - 5, p[i].x + 5, p[i].y + 5);
if (0 == i) {
pDC->MoveTo(p[i]);
}
else {
pDC->LineTo(p[i]);
}
}
pDC->LineTo(p[0]);
}
在OnDraw()函数中添加双缓冲机制,在双缓冲机制中实现绘制三角形的函数
doubleBuffer(pDC);