『VC++技术内幕』学习笔记(7)(2)
CPen newPen(PS_DASHDOTDOT,2,(COLORREF) 0); //黑色的笔宽度为2
但需要注意的是CFont和CRgn的对象建立需要先调用默认的构造函数来构造C++对象,然后再调用相应的创建函数如:
CreateFont或CreatePolygonRgn等。
CGdiObject类有一个虚拟的析构函数,它派生类的析构函数需要将与C++对象相关联的GDI对象删除掉,一定要在退出程序之前把构造的CGdiObject派生类对象干掉。因为一个没有释放的GDI对象会占用很多的内存。
让我们用一个例子跟踪一下GDI对象
//*************************************
// 例子7-2
void CMy10View::OnDraw(CDC* pDC)
{
pDC->MoveTo (10,10);
pDC->LineTo (110,10);
CPen newPen(PS_DASHDOTDOT,10,(COLORREF) 192); //红色的笔宽度为10
CPen * pOldPen=pDC->SelectObject (&newPen);
//在将新对象选进设备环境的同时返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时恢复它。
pDC->MoveTo (10,20);
pDC->LineTo (110,20);
pDC->SelectObject (pOldPen);//把原来的对象恢复
pDC->MoveTo (10,30);
pDC->LineTo (110,30);
}
屏幕上应该显示三条线,第一条和第三条一样颜色和粗细因为他们都是用的设备环境默认的CPen对象,第二条是一条用我们自己设定的CPen对象。我们可以看出在将新对象选进设备环境的同时返回指向前一次被选对象的指针。作用保存原来的对
象,以便完成任务时恢复它。
Windows还包含有一些可以利用的库存对象,它们不会被删除,因为Windows对企图删除它们的动作不予理睬。我们可以用SelectStockObject函数将它们选进设备环境。下面列出的是所有的有关刷子、笔、字体和调色板的库存对象。
//***************************************************************************
// MSDN中的内容
BLACK_BRUSH //Black brush.
DKGRAY_BRUSH //Dark gray brush.
GRAY_BRUSH //Gray brush.
HOLLOW_BRUSH //Hollow brush.
LTGRAY_BRUSH //Light gray brush.
NULL_BRUSH //Null brush.
WHITE_BRUSH //White brush.
BLACK_PEN //Black pen.
NULL_PEN //Null pen.
WHITE_PEN //White pen.
ANSI_FIXED_FONT //ANSI fixed system font.
ANSI_VAR_FONT // ANSI variable system font.
DEVICE_DEFAULT_FONT //Device-dependent font.
OEM_FIXED_FONT //OEM-dependent fixed font.
SYSTEM_FONT //The system font. By default, Windows uses the system font to draw menus, dialog-box controls, and other text. In Windows versions 3.0 and later, the system font is proportional width; earlier versions of Windows use a fixed-width system font.
SYSTEM_FIXED_FONT //The fixed-width system font used in Windows prior to version 3.0. This object is available for compatibility with earlier versions of Windows.
DEFAULT_PALETTE //Default color palette. This palette consists of the 20 static colors in the system palette.
//*******************************************************************************
一个问题:
由于SelectObject函数返回的GDI C++对象指针具有临时性,当程序的空闲处理阶段或者控制函数返回时应用程序框架会将临时的C++对象删除,我们不能简单的把这一指针保存在类的数据成员中,而应该借助GetSafeHdc函数将它转化为Windows的句柄,以便持久的保存GDI的标识。
我们将例子7-2做些改动。
//**************************************************
// 例子7-3
void CMy10View::OnDraw(CDC* pDC)
{
HPEN m_hPen; //一个指向CPen对象的指针
pDC->MoveTo (10,10);
pDC->LineTo (110,10);
CPen newPen(PS_DASHDOTDOT,10,(COLORREF) 192); //红色的笔宽度为10
CPen * pOldPen=pDC->SelectObject (&newPen); //在将新对象选进设备环境的同时返回指向前一次被选对象的指针。作用保存原来的对象,以便完成任务时恢复它。
m_hPen=(HPEN)pOldPen->GetSafeHandle ();//获得并保存原来对象的句柄
pDC->MoveTo (10,20);
pDC->LineTo (110,20);
pDC->SelectObject (CPen::FromHandle (m_hPen));//把原来的对象恢复,和例子7-2不同的是通过句柄
pDC->MoveTo (10,30);
pDC->LineTo (110,30);
}
补充一下IGDI派生类的Windows handle type列表
CPen HPEN
CBrush HBRUSH
CFont HFONT
CBitmap HBITMAP
CPalette HPALETTE
CRgn HRGN
好了我们已经对GDI有了一些了解,下一篇我们将说说颜色和字体,雷神希望大家对我的学习笔记提些建议,因为很多东西也许不必说的这么罗嗦,可我知道初学VC的痛苦,太多的东西看不明白,所以尽量写的详细。文章记录了我学习时的心得,很多东西是从MSDN查来的,不知道合不合大家(初学者)的口味。
- 上一篇:『VC++技术内幕』学习笔记(8)
- 下一篇:『VC++技术内幕』学习笔记(6)