为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

在VC对话框应用程序窗口添加状态栏的方法

2011-03-24 3页 pdf 205KB 42阅读

用户头像

is_550746

暂无简介

举报
在VC对话框应用程序窗口添加状态栏的方法 ⋯ ‘ ’ ’ ‘ ‘ ’ ‘ ‘ ‘ I_ 。 ‘ ⋯ ’ ’ ‘ 实用第一 智慧密集 ⋯ ⋯ 。 一 ⋯ 一 . , . ⋯ . . ⋯ . 一 ⋯ ⋯ ⋯ ⋯ . ⋯ . 在 VC对话框应用程序窗口添加状态栏的方法 。 车竞宏 囊 摘 要 :VC的应用程序向导不在对话框类型的应用程序主窗 口中自动添加状态栏 。但程序 员 可以通过编码来为对话框类型的应用程序主窗口添加状态栏。在此介绍两种具体的实现方法: 即使用 MFC类库 中提供的 CStatusBar类实现的方法和使用Win32...
在VC对话框应用程序窗口添加状态栏的方法
⋯ ‘ ’ ’ ‘ ‘ ’ ‘ ‘ ‘ I_ 。 ‘ ⋯ ’ ’ ‘ 实用第一 智慧密集 ⋯ ⋯ 。 一 ⋯ 一 . , . ⋯ . . ⋯ . 一 ⋯ ⋯ ⋯ ⋯ . ⋯ . 在 VC对话框应用程序窗口添加状态栏的方法 。 车竞宏 囊 摘 要 :VC的应用程序向导不在对话框类型的应用程序主窗 口中自动添加状态栏 。但程序 员 可以通过编码来为对话框类型的应用程序主窗口添加状态栏。在此介绍两种具体的实现方法: 即使用 MFC类库 中提供的 CStatusBar类实现的方法和使用Win32 API函数 实现的方法。 关键词 :VC;对话框 ;状 态栏 ;Win32API;CStatusBar类 1 问题的提出 Visual C++提供 的 MFC (微 软基础类 库 ),实际 上是一个 应用程序框架 ,它的 目的就是要让程序员通过应用程序向导 (AppWizard)快速生成初步的应用程序框架文件,然后通过资 源编辑器来直观地设计 用户界面 、通过类 向导 (ClassWizard) 向有关框架文件中添加代码 ,从 而建立起 Windows下的应用程 序。这种编程环境相对于 SDK来说显然方便了许多。 MFC提 出了以文档/视图为中心的编程模式 .在它 的类 库 中封装了对文档/视图结构程序全面的支持。因此,使用 MFC 编写单文档或多文档类 型的应用程序是非常方便的。 但是,MFC提供对话框类型的应用程序开发环境却不那 么 令 人 满 意 . 尤 其 是 对 于 使 用 过 Visual Basic、Delphi、 PowerBuilder等 开发工具 的程序 员 ,感觉 会更 不好 。因为 VC 对话框类型的应用程序的窗口界面过于简单和单调,比如没有 菜单.没有工具栏,没有状态栏等。虽然菜单可以通过修改对 话框属性来轻松加人 ,但 工具栏和状态栏却 不能象 VB、 Delphi等开发工具那样使用控件在可是的环境中建立 ,因为 VC所提供 的 Windows控件没有工具栏和状态栏 。 那么.怎样才能在对话框类型的应用程序 窗El中加入状态 栏 呢?现在将介绍两种实现方法 。 2 实现方法 在对话框类型的应用程序窗口中加入状态栏有两种方法, 一 种方法是使用 MFC提供的状态栏类 (CStatusBar)建 立 ;另 一 种方法是使用有关 的 Win32 API函数建立 。 2.1 使用 CStatusBar类建立状态栏 对于单文档和多文档类型的应用程序 ,应用程序 向导会为 应用程序自动创建一个状态栏。但应用程序向导并不为对话框 类型 的应用程序创建状 态栏 。如果需要在窗 El中建立状态栏 , 程序员必须通过编程来实现 。 使用 MFC中提供 的状态栏类 (CStatusBar)来为对话框窗 与 l皇L■囊藿技 与t妒’_.—瞄 口创建一个状态栏需要以下几个步骤 (为了讲述方便.假设我 们的对话框类应用程序工程为 TStatusBar): 2_1.1建立 CStatusBar类 的对象 m_StatusBar 为对话框类 CTStatusBarDlg增加一个 CStatusBar类 的对象 成 员 in—StatusBar。 即 在 CTStatusBarDlg 类 定 义 (在 TStatusBarDlg.h文件 中)的 protected段 中增加一个语句 : CStatusBar m _ StatusBar; 2.1_2定义描述状态栏 的静态数组 状态栏实际上是个窗E1.一般分为若干个窗格 .每个窗格 显示不 同的信息 。状态栏窗格的划分情况 由一个 UNIT型 的数 组 来描述 。该数 组的定义代码 可以放在 CTStatusBarDlg.cpp文 件 开始处的编译伪指令之后。具体代码如下 : static UINT iStatB[】= { lD SEPARATOR. //第一窗格 ,预 留,以备应用程序显示有关信息 ID—INDIC OR_CAPS //第二窗格,显示 Capt Lock键的状态 ID — INDICATOR,NUM, ∥第三窗格 ,显示 Num Lock键的状态 lD 1NDIC r0R SCRL, //第四窗格 ,显示 Scroll Lock键 的状态 ): 该数组中的元素个的数就是状态栏 中窗格的个数 ,即每一 个 常量示一个窗格 ,其 中 ID_SEPARATOR (也可以有多个 ) 窗格显示 的信息 以后 由程序填人 (系统不会 自动填人 ), ID — INDICATOR _ CAPS、ID _ INDICATOR — NUM 和 ID—INDICATO R — SCRL等窗格显示的信息,对于单文档或多文档类型的程 序.系统会根据当时的有关键的状态自动填人相应的信息,但 对于对话框类型的应用程序。系统并不 自动填人相关信息,也 需要在程序 中通过代码来填写相关信息。 2.1.3创建状态栏对象并 显示于对话框窗口 完成 了前 两步准备 工作之后 现在可 以创建并 显示状 态栏 ⋯ ⋯ PR0矗矗硼 U啊G哪 E⋯⋯⋯⋯ ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯· ⋯⋯⋯⋯⋯⋯⋯⋯ ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯ 一 了.这些工作应该在对话框窗 13的初始化事件中完成 。代码放 在 CTStatusBarDlg::OnlnitDialog 0 函数定义 (CTStatusBarDlg. cpP文件)的尾部 (即最后一条语句 return TRUE;之前)。具体 代码如下 : ,/创建状态栏并划分窗格 If(!m_StatusBar.Create(this)ll !m StatusBar.Setlndicators 《iStatB,sizeof(iStatB)/ sizeof(UINT))) ( MessageBox(‘创建状态栏或划分窗格时出错 } ): return一1: l //安装状态栏 : //获取主窗口(即对话框窗口)的大小信息 RECT Rect; this一>GetWlndowRect(&Rect); //计算状态栏的大小(cx,cy)与安装位置(x,y) int x,y,CX.cy; ‘ cx=Rect.right-Rect。left一1 O: cy=20; ×=O: y=Rect.bottom—Rect.top—cy一35; ∥安装并显示状态栏 m — StatusBar.SetWindowPos (&wndTop,X,Y,CX,cy. SWP SHOv、M/INDOW): ∥在状态栏的有关窗格中显示信息 m — — StatusBar.SetPaneStyle(O,SBPS . STRETCH); m — StatusBar.SetPaneText(O.。状态栏建立完毕 .true): 2.1.4在对话框窗口的OnSize事件中重新定位状态栏 至此,状态栏 已经建立完毕 ,以后就可 以使用状态栏类 的 SetPaneText成员函数向指定 的窗格中填写想要显示的信息 了。 但是 ,如果对话框窗口的边框风格被设置为可以改变大小 的,则当窗 口的大小改变时 ,发现状态栏的位置和大小并不会 随着窗口的变化而变化。为了解决这个 问题 .可以在对话框窗 口的OnSize事件中使用 Win32 API函数 SetWindowPos来重新 定位与显示状态栏 : ::SetWindowPos(m—StatusBar,HWNDJOP,0,cy 一20,CX,20, swp SH0WWINDOW); 注意:状态栏类也有名为 SetWindowPos的成员函数,但 不知为什么 ,在 OnSize事件使用时运行 时会 出错 .所 以此处 改用 Win32 API函数 SetWindowP0s 2.2 使用 Win32 API函数建立状态栏 使用 Win32 API函数来为对话框窗 121创建状态栏的步骤如 下 (为了讲述方便 ,我们还假设对话框类应用程序工程为 TStatusBar): 2_2.1为 CTStatusBarDlg类增加数据成员 因为使用Win32 API函数来为对话框窗口创建状态栏时, 需要用到对话框窗 13的句柄和状态栏 (也是一种窗 口,因为它 是窗口类的子类)的句柄,所以为了程序中使用方便,可以将 它们作为 CTStatusBarDlg类 的数 据成员 添加 到 CTStatusBarDlg 类 的定义 中。即在 CTStatusBarDlg类 定义 (在 TStatusBarDlg.h 文件 中)的 protected段中增加两个语句: HWND hDIg; ,/用于保存对话框窗口句柄 HWND hStatusBar;//用于保存状态栏窗口句柄 2.2.2新建一个对话框资源 使用 Win32 API函数来创建状态栏时需要一个对话框 (Dialog)资源,为此可以使用资源编辑器新建一个对话框资 源.假设其ID为IDD_STATUS(其他属性均为默认设置)。 2.2.3创建状态栏并让其显示于对话框窗口 与使用 CStatusBar类建立状态栏类似 。在完成了前两 步准 备工作之后 .就可 以在对话框窗 口 (应用程序主窗 13)的初始 化事件中创建和显示状态栏了。代码也是放在CTStatusBarDlg:: OnlnitDialog 0 函数定义 (CTStatusBarDlg.cpp文件)的尾部 (即最后一条语句 return TRUE;之前)。具体代码如下: //获取主窗口甸柄 hDIg=GetSafeHwndO; //GetSafeHwnd为 CWnd类的成员函数 ∥仓0建状态栏(只有一个窗格} hStatusBar=::CreateStatusWindow( W S .CHILDiWS_VISIBLEIWS_BORDER, ∥状态栏的式样 TEX丁《-状态栏信息。).∥显示在状态栏上的信息 hDIg, ,/父窗口句柄 IDD STATUslI,,已经定义的对话框资源的 10 ,/获取主窗口(即对话框窗口)的大小信息 RECT Rect; this—->GetWindowRect(&Rect); //为状态栏划分窗格f假定划分 4个窗格) int w=60;∥指定后三个窗格的宽度 int cx=Rect,right-Rect.1eft一1 O:,/状态栏的总宽度 ∥定义描述状态栏窗格划分情况的数组 int pStatusBar[4]={//假定划分 4个窗格 c×一3 W,,/第 1个窗格的结束位置 cx一2 w,,/第2个窗格的结束位置 cx—w, //第3个窗格的结束位置 一 1 ∥第4个窗格的结束位置,_-表示到最后 ): ∥划分状态栏窗格并显示 ::SendMessage(hStatusBar,SB — SETPARTS,4,《LPARAM) pStatusBar); ,/在状态栏第一窗格中显示信息 ::SendMessage fhStatusBar,SB — SE TEXTJO,fLPARAM) TEXT( 状态栏建立完毕 )): 2.2.4在对话框窗口的OnSize事件中重新定位状态栏 与第一种实现方法一样 ,如果对话框窗 口的边框 风格被设 : p ‘ ’ ’ ‘ ● 。 ‘ ‘ ’ ’ ’ ‘ ‘ ’ 。 ’ ’ ’ ’ ^ ‘ ‘ ’ 实用第一 智慧密集 ⋯ ⋯ ⋯ ⋯ 一 一 ⋯ ⋯ . ⋯ ⋯ ⋯ . ⋯ ⋯ ⋯ ⋯ ⋯ 一 置为可 以改 变大小的 ,也需 要在对话 框窗 口的 OnSize事 件中 重新划分和定位状态栏 。其代码为 : //定义描述状态栏窗格划分情况的数组 jnt w=60; int pStatusBar【4】-{∥假定划分 4个窗格 CX一3 W.//第 1个窗格的结束位置 CX一2 W,∥第 2个窗格的结束位置 CX—W. ∥第 3个窗格的结束位置 一 1 //第 4个窗格的结束位置。一1表示到最后 }: ::SendMessage(hStatusBar,SB—SETPARTS,4,(LPARAM) pStatusBar): ::SetWindowPos (hStatusBar,HWND』0P,0.cy一2O,cx, 20,SWP SHO\/、fW INDOW): 3 示例程序的建立及添加的代码 限于篇幅 .这里只给出第一种 实现方法的程序代码 。 打开 VC6.0,新建一个名为TstatusBar的 MFC AppWizard(exe) 基本 对 话 框 工 程 , 系统 将 自动 建 立 一 系列 文 件 ,然 后 在 TstatusBarDlg.h和TstatusBarDlg.cpp文件中添加 2.1中所述的代 码 添加代码后 ,相关 文件 的为 : (1)TstatusBarDlg.h文件中自编的代码 : ∥TStatusBarD}g.h:header file class CTStatusBarDIg:public CDialog { protected: HICON m 。 hlcon; CStatusBar m — StatusBar ): (2)TstatusBarDlg.cpp文件 中 自编的代码 “TStatusBarDIg.cpp implementation file #endif static UINT IStatB[】= { lD — SEPARATOR, ID — INDICATOR . CAPS, ID — INDICATOR — NUM. ID — INDICATOR,SCRL, } . II CAboutDIg dialog used for App About BOOL CTStatusBarDIg::On tDiaIog() { 30 与‘ 电■聃技巧与●妒'_一—随 ,/TODO:Add extra initialization here ∥创建状态栏并划分窗格 if(1 m_StatusBar.Create(this)II ! m — StatusBar.SetlndicatoFS {iStatB,sizeof (iStatB)Isizeof (UINT))) { MessageBox(’创建状态栏或划分窗格时出错! ): return -1 } ∥安装状态栏: ∥获取 主窗口(即对话框窗 口)的大小信息 RECT Rect; this一>GetW indowRect(&Rect); ∥计算状态栏的大小与安装位置 int X,Y,CX,cy; cx=Rect.right—Rect.1eft-1 O: cy=20; x=O: y=Rect.bottom—Rect.top—cy-35; //安装并显示状态栏 m StatusBar.SetWindowPos (&wndTop,X,Y,CX,cy,SW P_SHOWW lNDOW); //在状态栏的有关窗格中显示信息 lm _ StatusBar.SetPaneStyle(0,SBPS—STRETCH): m — StatusBar。SetPaneText(O, 状态栏建立完毕',true): return TRUE;|l xeturn TRUE unless you set the focUS to a control } void CTStatusBafDlg::OnSize(UINT nType,int cx,int cy) ( CDialog::OnSize(nType,CX,cy): ll TODO:Add your message handler code here ::SetWindowPos(m_StatusBar,HWND_TOP,0,cy-20。CX 2O,SW P _ SHOVVW INDOW ); } 注 :本程序在 WindowsXP中 ,使用 Visual C++6.0编译通 过并运行正确 。 f收稿 日期 :2009—10—12)
/
本文档为【在VC对话框应用程序窗口添加状态栏的方法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索