MFC对话框程序添加状态栏动态显示时间,随窗口大小变化

转自:https://www.xuebuyuan.com/1835213.html
新建MFC
对话框项目DlgStatusBar,选择基于对话框,选择Use Unicode
libraries(否则运行前后界面风格会不同),接下来选择 Minimize box , Maximize box ,
去掉About box
然后Finished

首先创建状态栏

首先在string table
里添加两个字串,ID分别为IDS_INDICATOR_MESSAGE
和IDS_INDICATOR_TIME

把它们的Caption
分别设置为:Msg

星期%d
上午 00:00:00

然后在DlgStatusBar.h中声明一个CStatusBar变量

接着声明int型变量index1,index2
用来保存IDS_INDICATOR_MESSAGE面板
和IDS_INDICATOR_TIME面板的索引,另外声明两个int变量nWidth1,nWidth2
用来保存IDS_INDICATOR_MESSAGE面板
和IDS_INDICATOR_TIME面板的宽度

接着再声明UINT型变量
nID 和 nStyle
分别用来接收面板ID和面板风格,还要声明一个CString
变量str
用来接收Msg内容

在DlgStatusBar.h中的代码如下:

CStatusBar m_wndStatusBar;

int index1,

index2,

nWidth1,

nWidth2;

UINT nID,

nStyle;

Cstring str;

接下来在DlgStatusBar.cpp的开头添加如下数组

static UINT indicators[] =

{

IDS_INDICATOR_MESSAGE,

IDS_INDICATOR_TIME

};

然后到CDlgStatusBarDlg::OnInitDialog()函数中来创建这个StatusBar

if(!m_wndStatusBar.Create(this)||

!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))

{

TRACE0(“Can’t create status bar\n”);

return false;

}

接下来获取IDS_INDICATOR_MESSAGE,IDS_INDICATOR_TIME的索引和对应的宽度

index1 =
this->m_wndStatusBar.CommandToIndex(IDS_INDICATOR_MESSAGE);

index2 =
this->m_wndStatusBar.CommandToIndex(IDS_INDICATOR_TIME);

m_wndStatusBar.GetPaneInfo(index2,nID,nStyle,nWidth2);

然后设置IDS_INDICATOR_MESSAGE面板的宽度

CRect rect;

GetClientRect(rect);

this->m_wndStatusBar.SetPaneInfo(index1,nID,nStyle,rect.Width()-nWidth2-15);

然后设置IDS_INDICATOR_TIME面板的宽度

this->m_wndStatusBar.SetPaneInfo(index2,nID,nStyle,rect.Width());

//
重新摆放控件,因为增加状态栏之后,控件相对位置发生变化,重新摆放才能显示出来

RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);

//使用UNICODE
设置字幕文本,可以做成一个函数动态的改变
滚动字幕的文本

str=_T("
欢迎使用本软件…");

// 设置IDS_INDICATOR_MESSAGE的内容

m_wndStatusBar.SetPaneText(0,str);

//设置定时器

SetTimer(111,500,NULL);

F5运行
可以看到状态栏已经创建好了,但是这样创建的状态栏有两个问题:

1在状态栏最右边有个可以拉动状态的小三角,一般自定义情况下是不容许通过拉动这个三角来缩放状态栏大小的

2当窗口最大化时,状态栏的位置和大小都不会随着窗口变大而变化

那么怎么办呢?

首先解决小三角的问题:

要解决这个小三角的问题,必须建立一个没有 SBARS_SIZEGRIP
风格的状态栏。可是,在状态栏建立以后再把这个风格去掉是没有用的。因为 Windows 只会在建立状态栏时才会去认这个风格。MFC
提供 CStatusBar::Create 使你能够传送你自己的风格参数,但是 MFC
包含如下的硬代码(写死的)行:

// in CStatusBar::CreateEx
if (pParentWnd->GetStyle() & WS_THICKFRAME)
 dwStyle |= SBARS_SIZEGRIP;
dwStyle |= dwCtrlStyle;
return CWnd::Create(… dwStyle …);

这意味着如果你的主框架有 WS_THICKFRAME
风格(就是普通的框架窗口),MFC 会坚持为状态栏设置 SBARS_SIZEGRIP
风格。怎么办?

一个合适的方法是派生一个新的类,CMyStatusBar,重写自己的 Create
函数,并且不使用 SBAR_SIZEGRIP 风格。但是不用那么复杂,用下面简简单单的几行代码也达到了相同的目的:

//
关闭 WS_THICKFRAME
ModifyStyle(WS_THICKFRAME,0);
m_wndStatusBar.Create(this); // 执行完这一行之后再打开 WS_THICKFRAME
ModifyStyle(0,WS_THICKFRAME);

这样使 MFC
以为框架没有厚边框,所以它关闭了SBARS_SIZEGRIP,从而状态栏的手柄被隐藏。这个方法虽然很业余,但效果不错。

具体代码修改如下:

ModifyStyle(WS_THICKFRAME,0); //
关闭可调边框

if(!m_wndStatusBar.Create(this)||

!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))

{

TRACE0(“Can’t create status bar\n”);

return false;

}

ModifyStyle(0,WS_THICKFRAME); //
打开可调边框

F5
运行
小三角问题解决

下面来解决状态栏随窗口大小变化的问题

窗口大小变化是在WM_ONSIZE消息中进行的,所以先给DlgStatusBarDlg添加一个WM_ONSIZE消息

在OnSize()函数中添加如下代码:

CRect rectDlg,

rectBar;

GetClientRect(rectDlg);

if(m_wndStatusBar&&(0 != rectDlg.Width()))

{

CStatusBar m_pwndStatusBar = (CStatusBar)&m_wndStatusBar;

m_pwndStatusBar->GetClientRect(&rectBar);

m_pwndStatusBar->SetPaneInfo(index1,nID,nStyle,rectDlg.Width()-nWidth2-15);

m_pwndStatusBar->MoveWindow(0,cy-rectBar.Height(),rectDlg.Width(),rectBar.Height());

}

F5运行
此时状态栏就能随窗口大小变化而变化

下面来设置动态显示时间

为DlgStatusBarDlg
添加WM_TIMER响应消息
为了便于操作,我们添加一个时间信息函数

CString GetTimeInfo();
返回一个CString

GetTimeInfo()函数的代码请参看源代码

然后添加WM_TIMER消息,并在OnTimer函数中添加Msg
消息内容,和设置时间

源码下载:http://download.csdn.net/detail/zhaoxiatengkong_1/6295279

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值