vc在窗体上绘制扇形

原创 2006年06月17日 09:42:00

做控件的时候难免会遇到绘制图形,而扇形也是其中的一种,在查询MSDN后,经过iN次摸索,才渐渐明白了扇形的绘制方法,过程如下:

1、新建一个Dialog工程,在OnPaint里加上如下代码:

void CtestchDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;

  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
  CPaintDC dc(this);
  CRect rectClient;   //当前控件的矩形坐标结构
  GetClientRect(rectClient);

   // Make a couple of pens and similar brushes.
     CBrush brushBlue;
     CBrush* pOldBrush;
     CPen* pOldPen;

    brushBlue.CreateSolidBrush(RGB(0,0, 255));    //创建实心画刷  

    // Draw from 3 o'clock to 6 o'clock, counterclockwise,
    // in a blue pen with a solid blue fill. 
    pOldBrush = dc.SelectObject(&brushBlue); 
     rectClient.bottom*=2;
       dc.Pie(rectClient,
    CPoint(rectClient.right,0), //CenterPoint()为中心点
    //CPoint(rectClient.CenterPoint().x, rectClient.right));
    CPoint(rectClient.left,0));
      // Restore the previous pen.
    dc.SelectObject(pOldPen);
   CDialog::OnPaint();
  }
}

3、MSDN解释如下:

BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );

BOOL Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );

Return Value

Nonzero if the function is successful; otherwise 0.

Parameters

x1

Specifies the x-coordinate of the upper-left corner of the bounding rectangle (in logical units).

y1

Specifies the y-coordinate of the upper-left corner of the bounding rectangle (in logical units).

x2

Specifies the x-coordinate of the lower-right corner of the bounding rectangle (in logical units).

y2

Specifies the y-coordinate of the lower-right corner of the bounding rectangle (in logical units).

x3

Specifies the x-coordinate of the arc’s starting point (in logical units). This point does not have to lie exactly on the arc.

y3

Specifies the y-coordinate of the arc’s starting point (in logical units). This point does not have to lie exactly on the arc.

x4

Specifies the x-coordinate of the arc’s endpoint (in logical units). This point does not have to lie exactly on the arc.

y4

Specifies the y-coordinate of the arc’s endpoint (in logical units). This point does not have to lie exactly on the arc.

lpRect

Specifies the bounding rectangle. You can pass either a CRect object or a pointer to a RECT structure for this parameter.

ptStart

Specifies the starting point of the arc. This point does not have to lie exactly on the arc. You can pass either a POINT structure or a CPoint object for this parameter.

ptEnd

Specifies the endpoint of the arc. This point does not have to lie exactly on the arc. You can pass either a POINT structure or a CPoint object for this parameter.

Remarks

Draws a pie-shaped wedge by drawing an elliptical arc whose center and two endpoints are joined by lines. The center of the arc is the center of the bounding rectangle specified by x1, y1, x2, and y2 (or by lpRect). The starting and ending points of the arc are specified by x3, y3, x4, and y4 (or by ptStart and ptEnd). 

The arc is drawn with the selected pen, moving in a counterclockwise direction. Two additional lines are drawn from each endpoint to the arc’s center. The pie-shaped area is filled with the current brush. If x3 equals x4 and y3 equals y4, the result is an ellipse with a single line from the center of the ellipse to the point (x3, y3) or (x4, y4). 

The figure drawn by this function extends up to but does not include the right and bottom coordinates. This means that the height of the figure is y2 – y1 and the width of the figure is x2 – x1. Both the width and the height of the bounding rectangle must be greater than 2 units and less than 32,767 units.

简单的说,x1,y1,x2,y2 确定外接矩形,扇形的中心和外接矩形的中心重合

至于x3,y3,x4,y4,只是为了确定起点和终点,不一定在扇形上,系统会自动计算扇形的位置

同时,绘制出的扇形并不一定是圆的一部分,形状不是很规则,绘制的时候要注意

另外,扇形的边框是用pen来绘的,填充是用brush,如果边框不设置颜色,默认为黑色

VC++之绘制连续线条和扇形效果的线条

本篇是在上一篇博客的基础上继续学习绘图的。 为了绘制连续的线条,首先需要得到线条的起点,这在前篇博客已经实现了,然后需要捕获鼠标移动过程中的每一个点,这可以通过捕获鼠标移动消息(WM_MOUSEMO...
  • lxjstudyIT
  • lxjstudyIT
  • 2016年10月21日 13:45
  • 705

[Unity]利用Mesh在Unity中绘制扇形图片2

之前那篇文章后,和同事又就这个问题讨论了一下,发现,其实不需要那么死心眼画n个三角形,因为图片本身除了圆以外的地方都是透明的, 画出来也没事。 这样的话, 其实可以把正方形的图片分成4个三角形,这样...
  • zryxh1
  • zryxh1
  • 2017年01月08日 22:50
  • 1024

CRgn绘制扇形并响应鼠标move

在VC6中使用CRgn类提供的方法实现。 1)利用CreateFromPath从绘制的路径中创建扇形区域。 2)利用CombineRgn对两个扇形区域进行与操作。 3)使用PtInR...
  • zqckzqck
  • zqckzqck
  • 2014年02月25日 20:26
  • 2495

[Unity]利用Mesh在Unity中绘制扇形图片

背景最近碰到个功能, 要画一个扇形图案, 如下图: 美术原图: 需求是这个图形跟随角色, 在角色背后, 并且每个角色的扇形角度可能不同。 So, NGUI和UGUI很好用的FilledTyp...
  • zryxh1
  • zryxh1
  • 2016年12月31日 22:46
  • 3404

VC++60 第九章 在窗体上写字

第九章 在窗体上写字 从前面的例程中我们看到,要在视窗式的应用程序中显示文字可用静态文本、编辑框和弹出消息框等方法。另外的一种方法是直接在窗口面版上写字,用这种方法还可以自由设置字体、大小和颜色...
  • GL_a_
  • GL_a_
  • 2016年10月13日 17:47
  • 930

JAVA 基本绘图——利用JFrame JPanel 绘制扇形

利用JFrame制作幕布(容器),创建JPanel部件,将JPanel部件添加到JFrame容器中,利用了基本的java绘制图形方法,步骤也是基本的套路。 利用了API   ———   fillAr...
  • wangbowj123
  • wangbowj123
  • 2017年05月27日 22:53
  • 884

iPhone 利用CG API画一个饼图(Pie chart) 百分比圆 以及 响应扇形点击事件

核心函数是:CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFl...
  • zaitianaoxiang
  • zaitianaoxiang
  • 2011年10月12日 10:10
  • 9249

html5 canvas元素扇形的绘制

canvas{background: #b8edc9;}                            Canvas                      您的浏览器不支持ht...
  • JRJ1637
  • JRJ1637
  • 2016年12月16日 01:13
  • 1283

使用canvas绘制扇形图

标签定义图形,比如图表和其他图像, 必须使用脚本来绘制图形。 html代码: JavaScript代码: function drawCircle...
  • LCYong_
  • LCYong_
  • 2017年04月18日 11:27
  • 1006

OpenLayers中如何画扇形

项目中用到了地图展示,但是有个需求是根据参数画扇形,但是OpenLayers没有画扇形的现成函数,在某个牛人的帮助下,修改了下源代码便可以了 1,首先在源码中加入以下代码,最好是在OpenLayers...
  • wang8118
  • wang8118
  • 2012年05月16日 11:17
  • 1641
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc在窗体上绘制扇形
举报原因:
原因补充:

(最多只允许输入30个字)