5.3  常用绘图函数

5.3 常用绘图函数

  • 最近更新2018年10月08日

特殊说明:版权归个人所有,请勿转载,谢谢合作。

现在已经理解了画笔与画刷的概念以及创建的过程,接下来学习一下它们在实际程序中绘制图形的方法。

 

5.3.1    绘制像素点

在使用GDI绘制点是件很容易的事,不需要使用画笔或画刷,因为一个点只是一个像素,选定画笔与画刷,并不起到任何作用。【例5-3】是在窗口200×200的位置随机绘制2000个像素点:

 

case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  for (i = 0; i < 2000; ++i)
  {
    int x = rand()%200;
    int y = rand()%200;
    SetPixel(hdc, x, y, RGB(0, 0, 0));
  }//end for
  EndPaint(hWnd, &ps);
  break;

 

程序执行效果如图5.3所示。

  • 图5.3 像素点绘制

5.3.2    绘制直线

绘制直线使用MoveToEx与LineTo两个函数来实现,MoveToEx函数是确定直线的起始点坐标位置,函数原型如下:

 

BOOL MoveToEx(
  HDC hdc,           // handle to device context
  int X,             // x-coordinate of new current position
  int Y,             // y-coordinate of new current position
  LPPOINT lpPoint    // pointer to old current position
);

 

参数hdc为设备环境句柄,X、Y则是起始点的坐标位置,lpPoint为光标的旧位置,一个指向POINT结构的指针,用来存放上一个点的位置。

 

LineTo函数用来确定直线的结束坐标位置,并进行画线操作,函数原型如下:

 

BOOL LineTo(
  HDC hdc,     // device context handle
  int nXEnd,   // x-coordinate of line's ending point
  int nYEnd    // y-coordinate of line's ending point
);

 

参数hdc为设备环境句柄,nXEnd、nYEnd为直线的终点。

 

如果绘制一条直线,需要使用这两个函数方可实现,具体代码如下所示:

 

MoveToEx(hdc,100,50,NULL);
LineTo(hdc,200,300);

 

如果只使用MoveToEx与LineTo来绘制直线,直线默认为1像素黑色线,但如果绘制其他颜色风格的直线,就需要使用画笔,下例是绘制一条3像素实线型的直线,直线的颜色为红色。

 

  // 图形绘制事件
case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);

  {
    // 绘制示例
    HPEN hPen= CreatePen( PS_SOLID,3,RGB(255,0,0));
    HPEN hOldPen = (HPEN) SelectObject(hdc,hPen);
    MoveToEx(hdc,100,50,NULL);
    LineTo(hdc,200,300);
    SelectObject(hdc,hOldPen);
    DeleteObject(hPen);
  }

  EndPaint(hWnd, &ps);
  break;

 

程序执行结果如图5.4所示。

  • 图5.4 绘制直线

5.3.3    绘制矩形

矩形绘制,可以使用Rectangle函数直接绘制,Rectangle函数原型如下:

 

BOOL Rectangle(
  HDC hdc,           // handle to device context
  int nLeftRect,     // x-coord of bounding rectangle's upper-left corner
  int nTopRect,      // y-coord of bounding rectangle's upper-left corner
  int nRightRect,    // x-coord of bounding rectangle's lower-right corner
  int nBottomRect    // y-coord of bounding rectangle's lower-right corner
);

 

参数hdc,设备环境句柄。

参数nLeftRect,指定矩形左上角的逻辑X坐标。

参数nTopRect,指定矩形左上角的逻辑Y坐标。

参数nRightRect,指定矩形右下角的逻辑X坐标。

参数nBottomRect,指定矩形右下角的逻辑Y坐标。

 

如果需要对矩形内部区域进行填充,就需要使用画刷。下列是创建粉红色矩形框:

 

case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  {
    // 画刷实例
    HBRUSH hBrush = CreateSolidBrush(RGB(255,0,255));
    HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc,hBrush);
    Rectangle(hdc,50,50,400,400);
    SelectObject(hdc,hOldBrush);
    DeleteObject(hBrush);
  }
  EndPaint(hWnd, &ps);
  break;

 

程序执行结果如图5.5所示。

  • 图5.5 绘制矩形

 

5.3.4    其他图形绘制函数

Windows GDI函数有很多,前面介绍的是两种最常用的绘制方法,更多的函数可以参阅MSDN。下面对GDI函数进行了分类,并进行简单介绍。

绘制直线与曲线的函数有很多,如表5.5所示,简单地对常用的绘制函数进行介绍,这些函数已经足够绘制各种各样的图形(包括汽车建模模型)。

 

  • 表5.5 绘制直线和曲线的函数
函数 描述
MoveTo 在绘制直线前,设定当前位置
LineTo 从当前位置绘制一条线到指定位置,并将当前位置移至线的终点
Polyline 将一系列点用线段连接起来
PolylineTo 从当前位置开始,将一系列点用线段连接起来,并将当前位置移正至折线的终点
Arc 绘制一个弧
ArcTo 绘制一个弧,并将当前位置移至弧的终点
PolyBezier 绘制一条或多条贝塞尔样式曲线
PolyBezierTo 绘制一条或多条贝塞尔样式曲线,并将当前位置移至最后一段样式曲线的终点
PolyDraw 通过一组点绘制一系列线段和贝塞尔样式曲线,并将当前位置移至最后一个线段或样式曲线的终点

 

GDI不会限制简单的直线和曲线上,还有其他很多封闭图形,如表5.6所示,列出了常用的绘制函数。

 

  • 表5.6 绘制封闭图形的函数
函数 描述
Chord 绘制一个由椭圆和直线相交后围成的封闭图形
Ellipse 绘制一个圆或椭圆
Pie 绘制一个饼状图形
Polygon 连接一组点形成一个多边形
Rectangle 绘制一个带直角的矩形
RoundRect 绘制一个带圆角的矩形

 

分享到 :
5.2 绘图工具
上一篇 2018-10-09
5.4 几何图形绘制实例
2018-10-09 下一篇
相关推荐

发表回复

登录... 后才能评论