现在的位置: 首页 > 综合 > 正文

利用GDI绘图

2013年07月19日 ⁄ 综合 ⁄ 共 2598字 ⁄ 字号 评论关闭

所有的绘图操作包括如下几种:利用API、用CDC对象、用CClientDC对象、用CWindowDC对象和CPaintDC;下面分别说明:
利用API来进行绘图操作,首先需要一个设备描述表(DC)句柄HDC,然后才能进行绘图操作,在绘图结束的时候要释放DC,基本操作如下:
HDC hdc=::GetDC(m_hWnd);//GetDC()需要一个指向窗体的句柄作为参数,也就是获得哪个窗体的DC
//下面进行绘图操作,画一条直线
MoveToEx(hdc,0,0,NULL);
LineTo(hdc,100,100);
//释放DC
::ReleaseDC(m_hWnd,hdc);//在这里需要使用全局函数标识符,不然编译会认为是调用了窗体对象的releaseDC()成员函数,从而产生错误
CDC:是其他设备描述表的基类。在这里可以进行所有的操作。CDC在一般情况下需要用当前窗口的CWnd::GetDC()函数进行初始化,即:
CDC *pDC=GetDC();//在任何一个窗口类中均可用该函数来初始化一个CDC类
在该类中,直接可以进行图形的绘制操作
pDC->MoveTo(CPoint(0,0));//如果没有这一句,仍可以画出直线,它将缺省以(0,0)点作为起始点
pDC->LineTo(CPoint(100,100));//如果要连续画直线,则缺省地将终止点作为第二条直线的起始点
pDC->LineTo(CPoint(200,300));//这样的操作也是可行的。
在该操作完成后,需要释放DC:
ReleaseDC(pDC);
CClientDC:作为CDC的一个子类,在构造函数中封装了GetDC()这个函数,因此,只需传递一个窗口对象指针即可,即:
CClientDC dc(this);//获得当前窗口的DC
在CClientDC的析构函数中,封装了ReleaseDC()这个函数,因此,不需要再对其进行释放,
其他的操作跟CDC相同,但它仅在窗口的客户区的范围内有效。
CWindowDC:指向整个窗口的DC,包括了客户区和非客户区(菜单栏等)。作为CDC的一个子类,在构造函数中封装了GetDC()这个函数,因此,只需传递一个窗口对象指针即可,即:
CWindowDC dc(this);//获得当前窗口的DC
如果要在桌面上进行操作,可以用指向指点的指针来获得桌面的上下文描述表,即:
CWindowDC dc(GetDeskTopWindow());
在CWindowDC的析构函数中,封装了ReleaseDC()这个函数,因此,不需要再对其进行释放,
其他的操作跟CDC相同,但它仅在窗口的客户区的范围内有效。
CPaintDC:主要是对打印输出进行操作,以后再补充
除了上述利用DC进行基本操作外,在大多数情况下,我们可能需要对绘制的图形添加不同的属性,如字体、颜色、线型、填充性等。这样就要利用到一些GDI对象进行操作了。下面简单说明:
1、CPen类,设置画笔的颜色,线型,线宽等
CPen pen(PS_SOLID,1,RGB(255,0,0));//利用CPen的构造函数,我们可以直接初始化一个对象,第一个参数表示线型,第二个参数为线宽,第三个参数为颜色,其中第三个参数为COLORREF类型,可以用宏RGB来构造。RGB(0,0,0)显示为黑色,RGB(255,0,0)显示为红色,RGB(0,255,0)显示为绿色,RGB(0,0,255)显示了蓝色,RGB(255,255,255)显示为白色。
在画线或者画其他几何形状时,需要将其选入到设备描述表中(下面所有GDI对象也需要进行相同的操作),即:
CClientDC dc(this);
CPen *oldPen=dc.SelectObject(&pen);//返回设备描述表中原来的笔类型,等进行操作完后将其选回设备描述表
……
dc.SelectObject(oldPen);//恢复原来的设置
2、CBrush类,设置画刷的填充类型、颜色或者位图.初始化CBrush的对象有多种方法:
(1)、如果在声明时不使用构造函数进行初始化,就必须使用下面的初始化函数:
BOOL CreateSolidBrush( COLORREF crColor );//该函数创建一个SOLID(在此理解为全色)的画刷,如果crColor为RGB(255,0,0),就创建一个红色全部填充的画刷。
BOOL CreateHatchBrush( int nIndex, COLORREF crColor );//创建不同填充样式的画刷,其中nindex指定不同的样式的填充,如HS_CROSS,十字形的填充样式;HS_DIAGCROSS ,45度画刷等等。
BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush );//间接地创建一个画刷,lpLogBrush 指向一个LOGBRUSH指针。在该方式中,可以指定填充样式,颜色
BOOL CreateSysColorBrush( int nIndex );//创建一个系统颜色的画刷,同样也可以指定填充样式
(2)、用构造函数来初始化一个画刷,也有与用初始化函数相对应的几种方式。
CBrush( COLORREF crColor );//与CreateSolidBrush()相同,也需要指定一种颜色来填充画刷。
CBrush( int nIndex, COLORREF crColor );//与CreateHatchBrush()相同,可同里指定画刷颜色与填充样式。
CBrush( CBitmap* pBitmap );//通过位图来填充画刷。不过在进行填充的时候,需要装载(load)一个位图到内存中。操作方式如下:
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BIT_NEW);
CBrush brush(&bitmap);
(3)、此外,我们要想在画矩形、圆等图形的时候不要填充,也就是当一个图形被另一个图形覆盖地情况下仍能看到下面图形有边框。则pDC要选入一个空画刷,即:
CDC *pDC=GetDC();
pDC->SelectStockObject(NULL_BRUSH);

要将这些对象选入到DC对象中,可以用selectobject()来进行。对于系统已经存在的对象,还要可以用SelectStockObject()来操作。

 

抱歉!评论已关闭.