8.2简单图形的绘制 822创建画刷 画刷用于指定填充的特性,许多窗口、控件以及其他区域都需要用画刷进行填充绘制, 它比画笔的内容更加丰富。 画刷的属性通常包括填充色、填充图案和填充样式三种 CBrush类根据画刷属性提供了相应的创建函数,例如创建填充色画刷和填充样式画刷的函数 为 Create SolidBrush和 Create Hatch Brush,它们的原型如下: BOOL Create SolidBrush( COlORREF crColor ) ∥创建填充色画刷 BOOL CreateHatchBrush( int nIndex, COLORRef crColor);∥创建填充样式画刷 与画笔相类似,也有一个 LOGBRUSH逻辑结构用于画刷属性的定义,并通过 CBrush的成员 函数 Create BrushIndirect来创建,其原型如下: BOOL Create BrushIndirect( const LOGBRUSH* ipLog Brush 其中, LOGBRUSH逻辑结构如下定义: typedef struct tagLOGBRUSH //Ib UINT InStyle ∥风格 COLORREF lbColor; ∥填充色 LONG baTch ∥填充样式 1 LOGBRUSH;
8.2 简单图形的绘制 8.2.2 创建画刷 画刷用于指定填充的特性,许多窗口、控件以及其他区域都需要用画刷进行填充绘制, 它比画笔的内容更加丰富。 画刷的属性通常包括填充色、填充图案和填充样式三种。 CBrush类根据画刷属性提供了相应的创建函数,例如创建填充色画刷和填充样式画刷的函数 为CreateSolidBrush和CreateHatchBrush,它们的原型如下: BOOL CreateSolidBrush( COLORREF crColor ); // 创建填充色画刷 BOOL CreateHatchBrush( int nIndex, COLORREF crColor ); // 创建填充样式画刷 与画笔相类似,也有一个LOGBRUSH 逻辑结构用于画刷属性的定义,并通过CBrush的成员 函数CreateBrushIndirect来创建,其原型如下: BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush ); 其中,LOGBRUSH 逻辑结构如下定义: typedef struct tagLOGBRUSH { // lb UINT lbStyle; // 风格 COLORREF lbColor; // 填充色 LONG lbHatch; // 填充样式 } LOGBRUSH;
8.2简单图形的绘制 另外,还需注意 画刷的创建工作也可在其构造函数中进行,它具有下列原型 CBrush( colorref crColor ) CBrush( int nIndex, colorreF crColor CBrush( cBitmap" bItmap ) 画刷也可用位图来指定其填充图案,但该位图应该是8×8像素,若位图太大, Windows 则只使用其左上角的8行8列的像素。 画刷仅对绘图函数 Chord、 Ellipse、 Fillrect、 FrameRect、 InvertRect、Pie、 Polygon、 PolyPolygon、 Rectangle、 Roundrect有效。 例ExGD绘制简单图形,其结果如右图所示 创建的单文档应用程序为 EX GDI,将代码添加 在 CEX GDIView: Ondraw中,则有 void CEx GDIView: OnDraw(CDC* pDC) CEx GDIDoc* pDoc = GetDocumentO ASSERT VALID(PDoc) int data[20]={19,21,32,40,41,39,42,35, 33,23,21,20,24,11,9,19,22,32,40,42} CRect 图83KGI记行蛙異 GetClient Rect(rc)∥/获得客户区的大小
8.2 简单图形的绘制 另外,还需注意: n 画刷的创建工作也可在其构造函数中进行,它具有下列原型: CBrush( COLORREF crColor ); CBrush( int nIndex, COLORREF crColor ); CBrush( CBitmap* pBitmap ); n 画刷也可用位图来指定其填充图案,但该位图应该是8×8像素,若位图太大,Windows 则只使用其左上角的8行8列的像素。 n 画刷仅对绘图函数Chord、Ellipse、FillRect、FrameRect、InvertRect、Pie、Polygon、 PolyPolygon、Rectangle、RoundRect有效。 [例Ex_GDI] 绘制简单图形,其结果如右图所示。 创建的单文档应用程序为Ex_GDI,将代码添加 在CEx_GDIView::OnDraw中,则有: void CEx_GDIView::OnDraw(CDC* pDC) { CEx_GDIDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int data[20] = {19,21,32,40,41,39,42,35, 33,23,21,20,24,11,9,19,22,32,40,42}; CRect rc; GetClientRect(rc);// 获得客户区的大小
8.2简单图形的绘制 rc. DeflateRect(50, 50) ∥将矩形大小沿x和y方向各减小50 Int gridXnums =10, gridYnums =8 dx=rc Width/grid Xnums Int dy =rc Height(/grid nums CRect gridRect(rc left, rc. top, rcleft+dx* grid Xnums, rc. top+dy* grid nums);,∥调整矩形大小 CPen gridPen(0,0, RGB(0, 100, 200)) CPen* oldEn= pDC->Selectobject( &gridPen) for (int i=0; i<=gridXnums; 1++) ∥绘制垂直线 DC-> Move To(gridRect left+i*dx, gridRect bottom) DC->Line To(gridRect left+i*dx, gridRect top) for(int j=0; j<=gridY nums; j++) ∥绘制水平线 pDC->Move To(gridRect. left, gridRect top+j*dy) DC->Line To(grid Rect. right, gridRect top+j*dy) DC->SelectObject(oldEn) ∥恢复原来画笔 gridPen. Detach();∥将画笔对象与其构造的内容分离,以便能再次构造画笔 ridPen. Create Pen(, 0, RGB(0,0, 200)) ∥重新创建画笔
8.2 简单图形的绘制 rc.DeflateRect(50,50); // 将矩形大小沿x和y方向各减小50 int gridXnums = 10, gridYnums = 8; int dx = rc.Width()/gridXnums; int dy = rc.Height()/gridYnums; CRect gridRect(rc.left,rc.top,rc.left+dx*gridXnums,rc.top+dy*gridYnums); // 调整矩形大小 CPen gridPen(0,0,RGB(0,100,200)); CPen* oldPen = pDC->SelectObject(&gridPen); for (int i=0; i<=gridXnums; i++) // 绘制垂直线 { pDC->MoveTo(gridRect.left+i*dx,gridRect.bottom); pDC->LineTo(gridRect.left+i*dx,gridRect.top); } for (int j=0; j<=gridYnums; j++) // 绘制水平线 { pDC->MoveTo(gridRect.left,gridRect.top+j*dy); pDC->LineTo(gridRect.right,gridRect.top+j*dy); } pDC->SelectObject(oldPen); // 恢复原来画笔 gridPen.Detach(); // 将画笔对象与其构造的内容分离,以便能再次构造画笔 gridPen.CreatePen(0,0,RGB(0,0,200)); // 重新创建画笔