8.6 图形元素的绘制
8.6.2 画直线
利用CDC类的成员函数LineTo来完成直线的绘制工作,该函数的原型为:
BOOL LineTo( int x, int y );
BOOL LineTo( POINT point );
其中,参数x、y和point是指要画直线的终点端点坐标值。如果绘制直线成功,则该函数返回非零值;否则,返回0。
该函数的功能是从当前点为直线的起始点、以(x,y)或point为终点画一条直线。
还有一个与画线有关的CDC类的成员函数MoveTo,该函数的原型为:
CPoint MoveTo( int x, int y );
CPoint MoveTo( POINT point );
8.6 图形元素的绘制
8.6.3 画矩形
利用CDC类的成员函数Rectangle来完成矩形的绘制工作,该函数的原型为:
BOOL Rectangle( int x1, int y1, int x2, int y2 );
BOOL Rectangle( LPCRECT lpRect );
其中,参数x1、y1是要绘制的矩形左上角的坐标,x2、y2是矩形右下角的坐标。参数lpRect指定要绘制的矩形区域。
8.6 图形元素的绘制
8.6.4 画圆角矩形
利用CDC类的成员函数RoundRect来完成圆角矩形的绘制工作,该函数的原型为:
BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 );
BOOL RoundRect( LPCRECT lpRect, POINT point );
其中,参数x1、y1指定圆角矩形左上角的坐标,参数x2、y2指定圆角矩形右下角的坐标,x3表示用来画圆角的椭圆的宽度,y3表示该椭圆的高度。
8.6.5 画扇形
利用CDC类的成员函数Pie来完成扇形的绘制工作,该函数的原型为:
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 );
各参数的含义可参见圆角矩形。
8.6 图形元素的绘制
8.6.6 画多边形
利用CDC类的成员函数Polygon来完成多边形的绘制工作,该函数的原型为:
BOOL Polygon( LPPOINT lpPoints, int nCount );
其中,参数lpPoints是一个指向多边形各顶点坐标的矩阵,参数nCount表示多边形的顶点总数。
8.6.7 绘制文本
利用CDC类的成员函数TextOut可完成文字的绘制输出工作,该函数的原型为:
virtual BOOL TextOut( int x, int y, LPCTSTR lpszString, int nCount );
BOOL TextOut( int x, int y, const CString& str );
其中,参数x、y表示输出文字的起始坐标位置,lpszString或str表示要输出的文字,nCount表示输出lpszString所指出的字符串中的字符个数。
8.6 图形元素的绘制
与文字的输出有关系的CDC类的成员函数还有:
输出文字:
virtual int DrawText( LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat );
int DrawText( const CString& str, LPRECT lpRect, UINT nFormat );
设置文字输出的颜色:
virtual COLORREF SetTextColor( COLORREF crColor );
设置文字的对齐方式:
UINT SetTextAlign( UINT nFlags );
设置文字间输出的间隙 :
int SetTextCharacterExtra( int nCharExtra );
8.7 在视图中交互绘图
步骤5:对消息WM_LBUTTONDOWN进行消息映射并编写消息处理函数的代码,如下所示:
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
m_StartPoint=point;
m_OldPoint=point;
SetCapture();
m_Drag=1;
RECT Rect;
GetClientRect(&Rect);
ClientToScreen(&Rect);
::ClipCursor(&Rect);
CView::OnLButtonDown(nFlags, point);
}
8.7 在视图中交互绘图
步骤6:按步骤五的方法向OnMouseMove()函数中添加对鼠标消息WM_MOUSEMOVE的处理,代码如下:
void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
::SetCursor(m_Cursor);
if(m_Drag)
{
CClientDC mydc(this);
mydc.SetROP2(R2_NOT);
mydc.MoveTo(m_StartPoint);
mydc.LineTo(m_OldPoint);youerw.com
mydc.MoveTo(m_StartPoint);
mydc.LineTo(point);
m_OldPoint=point;
}
CView::OnMouseMove(nFlags, point);
}
8.7 在视图中交互绘图
步骤7:按步骤5的方法向OnMouseUp()函数中添加对鼠标消息WM_LBUTTONUP的处理,代码如下:
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_Drag)
{
m_Drag=0;
::ReleaseCapture();
::ClipCursor(NULL);
CClientDC thedc(this);
thedc.SetROP2(R2_NOT);
thedc.MoveTo(m_StartPoint);
thedc.LineTo(m_OldPoint);
thedc.SetROP2(R2_COPYPEN);
thedc.MoveTo(m_StartPoint);
thedc.LineTo(point);
}
CView::OnLButtonUp(nFlags, point);
}
8.7 在视图中交互绘图
步骤8:编译并运行此程序,可见,当鼠标在客户区中时,鼠标光标呈十字形状,拖动鼠标可画直线。
本章小结
本章主要介绍了以下内容:
1. 设备环境(DC)的概念及常用的的几个设备环境类如CPaintDC、CClientDC、CWindowDC和CMetaFileDC类的主要特点及它们在使用方法上的区别。
2. 绘图设备类(GDI)的概念及常用的绘图设备类如CGdiObject、CPen、CBrush、Cfont和CBitmap等的对象的创建和引入到设备环境中的方法。
3. Windows下的坐标映像方式、设备方法及几种不同的坐标映像方式下的坐标转换方法。
4. 几种常见的基本图形元素如点、直线、矩形和文字等的绘制方式及相应的CDC类的绘图函数