VC之GDI(二)

接着练

GDI对像

Windows的GDI对象类型是通过MFC中的类来表示的,而CGdiObject正是所有GDI对象类的抽象基类,即Windows的GDI对象是通过CGdiObject派生类的C++对象来表示的。如:CBitmap、CBrush、CFont、CPallete、CPen、CRgn.......

GDI对象存储在什么地方呢?GDI对象存储在系统范围内的固定大小的对象表中,称之为对象句柄表,GDI对象表是一个固定大小的表,在win2000/NT允许最多有16384个GDI句柄。GDI对象有许多专用的例程以创建该类型的一个新的GDI对象。一旦创建完成GDI对象,GDI将返回一个GDI对象句柄,当GDI对象不用时,要用DeleteObject函数删除哦,但要确保没该对象没有处在设备上下文中,不然会导致潜在的GDI对象泄露。

HGDIOBJ SelectObject(HDC hdc,HGDIOBJ hgdiobj); // 将GDI对象和一个设备上下文相连接
BOOL DeleteObject(HGDIOBJ hgdiobj); // 删除GDI对象
DWORD GetObjectType(HGDIOBJ h); // 确定指定对象类型
int  GetObject(HGDIOBJ hgdiobj, int  cbBuffer,LPVOID lpvObject); // 将指定对象的信息写入到缓冲区

 

下面以CPen对象来练练上面的四个函数。

// SelectObject和DeleteObject用法

CPen p,
* oldPen;
p.CreatePen(PS_SOLID,
1 ,RGB( 255 , 255 , 0 ));
HDC hdc
= ::GetDC( this -> m_hWnd);
oldPen
= (CPen * )SelectObject(hdc,p.GetSafeHandle());
MoveEx(hdc,
0 , 0 ,NULL);
LineTo(hdc,
100 , 100 );
SelectObject(hdc,oldPen);
DeleteObject(p.GetSafehandle());
::ReleaseDC(
this -> m_hWnd,hdc);

 

/*
DWORD GetObjectType(HGDIOBj h);
返回值:
OBJ_BITMAP(位图Bitmap)
OBJ_BRUSH(刷子Brush)
OBJ_PAL(调色版Palette)
OBJ_PEN(画笔Pen)
OBJ_EXTPEN(扩展画笔Extended pen)
OBJ_REGION(区域 Regioin)
OBJ_DC(设备上下文 Device context)
OBJ_MEMDC(存储设备上下文Memory DC)
OBJ_METAFILE(元文件Metafile)
OBJ_METADC(元文件设备上下文Metafile DC)
OBJ_ENHMETAFILE(扩展元文件Enhanced metafile)
OBJ_ENHMATADC(扩展元文件设备上下文Enhanced metafileD C)
*/
CPen p;
p.CreatePen(PS_SOLID,
1 ,RGB( 255 , 255 , 0 ));

if (OBJ_PEN  ==  GetObjectType(p.GetSafeHandle()))
{
   MessageBox(_T(
" CPen对象 " ), " 信息 " );
}

p.DeleteObject();

你可能感兴趣的:(VC之GDI(二))