分享

VC画图-2

 杰杰梅梅一生一世 2011-08-30

3 设置绘图颜色

1.颜色

Windows中的颜色一般用4个字节表示(0BGR(整数) = R G B 0(字节序) [Intel CPU低位字节在前]),Win32 API中定义了一个专门表示颜色索引值的变量类型COLORREF:(windef.h)

typedef DWORD COLORREF; // 0x00bbggrr

和一个由红绿蓝三原色构造颜色值的宏RGB:(wingdi.h)

#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))

其中,r、g、b为字节变量,取值范围为0~255。其函数说明为:

COLORREF RGB(

BYTE bRed, // red component of color

BYTE bGreen, // green component of color

BYTE bBlue // blue component of color

);

例如:

COLORREF red, gray;

red = RGB(255, 0, 0);

gray = RGB(128, 128,128);

在API中还定义了由COLORREF变量获取各个颜色分量的宏Get?Value:(wingdi.h)

#define GetRValue(rgb) (LOBYTE(rgb))

#define GetGValue(rgb) (LOBYTE(((WORD)(rgb)) >> 8))

#define GetBValue(rgb) (LOBYTE((rgb)>>16))

其中:

typedef unsigned long ULONG_PTR;

typedef ULONG_PTR DWORD_PTR;

#define LOBYTE(w) ((BYTE)((DWORD_PTR)(w) & 0xff))

它们对应的函数说明为:

BYTE GetRValue(DWORD rgb); // DWORD rgb ~ COLORREF col

BYTE GetGValue(DWORD rgb);

BYTE GetBValue(DWORD rgb);

2.点色(像素)

在Windows中,像素(pixel)的颜色是直接由设备上下文类CDC的成员函数SetPixel来设置的,该函数的原型为:

COLORREF SetPixel( int x, int y, COLORREF crColor );

COLORREF SetPixel( POINT point, COLORREF crColor );

其中,x与y分别为像素点的横坐标与纵坐标,crColor为像素的颜色值。例如:

pDC->SetPixel(10, 10, RGB(0, 255, 0));

另外,也可以用CDC的成员函数

COLORREF GetPixel( int x, int y ) const;

COLORREF GetPixel( POINT point ) const;

来获得指定点(x, y)或point的颜色。例如:

COLORREF col;

col = pDC->GetPixel(10, 10);

3.线色(笔)

在Windows中,线状图必须用笔(pen)来画,所以线的颜色就由笔色来确定。在MFC中,笔的属性和功能由CPen类提供(CPen是CGDIObject的派生类)。

笔的创建与使用的步骤为:

<!--[if !supportLists]-->l <!--[endif]-->创建笔对象:创建笔类CPen对象的方法有如下两种:

<!--[if !supportLists]-->n <!--[endif]-->使用构造函数CPen

CPen( int nPenStyle, int nWidth, COLORREF crColor );

其中:

<!--[if !supportLists]-->u <!--[endif]-->nPenStyle为笔的风格,可取值:

PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PSDASHDOTDOT

注意:1~4号笔风格只是在笔宽=0或1时有效,笔宽>1时总为实心的。

<!--[if !supportLists]-->u <!--[endif]-->nWidth为笔宽,与映射模式有关,使用缺省映射时为像素数,若nWidth = 0,则不论什么映射模式,笔宽都为一个像素;

<!--[if !supportLists]-->u <!--[endif]-->crColor为笔的颜色值。

例如

CPen* pGrayPen = new CPen(PS_SOLID, 0, RGB(128, 128, 128));

CPen grayPen(PS_SOLID, 0, RGB(128, 128, 128));

<!--[if !supportLists]-->n <!--[endif]-->使用成员函数CreatePen

BOOL CreatePen( int nPenStyle, int nWidth, COLORREF crColor );

如:

CPen grayPen;

grayPen.CreatePen(PS_SOLID, 0, RGB(128, 128, 128));

<!--[if !supportLists]-->n <!--[endif]-->缺省的笔为单像素宽的实心黑色笔

<!--[if !supportLists]-->l <!--[endif]-->将笔对象选入设备上下文:为了能使用我们所创建的笔对象,必须先将它选入设备上下文,这可以调用设备上下文类CDC的成员函数SelectObject来完成:

CPen* SelectObject( CPen* pPen );

返回值为指向原来笔对象的指针(一般将其保存下来,供下次再装入时使用)。如

pOldPen = pDC->SelectObject(&pen);

另外,Windows中有一些预定义的笔对象,可用CDC的另一成员函数SelectStockObject将其选入DC,其函数原型为:

virtual CGdiObject* SelectStockObject( int nIndex );

预定义的笔对象有BLACK_PEN(黑色笔)、WHITE_PEN (白色笔)、NULL_PEN(空笔/无色笔)。例如:

pDC->SelectStockObject(BLACK_PEN);

<!--[if !supportLists]-->l <!--[endif]-->使用设备上下文画线状图:画线状图以及面状图的边线,所使用的是当前设备上下文中的笔对象。线状图有直线、折线、矩形、(椭)圆(弧)等,详见4)(2)

<!--[if !supportLists]-->l <!--[endif]-->将笔对象从设备上下文中放出:为了能删除使用过的笔对象,必须先将它从设备上下文中释放出来后,然后才能删除。释放的方法是装入其他的笔对象(一般是重新装入原来的笔对象)。例如

pDC->SelectObject(pOldPen);

<!--[if !supportLists]-->l <!--[endif]-->删除笔对象:为了能删除笔对象,必须先将其从设备上下文中释放。删除方法有如下几种:

<!--[if !supportLists]-->n <!--[endif]-->调用笔类CDC的成员函数DeleteObject删除笔的当前内容(但是未删除笔对象,以后可再用成员函数CreatePen在笔对象中继续创建新的笔内容)。如

pen.DeleteObject();

<!--[if !supportLists]-->n <!--[endif]-->使用删除运算符delete将笔对象彻底删除,如delete pen;

<!--[if !supportLists]-->n <!--[endif]-->自动删除:若笔对象为局部变量,则在离开其作用域时,会被系统自动删除

下面为一段较完整地创建与使用笔的例子代码:

CPen pen, *pOldPen;

for (int j = 0; j <= 255; j++) {

HSLtoRGB(m_hue, m_sat, 255 - j, r, g, b); // 自定义的函数

pen.CreatePen(PS_SOLID, 0, RGB(r, g, b));

pOldPen = pDC->SelectObject(&pen);

pDC->MoveTo(0, j); pDC->LineTo(40, j);

pDC->SelectObject(pOldPen);

pen.DeleteObject();

}

4.面色(刷)

在Windows中,面状图必须用刷(brush)来填充,所以面色是由刷色来确定的。MFC中的刷类为CBrush(它也是CGDIObject的派生类),刷的创建与使用的步骤与笔的相似。

<!--[if !supportLists]-->l <!--[endif]-->构造函数有4个:

<!--[if !supportLists]-->n <!--[endif]-->CBrush( ); // 创建一个刷的空对象

<!--[if !supportLists]-->n <!--[endif]-->CBrush( COLORREF crColor ); // 创建颜色为crColor的实心刷

<!--[if !supportLists]-->n <!--[endif]-->CBrush( int nIndex, COLORREF crColor ); // 创建风格由nIndex指定且颜色为crColor的条纹(hatch孵化)刷,其中nIndex可取条纹风格(Hatch Styles)值:

符号常量 数字常量 风格

HS_HORIZONTAL 0 水平线

HS_VERTICAL 1 垂直线

HS_FDIAGONAL 2 正斜线

HS_BDIAGONAL 3 反斜线

HS_CROSS 4 十字线(正网格)

HS_DIAGCROSS 5 斜十字线(斜网格)

<!--[if !supportLists]-->n <!--[endif]-->CBrush( CBitmap* pBitmap ); // 创建位图为pBitmap的图案刷

如:pDC->FillRect( &rect, new CBrush( RGB(r, g, b) ) );

<!--[if !supportLists]-->l <!--[endif]-->与构造函数相对应,有多个创建不同类型刷的成员函数:

<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateSolidBrush( COLORREF crColor );

<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateHatchBrush( int nIndex, COLORREF crColor );

<!--[if !supportLists]-->n <!--[endif]-->BOOL CreatePatternBrush( CBitmap* pBitmap );

<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage );

<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage );

<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush );

<!--[if !supportLists]-->n <!--[endif]-->BOOL CreateSysColorBrush( int nIndex );

<!--[if !supportLists]-->l <!--[endif]-->预定义的刷对象有BLACK_BRUSH(黑刷)、DKGRAY_BRUSH(暗灰刷)、GRAY_BRUSH(灰刷)、HOLLOW_BRUSH(空刷)、LTGRAY_BRUSH(亮灰刷)、NULL_BRUSH(空刷)、WHITE_BRUSH(白刷)

<!--[if !supportLists]-->l <!--[endif]-->缺省的刷为空刷

<!--[if !supportLists]-->l <!--[endif]-->与笔一样,可以用函数SelectObject或SelectStockObject将自定义的刷或预定义的刷选入DC中,供绘面状图时使用。

5.文本色

可使用CDC类的成员函数SetTextColor和SetBkColor来分别设置输出文本的前景色和背景色:(缺省的前景色为黑色,背景色空)

COLORREF GetTextColor( ) const;

virtual COLORREF SetTextColor( COLORREF crColor );

COLORREF GetBkColor( ) const;

virtual COLORREF SetBkColor( COLORREF crColor );

例如:

pDC->TextOut(10, 10, "Test text");

pDC->SetTextColor(RGB(0, 128, 0)); pDC->TextOut(10, 30, "Test text");

pDC->SetBkColor(RGB(0, 0, 128)); pDC->TextOut(10, 50, "Test text");

6.绘图工具

1)GDI对象

Windows的图形设备接口(GDI = graphics device interface)对象指各种绘图工具,如笔、刷、位图、字体、调色板、区域等,对应的MFC类为CPen、CBrush、CBitmap、CFont等。这些图形绘制对象类都是CGDIObject的派生类,而CGDIObject则是直接从CObject类派生的抽象基类。<!--[endif]-->其中,Windws CE不支持调色板类CPalette;CRgn为区域类,对应于窗口中的一个矩形、多边形或(椭)圆区域(region),可用于移动、拷贝、合并、判断和裁剪。

2)选入

可用设备上下文类CDC的多态成员函数SelectObject,来将绘图工具对象选入设备上下文,以供绘图时使用:

CPen* SelectObject( CPen* pPen );

CBrush* SelectObject( CBrush* pBrush );

virtual CFont* SelectObject( CFont* pFont );

CBitmap* SelectObject( CBitmap* pBitmap );

int SelectObject( CRgn* pRgn );

CGdiObject* SelectObject( CGdiObject* pObject );

3)获取

可用API函数GetCurrentObject来获得当前在DC中的指定类型的绘图对象:

HGDIOBJ GetCurrentObject(

HDC hdc, // handle to device context

UINT uObjectType // specifies the object-type

);

其中,参数uObjectType可取值:

OBJ_PEN // Returns the current selected pen.

OBJ_BRUSH // Returns the current selected brush.

OBJ_PAL // Returns the current selected palette.

OBJ_FONT // Returns the current selected font.

OBJ_BITMAP // Returns the current selected bitmap.

也可分别调用CDC类的下列成员函数来做同样的事:

CPen* GetCurrentPen( ) const;

CBrush* GetCurrentBrush( ) const;

CFont* GetCurrentFont( ) const;

CBitmap* GetCurrentBitmap( ) const;

CPalette* GetCurrentPalette( ) const;

如:

HPEN hPen = (HPEN)GetCurrentObject(pDC->m_hDC, OBJ_PEN);

CPen* pPen = CPen::FromHandle(hPen);

等价于:

CPen* pPen = pDC-> GetCurrentPen( );

4 画图

在Windows中,绘图一般在视图窗口的客户区进行,使用的是设备上下文类CDC中各种绘图函数。

1. 映射模式与坐标系

1)默认映射模式

映射模式(map mode)影响所有的图形和文本绘制函数,它定义(将逻辑单位转换为设备单位所使用的)度量单位和坐标方向,Windows总是用逻辑单位来绘图。

缺省情况下,绘图的默认映射模式为MM_TEXT,其绘图单位为像素(只要不打印输出,屏幕绘图使用该模式就够了)。若窗口客户区的宽和高分别为w和h像素,则其x坐标是从左到右,范围为0 ~ w-1;y坐标是从上到下,范围为0 ~ h-1。

2)设置映射模式

可以使用CDC类的成员函数GetMapMode和SetMapMode来获得和设置当前的映射模式:

int GetMapMode( ) const; // 返回当前的映射模式

virtual int SetMapMode( int nMapMode ); // 返回先前的映射模式

映射模式的nMapMode取值与含义

符号常量 数字常量 x方向 y方向 逻辑单位的大小

MM_TEXT 1 向右 向下 像素

MM_LOMETRIC 2 向右 向上 0.1 mm

MM_HIMETRIC 3 向右 向上 0.01 mm

MM_LOENGLISH 4 向右 向上 0.01 in

MM_HIENGLISH 5 向右 向上 0.001 in

MM_TWIPS 6 向右 向上 1/1440 in

MM_ISOTROPIC 7 自定义 自定义 自定义

MM_ANISOTROPIC 8 自定义 自定义 自定义

可见,除了两种自定义映射模式外,x方向都是向右,y方向也只有MM_TEXT的向下,其余的都是向上,与数学上一致。除了MM_ANISOTROPIC外,其他所有映射模式的x与y方向的单位都是相同的。所有映射模式的逻辑坐标的原点(0, 0)最初都是在窗口的左上角,但在CScrollView的派生类中,MFC会随用户滚动文档而自动调整逻辑原点的相对位置(改变视点的原点属性)。

3)自定义映射模式

自定义映射模式MM_ISOTROPIC(各向同性,x与y方向的单位必须相同)和MM_ANISOTROPIC(各向异性,x与y方向的单位可以不同)的单位和方向,可以通过用CDC类的成员函数G/SetWindowExt和G/SetViewportExt来获取/设置窗口和视口的大小来确定:

CSize GetWindowExt( ) const;

virtual CSize SetWindowExt( int cx, int cy );

virtual CSize SetWindowExt( SIZE size );

CSize GetViewportExt( ) const;

virtual CSize SetViewportExt( int cx, int cy );

virtual CSize SetViewportExt( SIZE size );

其中,cx或size.cx和cy或size.cy分别为窗口/视口的宽度与高度(逻辑单位)。

还可以用CDC类的成员函数SetViewportOrg来设置坐标原点的位置:

virtual CPoint SetViewportOrg( int x, int y );

CPoint SetViewportOrg( POINT point );

例如

void CDrawView::OnDraw(CDC* pDC) {

CRect rect;

GetClientRect(rect);

pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetWindowExt(1000,1000);

pDC->SetViewportExt(rect.right, -rect.bottom);

pDC->SetViewportOrg(rect.right / 2, rect.bottom /2);

pDC->Ellipse(CRect(-500, -500, 500, 500));

}

将当前的映射模式设置为各向异性自定义映射模式,窗口大小为1000个逻辑单位宽和1000个逻辑单位高,视口大小同当前客户区,视口的坐标原点设置在当前客户区的中央。由于使用了负数作为SetViewportExt函数的第2个参数,所以y轴方向是向上的。

可见,圆被画成了椭圆,x与y方向上的逻辑单位不相同。

4)单位转换

对所有非MM_TEXT映射模式,有如下重要规则:

<!--[if !supportLists]-->l <!--[endif]-->CDC的成员函数(如各种绘图函数)具有逻辑坐标参数

<!--[if !supportLists]-->l <!--[endif]-->CWnd的成员函数(如各种响应函数)具有设备坐标参数(如鼠标位置point)

<!--[if !supportLists]-->l <!--[endif]-->位置的测试操作(如CRect的PtInRect函数)只有使用设备坐标时才有效

<!--[if !supportLists]-->l <!--[endif]-->长期使用的值应该用逻辑坐标保存(如窗口滚动后保存的设备坐标就无效了)

因此,为了使应用程序能够正确工作,除MM_TEXT映射模式外,其他映射模式都需要进行单位转换。下面是逻辑单位到设备单位(如像素)的转换公式:

x比例因子 = 视口宽度 / 窗口宽度

y比例因子 = 视口高度 / 窗口高度

设备x = 逻辑x * x比例因子 + x原点偏移量

设备y = 逻辑y * y比例因子 + y原点偏移量

Windows的GDI负责逻辑坐标和设备坐标之间的转换,这可以调用CDC类的成员函数LPtoDP和DPtoLP来进行:

void LPtoDP( LPPOINT lpPoints, int nCount = 1 ) const;

void LPtoDP( LPRECT lpRect ) const;

void LPtoDP( LPSIZE lpSize ) const;

void DPtoLP( LPPOINT lpPoints, int nCount = 1 ) const;

void DPtoLP( LPRECT lpRect ) const;

void DPtoLP( LPSIZE lpSize ) const;

例如:

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) {

CRect rect = m_rect; // 逻辑坐标

CClientDC dc(this);

dc.SetMapMode(MM_LOENGLISH);

dc.LPtoDP(rect); // 转化成设备坐标

if (rect.PtInRect(point)) // 位置的测试操作只有使用设备坐标时才有效

......

}

void CDrawView:: OnMouseMove (UINT nFlags, CPoint point) {

float t,y;

char buf[40];

CDC* pDC = GetDC();

pDC->SetMapMode(MM_HIMETRIC);

pDC->DPtoLP(&point); // 转化成逻辑坐标

t = t1 + (point.x * dt) / w; sprintf(buf, "%.4fs", t); pSB->SetPaneText(xV, buf);

y = (y0 - point.y) / dy; sprintf(buf, "%.4f", y); pSB->SetPaneText(yV, buf);

......

}

2. 画像素点

画像素点就是设置像素点的颜色,从前面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));

3.画线状图

在Windows中,线状图必须用笔来画(笔的创建与使用见前面的3)(3)),下面是CDC类中可以绘制线状图的常用成员函数:

<!--[if !supportLists]-->l <!--[endif]-->当前位置:设置当前位置为(x, y)或point:(返回值为原当前位置的坐标)

CPoint MoveTo( int x, int y ); 或 CPoint MoveTo( POINT point );

<!--[if !supportLists]-->l <!--[endif]-->画线:使用DC中的笔从当前位置画线到点(x, y)或point:(若成功返回非0值):

BOOL LineTo( int x, int y ); 或BOOL LineTo( POINT point );

<!--[if !supportLists]-->l <!--[endif]-->画折线:使用DC中的笔,依次将点数组lpPoints中的nCount(≥2)个点连接起来,形成一条折线:

BOOL Polyline( LPPOINT lpPoints, int nCount );

<!--[if !supportLists]-->l <!--[endif]-->画多边形:似画折线,但还会将最后的点与第一个点相连形成多边形,并用DC中的刷填充其内部区域:

BOOL Polygon( LPPOINT lpPoints, int nCount );

<!--[if !supportLists]-->l <!--[endif]-->画矩形:使用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));

<!--[if !supportLists]-->l <!--[endif]-->画圆角矩形:使用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));

<!--[if !supportLists]-->l <!--[endif]-->画(椭)圆:使用DC中的笔在左上角为(x1, y1)、右下角为(x2, y2)或范围为*lpRect的矩形中画内接(椭)圆的边线,并用DC中的刷填充其内部区域:

BOOL Ellipse( int x1, int y1, int x2, int y2 );

BOOL Ellipse( LPCRECT lpRect );

注意,CDC中没有画圆的专用函数。在这里,圆是作为椭圆的(宽高相等)特例来画的。

<!--[if !supportLists]-->l <!--[endif]-->画弧:(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, int x4, 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, float fSweepAngle);

<!--[if !supportLists]-->l <!--[endif]-->画弓弦:参数的含义同上,只是用一根弦连接弧的起点和终点,形成一个弓形,并用DC中的刷填充其内部区域:

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

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

4.画填充图

在Windows中,面状图必须用刷来填充(刷的创建与使用见前面的3)(4))。上面(2)中的Polygon、Rectangle、Ellipse和Chord等画闭合线状图的函数,只要DC中的刷不是空刷,都可以用来画对应的面状图(边线用当前笔画,内部用当前刷填充)。下面介绍的是CDC类中只能绘制面状图的其他常用成员函数:

<!--[if !supportLists]-->l <!--[endif]-->画填充矩形:用指定的刷pBrush画一个以lpRect为区域的填充矩形,无边线,填充区域包括矩形的左边界和上边界,但不包括矩形的右边界和下边界:

void FillRect( LPCRECT lpRect, CBrush* pBrush );

<!--[if !supportLists]-->l <!--[endif]-->画单色填充矩形:似FillRect,但只能填充单色,不能填充条纹和图案:

void FillSolidRect( LPCRECT lpRect, COLORREF clr );

void FillSolidRect( int x, int y, int cx, int cy, COLORREF clr );

<!--[if !supportLists]-->l <!--[endif]-->画饼图(扇形):参数含义同Arc,但将起点和终点都与外接矩形的中心相连接,形成一个扇形区域,用DC中的刷填充整个扇形区域,无另外的边线:

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

<!--[if !supportLists]-->l <!--[endif]-->画拖动的矩形:先擦除线宽为sizeLast、填充刷为pBrushLast的原矩形lpRectLast,然后再以线宽为size、填充刷为pBrush画新矩形lpRectLast。矩形的边框用灰色的点虚线画,缺省的填充刷为空刷:

void DrawDragRect( LPCRECT lpRect, SIZE size, LPCRECT lpRectLast,

SIZE sizeLast, CBrush* pBrush = NULL, CBrush* pBrushLast = NULL );

如:pDC->DrawDragRect(rect, size, rect0, size);

<!--[if !supportLists]-->l <!--[endif]-->填充区域:

<!--[if !supportLists]-->n <!--[endif]-->用当前刷从点(x, y)开始向四周填充到颜色为crColor的边界:

BOOL FloodFill(int x, int y, COLORREF crColor); // 成功返回非0

<!--[if !supportLists]-->n <!--[endif]-->用当前刷从点(x, y)开始向四周填充:

BOOL ExtFloodFill(int x, int y, COLORREF crColor,

UINT nFillType); // 成功返回非0

<!--[if !supportLists]-->u <!--[endif]-->nFillType = FLOODFILLBORDER:填充到颜色为crColor的边界(同FloodFill);(用于填充内部颜色不同但边界颜色相同的区域)

<!--[if !supportLists]-->u <!--[endif]-->nFillType = FLOODFILLSURFACE:填充所有颜色为crColor的点,直到碰到非crColor颜色的点为止。(点(x, y)的颜色也必须为crColor),(用于填充内部颜色相同但边界颜色可以不同的区域)。例如:

pDC->ExtFloodFill(point.x, point.y, pDC->GetPixel(point), FLOODFILLSURFACE);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多