新建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