一、基本结构类型
1、点CPoint( );
CPoint( int initX, int initY );
CPoint( POINT initPt );
CPoint( SIZE initSize );
CPoint( LPARAM dwPoint ); // 低字设为x、高字设为y
2、矩形CRect( );
CRect( int l, int t, int r, int b );
CRect( const RECT& srcRect );
CRect( LPCRECT lpSrcRect );
CRect( POINT point, SIZE size );
CRect( POINT topLeft, POINT bottomRight );
3、尺寸大小CSize( );
CSize( int initCX, int initCY );
CSize( SIZE initSize );
CSize( POINT initPt );
CSize( DWORD dwSize ); // 低字设为cx、高字设为cy
二、获取客户区和DC
1、CDC、CClientDC、CPaintDC三者的关系:
CDC:是Windows绘图设备的基类。 CClientDC:可用在任何地方。构造函数中封装了GetDC(),析构函数中封装了ReleaseDC()函数。 CPaintDC:只用于重绘消息(WM_PAINT),构造函数中调用BeginPaint()取得设备上下文,析构函数中调用EndPaint()释放设备上下文,负责从消息队列中清除WM_PAINT消息,防止窗口不断重绘。 |
2、控件重绘
void Timeline::OnPaint() { CPaintDC dc(this);//获取绘图DC CRect rc; GetClientRect(&rc);// 获取客户端区域矩形 InvalidateRect(rc);// 使得客户区矩形区域失效
//通过dc进行绘图操作
UpdateWindow();//要求更新客户区矩形区域 CWnd::OnPaint(); }
要更新UI窗口,有两种方法:
2、直接调用RedrawWindow更新窗口UI 。 |
三、绘图相关
1、颜色
COLORREF RGB( BYTE bRed, BYTE bGreen, BYTE bBlue ); 例如: COLORREF red, gray; red = RGB(255, 0, 0); gray = RGB(128, 128,128); |
2、画笔,线状图必须用笔(pen)来画,所以线的颜色就由笔色来确定。
CPen() CPen( int nPenStyle, int nWidth, COLORREF crColor ); nPenStyle: PS_SOLID, // 实心线 PS_DASH, // 线段 PS_DOT, // 点 PS_DASHDOT, // 线段、点 PSDASHDOTDOT // 线段、点、点 |
3、画刷, 面状图必须用刷(brush)来填充,所以面色是由刷色来确定的。
CBrush( ); CBrush( COLORREF crColor ); CBrush( int nIndex, COLORREF crColor ); nIndex: HS_HORIZONTAL //水平线 HS_VERTICAL //垂直线 HS_FDIAGONAL //正斜线 HS_BDIAGONAL //反斜线 HS_CROSS //十字线(正网格) HS_DIAGCROSS //斜十字线(斜网格) |
4、字体,绘图时如果需要绘制文字,可以使用想要的文字风格
CFont font; BOOL CFont::CreateFont( int nHeight, //字体高度(逻辑单位) int nWidth, //字体平均宽度(逻辑单位) int nEscapement, //字体倾斜角度 int nOrientation, //字体倾斜角度 int nWeight, //字体磅数 BYTE bItalic, //是否斜体 BYTE bUnderline, //是否带下划线 BYTE cStrikeOut, //是否带删除线 BYTE nCharSet, //字体的字符集 BYTE nOutPrecision, //输出精度 BYTE nClipPrecision, //裁剪精度 BYTE nQuality, //字体的输出质量 BYTE nPitchAndFamily, //字体间距和字体族 LPCTSTR lpszFacename //字体的字样名 ); 例如: CFont font; font.CreateFontW( 56, //字体高度 26, //字体宽度 900, //旋转显示(默认0):900表示逆时针旋转90度 0, //字体倾斜角度 10, //字体磅数 FALSE, //非斜体 FALSE, //无下划线 FALSE, //无删除线 DEFAULT_CHARSET, //使用缺省字符集 OUT_DEFAULT_PRECIS, //缺省输出精度 CLIP_DEFAULT_PRECIS,//缺省裁减精度 DEFAULT_QUALITY, //字体的输出质量 DEFAULT_PITCH, //字体间距和字体族 L"@system"); //字体的字样名 dc.SelectObject(font);//设置字体 |
5、DC绘图操作
我们要使用DC进行绘图,需要先设置好相应的画笔、画刷、字体信息。
设置画笔、画刷、字体。
CPen* SelectObject( CPen* pPen ); // 设置画笔 CBrush* SelectObject( CBrush* pBrush );// 设置画刷 CFont* SelectObject( CFont* pFont );// 设置字体 CBitmap* SelectObject( CBitmap* pBitmap );// 设置位图
CPen* GetCurrentPen( ) const; // 获取画笔信息 CBrush* GetCurrentBrush( ) const; // 获取画刷信息 CFont* GetCurrentFont( ) const; // 获取字体信息 CBitmap* GetCurrentBitmap( ) const; // 获取位图信息 CPalette* GetCurrentPalette( ) const; // 获取调色板信息
//获取、设置文字颜色 COLORREF GetTextColor( ) const; COLORREF SetTextColor( COLORREF crColor ); //获取、设置文字背景色 COLORREF GetBkColor( ) const; COLORREF SetBkColor( COLORREF crColor ); //设置背景模式 int GetBkMode( ) const; // 返回当前背景模式 int SetBkMode( int nBkMode ); // 返回先前背景模式 OPAQUE:不透明的(缺省值),空隙用背景色填充 TRANSPARENT:透明的,空隙处保持原背景图不变 |
画点:dc.SetPixel(int x, int y, COLORREF crColor);
画线:dc.MoveTo( int x, int y ); //将dc移动到指定位置
dc.LineTo( int x, int y ); //从指定位置画到现在位置
画折线:dc.Polyline( LPPOINT lpPoints, // 点集合
int nCount );// 点的数量
画矩形 (填充内部):dc.Rectangle( int leftTopX, int leftTopY, // 左上角
int rightBottomX, int rightBottomY); // 右下角
画圆角矩形 (填充内部):dc.RoundRect( int leftTopX, int leftTopY, // 左上角
int rightBottomX, int rightBottomY, //右下角
int nWidth, int nHeight); // 椭圆的宽和高
画圆形(填充内部):dc.Ellipse( int leftTopX, int leftTopY, // 左上角
int rightBottomX, int rightBottomY); //右下角矩形
画弧线:dc.Arc( int leftTopX, int leftTopY, // 左上角
int rightBottomX, int rightBottomY, // 右下角
int StartX, int StartY, // 弧的起点
int EndX, int EndY ); // 弧的终点(Arc 画圆弧是按逆时针方向.)
画直线到弧线:dc.AngleArc(int x, int y, // 圆心
int nRadius, // 半径
float fStartAngle, // 起始角度(默认指向x轴正向)
float fSweepAngle); // 扫描角度
画弧线(闭合):dc.Chord( int leftTopX, int leftTopY, // 左上角
int rightBottomX, int rightBottomY, // 右下角
int StartX, int StartY, // 弧的起点
int EndX, int EndY); // 弧的终点
画饼状图:BOOL Pie( int leftTopX, int leftTopY, //左上角
int rightBottomX, int rightBottomY, //右下角
int StartX, int StartY, // 起始点
int EndX, int EndY); // 结束点
填充矩形:dc.FillRect( LPCRECT lpRect, CBrush* pBrush )
dc.FillSolidRect( LPCRECT lpRect, COLORREF clr );
dc.FillSolidRect( int x, int y, int cx, int cy, COLORREF clr );