持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天
推荐
编译器VS
【ClassView】标签页:☆ CTestApp是应用的主函数类,代表了应用程序的主线程。 ☆ MFC中的数据是存储在CTestDoc类中,而结果则是显示在CTestView类中,即显示在客户区中。MFC中的文档/视图结构用来将程序的数据本身和数据显示相互隔离,文件读写的操作在文档类的Serialize()函数中进行,图形显示的操作在视图类的OnDraw()函数中进行。 ☆CMainFrame类由MainFrame.h和MainFrame.cpp文件组成,CTestApp类由Test.h和Test.cpp文件组成,框架类,CTestDoc类由TestDoc.h和TestDoc.cpp文件组成,CTestView类由TestView.h和TestView.cpp文件组成。
MFC中,CDC类是定义设备上下文对象的基类,封装了绘图所需的所有函数。当输出文字或图形时,就需要调用CDC类的成员函数,这些成员函数具备绘制和打印图形的功能。 本节讲解的例程全部在CTestView类的成员函数OnDraw()中实现。
简单数据类型
CPoint类:存放点坐标(x,y)。
CRect类:存放矩形左上角顶点和右下角顶点的坐标(top,left,right,bottom)
CSize类:存放矩形的宽度和高度的坐标(cx,cy),其中cx为矩形的宽度,cy为矩形的高度。
绘图工具类
CGdiObject类:GDI绘图工具的基类,一般不能直接使用。
CBitmap:封装了一个GDI位图,提供位图操作的接口。
CBrush类:封装了GDI画刷,可以选作设备上下文的当前画刷。画刷用于填充图形内部。
CFont:封装了GDI字体,可以选作设备上下文中的当前字体。
CPallette:封装了GDI调色板,提供应用程序和显示器之间的颜色接口。
CPen:封装了GDI画笔,可以选作设备上下文的当前画笔。画笔用于绘制图形边界线。
绘制像素点函数
COLORREF SetPixel(int x,int y,COLORREF crColor );BOOL SetPixelV(int x, int y, COLORREF crColor);
参数x,y是像素点的逻辑坐标。COLORREF是32位颜色类型,crColor是像素点的颜色值,COLORREF型变量可以利用RGB(bRed,bGreen,bBlue)来指定相应的颜色值,每种颜色用一个字节表示,可以被设定为0~255之间的任意值,0代表无色,255代表全色。SetPixelV()函数不需要返回所绘制像素点的RGB值,执行速度比SetPixel()快得多。在真实感图形学中,物体表面模型使用像素点模拟光照颜色。提高像素点的绘制速度可以有效提高图形生成速度。推荐使用SetPixelV()函数绘制像素点。
获取像素点颜色函数
COLORREF GetPixel(int x,int y)const;
绘制一个红色的像素点
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
COLORREF clr;
int x = 20, y = 20;
pDC->SetPixel(x, y, RGB(255, 0, 0));
clr = pDC->GetPixel(x, y);
pDC->SetPixel(x + 100, y, clr);
pDC->SetPixel(21, y, clr);
pDC->SetPixel(22, y, clr);
pDC->SetPixel(23, y, clr);
pDC->SetPixel(24, y, clr);
}
绘制直线段函数
(1)设置当前位置函数 CPoint MoveTo( int x, int y );
(2)绘制直线段函数 BOOL LineTo( int x, int y );
MoveTo()函数只将画笔的当前位置移动到坐标x和y(或point)处,不画线。
LineTo()从当前位置绘制直线段,但不包括(x,y)点。
绘制直线段的函数不能指颜色,直线段的颜色通过画笔来指定。
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CPen NewPen, *pOldPen;
NewPen.CreatePen(PS_SOLID, 1, RGB(255, 255, 0));
pOldPen = pDC->SelectObject(&NewPen);
pDC->MoveTo(100, 50);
pDC->LineTo(200, 300);
pDC->SelectObject(pOldPen);
NewPen.DeleteObject();
}
绘制矩形函数
(1)绘制直角矩形
BOOL Rectangle( int x1, int y1, int x2, int y2 );
x1、y1是直角矩形的左上角点坐标;x2、y2是直角矩形的右下角点坐标;
(2)绘制圆角矩形
BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 );
(3)设置填充模式
x1、y1是圆角矩形的左上角点坐标;x2、y2是圆角矩形的右下角点坐标;x3、y3是圆角椭圆的宽度和高度;
int SetPolyFillMode( int nPolyFillMode ) ;返回值:如果调用成功,返回原填充模式;否则,返回“0”。在MFC中,ALTERNATE的宏定义值为1,WINDING的宏定义值为2。参数:nPolyFillMode是多边形填充模式,可以选ALTERNATE或WINDING。默认的填充模式是ALTERNATE。对于凸多边形,两种模式的填充效果相同。
// CTestView 绘图
void CTestView::OnDraw(CDC* pDC)
{
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此处为本机数据添加绘制代码
CPen NewPen, *pOldPen; //声明新画笔对象和旧画笔指针
NewPen.CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); //创建1像素宽的蓝色实线画笔
pOldPen = pDC->SelectObject(&NewPen); //将新画笔选入设备上下文
CBrush NewBrush, *pOldBrush; //声明新画刷对象和旧画刷指针
NewBrush.CreateSolidBrush(RGB(255, 0, 0)); //创建绿色实体画刷
pOldBrush = pDC->SelectObject(&NewBrush); //将新画刷选入设备上下文
pDC->Rectangle(100, 100, 600, 300); //绘制矩形
pDC->SelectObject(pOldBrush); //恢复旧画刷
NewBrush.DeleteObject(); //删除已成自由状态的新画刷
pDC->SelectObject(pOldPen); //恢复旧画笔
NewPen.DeleteObject(); //删除已成自由状态的新画笔
}
未完待续。。。