在VC对话框应用程序窗口添加状态栏的方法
⋯ ‘ ’ ’ ‘ ‘ ’ ‘ ‘ ‘ I_ 。 ‘ ⋯ ’ ’ ‘
实用第一 智慧密集
⋯ ⋯ 。 一 ⋯ 一 . , . ⋯ . . ⋯ . 一 ⋯ ⋯ ⋯ ⋯ . ⋯ .
在 VC对话框应用程序窗口添加状态栏的方法
。 车竞宏 囊
摘 要 :VC的应用程序向导不在对话框类型的应用程序主窗 口中自动添加状态栏 。但程序 员
可以通过编码来为对话框类型的应用程序主窗口添加状态栏。在此介绍两种具体的实现方法:
即使用 MFC类库 中提供的 CStatusBar类实现的方法和使用Win32...
⋯ ‘ ’ ’ ‘ ‘ ’ ‘ ‘ ‘ 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,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。