VC++ MFC提供的绘图函数都有哪些?这是一个简答题,就要函数都有哪些

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++ MFC提供的绘图函数都有哪些?这是一个简答题,就要函数都有哪些相关的知识,希望对你有一定的参考价值。

1. 画像素点
画像素点就是设置像素点的颜色,从前面3)(2)已知道这可由CDC的成员函数SetPixel来做,该函数的原型为:
COLORREF SetPixel( int x, int y, COLORREF crColor ); 或
COLORREF SetPixel( POINT point, COLORREF crColor );
其中,x与y分别为像素点的横坐标与纵坐标,crColor为像素的颜色值。例如
pDC->SetPixel(i, j, RGB(r, g, b));

2.画线状图
在Windows中,线状图必须用笔来画(笔的创建与使用见前面的3)(3)),下面是CDC类中可以绘制线状图的常用成员函数:
当前位置:设置当前位置为(x, y)或point:(返回值为原当前位置的坐标)
CPoint MoveTo( int x, int y ); 或 CPoint MoveTo( POINT point);
画线:使用DC中的笔从当前位置画线到点(x, y)或point:(若成功返回非0值):
BOOL LineTo( int x, int y ); 或BOOL LineTo( POINT point );
画折线:使用DC中的笔,依次将点数组lpPoints中的nCount(≥2)个点连接起来,形成一条折线:
BOOL Polyline( LPPOINT lpPoints, int nCount );
画多边形:似画折线,但还会将最后的点与第一个点相连形成多边形,并用DC中的刷填充其内部区域:
BOOL Polygon( LPPOINT lpPoints, int nCount );
画矩形:使用DC中的笔画左上角为(x1, y1)、右下角为(x2,y2)或范围为*lpRect的矩形的边线,并用DC中的刷填充其内部区域:
BOOL Rectangle( int x1, int y1, int x2, int y2 ); 或
BOOL Rectangle( LPCRECT lpRect );
有时需要根据用户给定的两个任意点来重新构造左上角和右下角的点,例如:
rect = CRect(min(p0.x, point.x), min(p0.y, point.y), max(p0.x,point.x), max(p0.y, point.y));
画圆角矩形:使用DC中的笔画左上角为(x1, y1)、右下角为(x2,y2)或范围为*lpRect的矩形的边线,并用宽x3或point.x高y3或point.y矩形的内接椭圆倒角,再用DC中的刷填充其内部区域:
BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3);
BOOL RoundRect( LPCRECT lpRect, POINT point );
例如:
int d = min(rect.Width(), rect.Height()) / 4;
pDC-> RoundRect(rect, CPoint(d, d));
画(椭)圆:使用DC中的笔在左上角为(x1, y1)、右下角为(x2,y2)或范围为*lpRect的矩形中画内接(椭)圆的边线,并用DC中的刷填充其内部区域:
BOOL Ellipse( int x1, int y1, int x2, int y2 );
BOOL Ellipse( LPCRECT lpRect );
注意,CDC中没有画圆的专用函数。在这里,圆是作为椭圆的(宽高相等)特例来画的。
画弧:(x1, y1)与(x2, y2)或lpRect的含义同画(椭)圆,(x3, y3)或ptStart为弧的起点,(x4,y4)或ptEnd为弧的终点:(逆时针方向旋转)
BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, intx4, int y4 );
BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
BOOL ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4,int y4);
BOOL ArcTo(LPCRECT lpRect, POINT ptStart, POINT ptEnd);
画圆弧:(其中(x, y)为圆心、nRadius为半径、fStartAngle为起始角、fSweepAngle为弧段跨角)
BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, floatfSweepAngle);
画弓弦:参数的含义同上,只是用一根弦连接弧的起点和终点,形成一个弓形,并用DC中的刷填充其内部区域:
BOOL Chord( int x1, int y1, int x2, int y2, int x3, int y3, intx4, int y4 );
BOOL Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd );

3.画填充图
在Windows中,面状图必须用刷来填充(刷的创建与使用见前面的3)(4))。上面(2)中的Polygon、Rectangle、Ellipse和Chord等画闭合线状图的函数,只要DC中的刷不是空刷,都可以用来画对应的面状图(边线用当前笔画,内部用当前刷填充)。下面介绍的是CDC类中只能绘制面状图的其他常用成员函数:
画填充矩形:用指定的刷pBrush画一个以lpRect为区域的填充矩形,无边线,填充区域包括矩形的左边界和上边界,但不包括矩形的右边界和下边界:
void FillRect( LPCRECT lpRect, CBrush* pBrush );
画单色填充矩形:似FillRect,但只能填充单色,不能填充条纹和图案:
void FillSolidRect( LPCRECT lpRect, COLORREF clr );
void FillSolidRect( int x, int y, int cx, int cy, COLORREF clr);
画饼图(扇形):参数含义同Arc,但将起点和终点都与外接矩形的中心相连接,形成一个扇形区域,用DC中的刷填充整个扇形区域,无另外的边线:
BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, intx4, int y4 );
BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
画拖动的矩形:先擦除线宽为sizeLast、填充刷为pBrushLast的原矩形lpRectLast,然后再以线宽为size、填充刷为pBrush画新矩形lpRectLast。矩形的边框用灰色的点虚线画,缺省的填充刷为空刷:
void DrawDragRect( LPCRECT lpRect, SIZE size, LPCRECTlpRectLast,
SIZE sizeLast, CBrush* pBrush = NULL, CBrush* pBrushLast = NULL);
如:pDC->DrawDragRect(rect, size, rect0, size);
填充区域:
用当前刷从点(x, y)开始向四周填充到颜色为crColor的边界:
BOOL FloodFill(int x, int y, COLORREF crColor); // 成功返回非0
用当前刷从点(x, y)开始向四周填充:
BOOL ExtFloodFill(int x, int y, COLORREF crColor,
UINT nFillType); // 成功返回非0
nFillType =FLOODFILLBORDER:填充到颜色为crColor的边界(同FloodFill);(用于填充内部颜色不同但边界颜色相同的区域)
nFillType =FLOODFILLSURFACE:填充所有颜色为crColor的点,直到碰到非crColor颜色的点为止。(点(x,y)的颜色也必须为crColor),(用于填充内部颜色相同但边界颜色可以不同的区域)。例如:
pDC->ExtFloodFill(point.x, point.y,pDC-> GetPixel_r(point), FLOODFILLSURFACE);

4.清屏
Windows没有提供专门的清屏函数,可以调用CWnd的下面两个函数调用来完成该功能:
void Invalidate(BOOL bErase = TRUE);
void UpdateWindow( );
或调用CWnd的函数
BOOL RedrawWindow(
LPCRECT lpRectUpdate =NULL,
CRgn* prgnUpdate =NULL,
UINT flags = RDW_INVALIDATE |RDW_UPDATENOW | RDW_ERASE
);
来完成。
例如(菜单项ID_CLEAR的事件处理函数):
CDrawView::OnClear() // 调用OnDraw来清屏
//Invalidate();
//UpdateWindow( );
RedrawWindow( );

也可以用画填充背景色矩形的方法来清屏,如:
RECT rect;
GetClientRect_r(&rect);
pDC->FillSolidRect(&rect, RGB(255,255, 255));
参考技术A 很多,不可能都列出来,参考MSDN或网上搜“GDI函数” 参考技术B 微软全都给你列的好好的了:

http://msdn.microsoft.com/zh-cn/library/fxhhde73.aspx

利用Microsoft VC++6.0 的MFC 的绘图工具实现简单图形的绘制

      MFC运算功能强大,拥有完备的绘图功能。
      在Windows平台上,应用程序的图形设备接口(graphics device interface,GDI)被抽象为设备上下文(Device Context,DC)。
      在微软基类库MFC中,CDC类是定义设备上下文对象的基类,所有绘图函数都在CDC基类中定义。当需要输出文字或图形时,就需要调用CDC类的成员函数,这些成员函数具备输出文本、绘制图形的功能。
      本文讲解的例程全部在TestView.cpp文件的void CTestView::OnDraw(CDC* pDC)函数中实现。
1.在屏幕的P0(20,20)坐标位置处绘制一个蓝色像素点,然后读出该像素点的颜色,水平平移100个像素绘制P1点;画一个矩形。
   代码如下:
 1 void CMy00View::OnDraw(CDC* pDC)
 2 {
 3     CMy00Doc* pDoc = GetDocument();
 4     ASSERT_VALID(pDoc);
 5     // TODO: add draw code for native data here
 6    
 7     COLORREF clr;
 8     int x=20,y=20;
 9     pDC->SetPixelV(x,y,RGB(255,0,0));
10     clr=pDC->GetPixel(x,y);
11     pDC->SetPixelV(x+100,y,clr);//像素点
12     pDC->Rectangle(100,200,200,300);//矩形
13 }

 效果如下:

技术分享

2.从起点P0(20,30)到终点P1(200,300)画一条1像素宽的蓝色直线
代码如下:
 1 void CMy00View::OnDraw(CDC* pDC)
 2 {
 3     CMy00Doc* pDoc = GetDocument();
 4     ASSERT_VALID(pDoc);
 5     // TODO: add draw code for native data here
 6     //从起点P0(20,30)到终点P1(200,300)画一条1像素宽的蓝色直线,
 7         CPen NewPen,*p01dPen;
 8     NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));
 9     p01dPen=pDC->SelectObject(&NewPen);
10     pDC->MoveTo(20,30);
11     pDC->LineTo(200,300);
12     pDC->SelectObject(p01dPen);
13     NewPen.DeleteObject();
14 }
效果如下:
技术分享
 
3.绘制左上角点为P0(100,100),右下角点为P1(600,300)的矩形。矩形边界线为1像素宽的蓝线,矩形内部填充为绿色
  代码如下:
 1 void CMy00View::OnDraw(CDC* pDC)
 2 {
 3     CMy00Doc* pDoc = GetDocument();
 4     ASSERT_VALID(pDoc);
 5     // TODO: add draw code for native data here
 6         CPen NewPen,*p01dPen;
 7     NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255));
 8     p01dPen=pDC->SelectObject(&NewPen);
 9     CBrush NewBrush,*p01dBrush;
10     NewBrush.CreateSolidBrush(RGB(0,255,0));
11     p01dBrush=pDC->SelectObject(&NewBrush);
12         pDC->Rectangle(100,100,600,300);
13     pDC->SelectObject(p01dBrush);
14     NewBrush.DeleteObject();
15 }

 效果如下:

技术分享

 

以上是关于VC++ MFC提供的绘图函数都有哪些?这是一个简答题,就要函数都有哪些的主要内容,如果未能解决你的问题,请参考以下文章

想用mfc做一个绘图系统,画圆直线矩形填充颜色和平移

【(VC/MFC)绘图控件TeeChart问题】如何设置X轴显示时间(vs2010)

VC单击按钮弹出对话框都有哪些方法?

利用Microsoft VC++6.0 的MFC 的绘图工具实现简单图形的绘制

VC中MFC下的绘图初步解析

在 COM 服务器中使用 MFC - 我都有哪些选择?