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的Picture control在窗体上显示一副图片

vc picture控件的使用 方法1.先从最简单的开始,用picture 控件来实现. 步骤: 先在资源里Import一张图片,ID为IDB_BITMAP2 然后在对...

如何使用双缓冲在窗体上绘制

本教程与“Simple Finger Drawing(v.1.1.0)”这个bada应用相关,你能在projects section找到这个应用。我将用它作为一个例子来演示用双缓冲这种最有效的方式(我...

java_在窗体中绘制图形

  • 2015-06-27 00:50
  • 50KB
  • 下载

C#0009--直接在窗体上绘图

C#0009--直接在窗体上绘图

关于在窗体中使用多线程调用控件的方式

小弟之前在窗体的多线程内调用控件,使用: System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 这条语句,...

C#中在窗体间使用消息来处理相关联的事件

在项目中有这样的需求,在主窗体隐藏时或者主进程运行时对其它窗体的控件或者事件进行控制,而且其它窗体是处于活动状态,而主窗体或者主进程是隐藏在后面的。这个时候使用句柄和消息来处理就比较好解决这些问题了,...

BGRABitmap图像操作3:用鼠标在窗体画连续的曲线

unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Gr...

怎样让Panel在窗体上拖动和拉伸

type TMyButton = class(TButton) protected procedure WMNCHitTest(var Msg:TWMNCHitTest);message ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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