VC编程中位图在状态条中的加入探析

时间:2022-08-21 01:02:31

VC编程中位图在状态条中的加入探析

摘要:本文介绍了MFC编程的一些基本特性,通过使用CStatusBar达到位图在状态条中的加入,并且提供了相关实现方法。展示了MFC作为一个应用程序框架组合,具有灵活便利的编程特性。

关键词:MFC;状态条;位图

中图分类号:TP311.52 文献标识码:A文章编号:1007-9599 (2011) 10-0000-02

Bitmap Useing in the Status Bar for VC Programming

Liu Jiandong

(Navy 701 Factory,Beijing100015,China)

Abstract:This article describes some basic characteristics of MFC programming,through the use of bitmap CStatusBar to join in the status bar,and provides related implementation.Shows the MFC application framework as a combination of a flexible and convenient programming features.

Keywords:MFC;Status bar;Bitmap

一、前言

Microsoft Visual C++提供的MFC(微软基础类库),作为一个应用程序框架组合,它的目的就是要让编程人员使用应用程序设计向导(AppWizard)快速部署初步的应用程序框架结构,从而是用户便于通过资源编辑器来直观地设计用户使用界面、同时通过类向导(Class Wizard)向设计有关框架文件中添加设计代码,从而建立起基于Windows的应用程序[1]。MFC环境相对于SDK来说对于程序设计员显然更友好。MFC基于文档/视图为中心的混合编程模式,通过类库中封装对文档/视图结构程序驱动的支持。因此,使用MFC编写文档类型的应用程序比其他编程语言更为方便。同时在windows中,操作系统和应用程序的交互界面非常丰富,单个控件不再只提供单一功能服务[2],例如工具条不再只是程序信息文本的简单的输出窗口,它同时还可以提供其他更好的应用,本文通过实例介绍了通过Microsoft Visual C++在状态条(CStatusBar)中加入位图的方法,借此抛砖引玉,展示MFC强大的编程功能。

二、状态条(CStatusBar)介绍

状态条(CStatusBar)对象是带有一行文本输出窗格控件,或者称为“指示器”。输出窗格常被用作程序消息行和状态提示。例如:解释当前菜单命令、菜单帮助消息行等内容,作为显示NUMLOCK,SCROLL LOCK或者其它键状态[2,3]。MFC4.0之后新增加的成员函数CStatusBar::GetStatusBarCtrl,允许你利用系统(windows)通用控件对状态条的定制和其它功能的支持。CStatusBar成员函数提供了Windows通用控件的大多数功能;表1和表2分别是状态条(CStatusBar)的成员函数和属性[4]。

表1.CStatusBar类的成员函数

成员函数 说明

CStatusBar 构造一个CStatusBar对象

Create 创建状态栏,并将其与CStatusBar对象连接,并设置出示字体和条宽度

CreateEx 创建一个具有嵌入CStatusBarCtrl对象附加风格的CStatusBar对象

SetIndicators 设置指示器ID

表2CStatusBar类的属性

成员函数 说明

CommandToIndex 获取特定指示器ID的索引

GetItemID 获取给定索引值的指示器

IDGetItemRect 获取给定索引值的显示范围

GetPaneInfo 获取一个给定索引的指示器ID、风格和宽度

GetPaneStyle 获取一个给定索引的指示器风格

GetPaneText 获取一个给定索引的指示器文本

GetPaneBarCtrl 允许直接访问基础的通用控件

SetPaneStyle 设置一个给定索引的指示器风格

SetPaneText 设置一个给定索引的指示器文本

SetPaneInfo 设置一个给定索引的指示器ID、风格和宽度

三、位图在状态条中的加入的实现方法

(1)在一个AppWizard应用的状态条中加入一个新的方块,在Mainfrms.cpp中加入下列语句

//Mainfrms.cpp

static UINT indicators[]=

{

ID_INDICATOR_BITMAP,// BITMAP状态条

ID_SEPARATOR, // status line indicator

ID_INDICATOR_SCRL,

ID_INDICATOR_NUM,

ID_INDICATOR_CAPS,

};

(2)从CStatusBar派生一个新类(例如CBitmapStatusBar),并且用这个新类取代CMainFrame

中的CStatusBar(Mainfrm.h)

//Mainfrm.h

//CStatusBar m_wndStatusBar;

CBitmapStatusBar m_wndStatusBar;

(3)在新类的.h和.cpp中加入下面两个函数的声明和定义

//BitmapStatusBar.h

class CMyStatusBar : public CStatusBar {...

#if _MFC_VER < 0x400

virtual void DosPaint(CDC* psDC);

#else

virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

#endif

...}

(4)设计主体代码

//BitmapStatusBar.cpp

#if _MFC_VER < 0x400

void CBitmapStatusBar::DosPaint(CDC* psDC)

{ CRect rect;

GetItemRect(1, &rect); //得到pane的大小

psDC->ExcludeClipRect(&rect); //创建新的裁剪区域

CStatusBar::DosPaint(psDC); //描绘状态条(status bar)的其余部分

CRgn panesRgns;

panesRgns.CreateRectRgnIndirect(rect);

psDC->SelectClipRgn(&panesRgns); //选择裁剪区域

CBitmap psBitmap;

//加载位图,使用Import从文件加载资源,可以不受调色板限制

psBitmap.LoadBitmap(IDB_BITMAP1);

//将当前位图放入兼容CDC

CDC SourcesDC;

SourcesDC.CreateCompatibleDC(NULL);//生成兼容的CDC

CBitmap* pOldBitmap = SourcesDC.SelectObject(&psBitmap);//选择位图

psDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),

&SourcesDC, 0, 0, SRCCOPY);//BitBlt

SourcesDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图

psBitmap.DeleteObject();//删除位图 }

#else

void CBitmapStatusBar::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

{ switch(lpDrawItemStruct->itemID)

{ case 1:

//从资源中选择位图

CBitmap psBitmap;

//加载位图,使用Import从文件加载资源,可以不受调色板限制

psBitmap.LoadBitmap(IDB_BITMAP1);

//将状态条(StatusBar)附加到一个CDC对象

CDC dc,SourcesDC;

dc.Attach(lpDrawItemStruct->hDC);

//得到pane的大小和坐标

CRect rect(&lpDrawItemStruct->rcItem);

//将当前位图放入兼容CDC

SourcesDC.CreateCompatibleDC(NULL);//生成兼容的CDC

CBitmap* pOldBitmap = SourcesDC.SelectObject(&psBitmap);//选择位图

dc.BitBlt(rect].left, rect.top, rect.Width(), rect.Height(),

&SourcesDC, 0, 0, SRCCOPY);//BitBlt

SourcesDC.SelectObject(pOldBitmap);//删除CDC中所选择的位图

psBitmap.DeleteObject();//删除位图

//将状态条(StatusBar)与CDC对象分离,否则hDC将会在CDC废弃时被删除

dc.Detach();

return;}

CStatusBar::DrawItem(lpDrawItemStruct);

} #endif

在Mainfrm.cpp的CMainFrame::OnCreate()中加入下面的代码

//Mainfrm.cpp

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){...

if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))){

TRACE0("Failed to create status bar\n");

return -1;// fail to create

}

//加入下列代码

#if _MFC_VER >= 0x400

UINT nID, nStyle;

int cxWidth;

m_wndStatusBar.GetPaneInfo(1, nID, nStyle, cxWidth);

m_wndStatusBar.SetPaneInfo(1, nID, nStyle | SBT_OWNERDRAW, cxWidth);

#endif

...}

四、小结

本文通过实例介绍了通过Microsoft Visual C++在状态条(CStatusBar)中加入位图的方法,尽管功能实现上较为单一,但是通过CStatusBar的一些其他函数和属性可以实现更多的功能,在此也体现了Visual C++编程的灵活性,并且MFC的加入大大减小了编程的门槛。

参考文献:

[1]李蓬,崔宝江.基于C/C++代码的静态分析工具的比较研究[Z].中国广西南宁,2010

[2]吴军高,桂志国.Visual C++中利用状态条实现坐标提示的几种方法[J].山西电子技术,1999,6:12-15

[3]张廷,魏殿杰,李晓明.基于Visual C++6.0和Matlab6.0的电气开关状态检测和故障诊断的程序设计[J].测控技术,2004,9:76-78

[4]郑义,胡天健.基于Visual C++ 6.0和ANSYS 9.0的二维稳态导热肋板的数值分析[J].机械,2008,10:37-40

上一篇:全球金融危机对我国酒店业的冲击及对策研究 下一篇:当前完善我国政府投资项目代建制的对策探讨