按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
中调用它的成员函数完成绘图操作。
使用完毕后应该及时删除构造的 CDC 对象。Windows 限制了可使用的设备上下文的数
量,如果删除一个设备上下文对象失败,将会占用一小部分内存,直到程序退出。要确保设
备上下文对象被删除,最容易的方法是在堆栈上构造对象。
也可通过 CWnd::GetDC() 成员函数来获得设备上下文指针,这种情况下必须调用
ReleaseDC 函数来释放设备环境。
7。3。2 GDI 对象
Windows 的 GDI 对象都是从基类 CGdiObject 派生而来。可以通过调用 GDI 派生类的构
造函数来创建 GDI 对象。GDI 对象如下:
o CBitmap ;
o CBrush ;
o CPen ;
o CFont ;
o CRgn ;
o CPalette 。
·166 ·
…………………………………………………………Page 176……………………………………………………………
第 7 章 图形图像
7。4 画笔和画刷
画笔(CPen )和画刷(CBrush )是最常用的两个 GDI 对象。本节通过两个实例,详细
介绍这两个对象的使用方法。
7。4。1 画笔
实例 7…1 :画笔使用实例实例。源代码在光盘中“07实例 7…1CpuUsage ”目录下。
1.创建程序
下面通过动态显示 CPU 的使用记录的例子介绍画笔的使用方法。利用 Visual C++ 的
AppWizard 创建一个基于对话框的应用程序 CpuUsage,为对话框添加一个静态文本框控件和
一个 group box 控件。为对话框类 CCpuUsageDlg 添加成员变量,如表 7…1 所示。
表 7…1 CCpuUsageDlg 的成员变量表
成员变量 类型 作用
m_btnView CButton 显示区域
m_strCpuUsage CString 显示字符串
m_UsageHistory int'' CPU 使用记录
m_timer int 计时器
m_Usage CCpuUsage 测试 Cpu 使用率类
2 .编写代码
(1)初始化对话框
修改 CCpuUsageDlg 的成员函数 OnInitDialog,对变量做初始化。代码如下:
BOOL CCpuUsageDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add 〃About。。。〃 menu item to system menu。
// IDM_ABOUTBOX must be in the system mand range。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX 《 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
·167 ·
…………………………………………………………Page 177……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
strAboutMenu。LoadString(IDS_ABOUTBOX);
if (!strAboutMenu。IsEmpty())
{
pSysMenu…》AppendMenu(MF_SEPARATOR);
pSysMenu…》AppendMenu(MF_STRING; IDM_ABOUTBOX; strAboutMenu);
}
}
// Set the icon for this dialog。 The framework does this automatically
// when the application’s main window is not a dialog
// 设置窗口总在最前
::SetWindowPos(this…》GetSafeHwnd(); CWnd::wndTopMost; 0; 0; 0; 0; SWP_NOSIZE);
SetIcon(m_hIcon; TRUE); // Set big icon
SetIcon(m_hIcon; FALSE); // Set small icon
// 初始化使用记录数组
memset(m_UsageHistory; 0; MAXTIMES*sizeof(int));
// 设置定时器
m_timer = SetTimer(1; 500; 0);
return TRUE; // return TRUE unless you set the focus to a control
}
利用 API 函数 SetTimer 启动定时器,函数原型如下:
UINT SetTimer( UINT nIDEvent; UINT nElapse; void (CALLBACK EXPORT* lpfnTimer)(HWND; UINT;
UINT; DWORD) );
o nIDEvent :非 0 定时器标志;
o nElapse :时间间隔;
o lpfnTimer :处理函数。
当起动定时器后,每间隔 nElapse 时间间隔,系统就会给应用程序发送 WM_TIMER 消
息,通常应用程序在 OnTimer 中响应这个消息。当程序退出时,需要调用 KillTimer 删除定
时器,释放系统资源,它的函数原型如下:
BOOL KillTimer( int nIDEvent );
o nIDEvent :调用 SetTimer 的返回值。
(2 )响应 OnTimer 消息
在初始化过程中,设置的时间间隔为 500 毫秒。即每隔 500 毫秒,测试一次 CPU 的使用
率。响应 OnTimer 消息,代码如下:
·168 ·
…………………………………………………………Page 178……………………………………………………………
第 7 章 图形图像
void CCpuUsageDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
int per;
// 得到当前 CPU 的使用率
per = m_Usage。GetCpuUsage();
// 计数
if(times 《 MAXTIMES)
times ++;
// 更新 CPU 使用记录数组
for(int i=0; iSelectObject(&newbrush);
pDC…》Rectangle(rect);
newbrush。DeleteObject();
pDC…》SelectObject(oldbrush);
// 绿色画笔; 绘制曲线
curpen。CreatePen(PS_SOLID; 2; RGB(0; 255; 0));
oldpen = pDC…》SelectObject(&curpen);
pDC…》MoveTo(rect。left; rect。bottom);
// 用线段近似曲线
for(int i=0; iLineTo(x; y);