接着练
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();