如何用VC++画扇形,用pie函数,高手来一下!

如何用VC++画扇形,用pie函数,高手来一下!,第1张

我这样的低手就可以完成了

POINT point1,point2//两个点,分别与椭圆的中心连接,形成扇形

RECT rt//椭圆的矩形

Pie(hdc, rt.left,rt.top,rt.right,rt.bottom,point1.x,point1.y,point2.x,point2.y)

以圆心为轴进行旋转还好说,如果是“任意点”为轴,那么使用pie函数做运算是很困难的。

所谓旋转算法,其实就是通过角度计算后重画的问题,你需要得到画新扇形的新的参数,pie函数的参数并不适合做旋转,相对方便的是AngleArc或者Arc函数,这种使用角度计算的弧线函数,你只需要计算新的圆心就可以了,因为旋转角度本身就是递增变量。不过这类函数需要通过BeginPath之类的方法完成路径绘制和填充,在画单个扇形时稍微复杂。

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))


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12197125.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存