如何使用 WTL 多窗格状态栏控件






4.69/5 (9投票s)
2002年9月27日
2分钟阅读

99119

2569
本文介绍了如何在应用程序中使用WTL的CMultiPaneStatusBarCtrl类。

引言
本文介绍了如何在应用程序中使用WTL的CMultiPaneStatusBarCtrl
类。 本文包含的示例项目是一个向导生成的SDI应用程序,该应用程序增强了具有三个窗格的状态栏,该状态栏显示状态消息以及当前日期和时间。
状态栏
使用状态栏的所有相关代码都包含在示例项目的mainframe.h
文件中。 状态栏在OnCreate
方法中初始化,该方法还会调用WTL类中错误的解决方法。 另一种方法提供一个计时器处理程序,用于在状态栏窗格中显示日期和时间。
基础
状态栏在使用应用程序时向用户提供各种类型的反馈和信息。 WTL向导生成的应用程序定义了一个单窗格状态栏。 它处理显示“就绪”的基本功能,并切换到简单模式以显示菜单提示。 另一方面,多窗格状态栏分为多个独立控制的段。
初始化
请注意,您必须包含atlctrlx.h
头文件。 它定义了CMultiPaneStatusBarCtrl
类。 您还必须包含atlmisc.h
,因为它定义了AtlLoadIconImage()
和CString
类。
定义和初始化应用程序的多窗格状态栏控件需要以下步骤
- 为每个状态栏窗格创建一个资源定义
- 定义一个成员变量:
CMultiPaneStatusBarCtrl m_status;
- 对WTL向导创建的“简单”状态栏进行子类化
- 枚举并设置状态栏窗格
- 调用解决方法方法,
SetPaneWidths()
- 为各个状态栏窗格设置图标(如果需要)
以下来自resource.h
的资源定义与状态栏窗格及其图标有关。 它们是在导入图标时由资源编辑器创建的,它们用于标识状态栏窗格以及图标。 如果您不导入或为应用程序创建状态栏图标,则必须手动输入类似的值。
#define IDR_DEFAULT 201 #define IDR_DATE 202 #define IDR_TIME 203
此外,WTL定义了一个默认窗格标识符ID_DEFAULT_PANE
,它用作显示“就绪”等状态消息的可变宽度窗格。
这是来自mainframe.h
的OnCreate()
方法。 请注意,在传递给SetPaneWidths()
的数组中,默认窗格的宽度设置为0。
LRESULT OnCreate(UINT, WPARAM, LPARAM, BOOL&)
{
CreateSimpleStatusBar();
// subclass the status bar as multipane
m_status.SubclassWindow(m_hWndStatusBar);
// set status bar panes. ID_DEFAULT_PANE is defined by WTL
int arrPanes[] = { ID_DEFAULT_PANE, IDR_DATE, IDR_TIME };
m_status.SetPanes(arrPanes,
sizeof(arrPanes) / sizeof(int), false);
// set status bar pane widths using local workaround
int arrWidths[] = { 0, 90, 60 };
SetPaneWidths(arrWidths, sizeof(arrWidths) / sizeof(int));
// set the status bar pane icons
m_status.SetPaneIcon(ID_DEFAULT_PANE,
AtlLoadIconImage(IDR_DEFAULT, LR_DEFAULTCOLOR));
m_status.SetPaneIcon(IDR_DATE,
AtlLoadIconImage(IDR_DATE, LR_DEFAULTCOLOR));
m_status.SetPaneIcon(IDR_TIME,
AtlLoadIconImage(IDR_TIME, LR_DEFAULTCOLOR));
// initialize date/time and start a 1 second timer
OnTimer(0, 0, 0, bHandled);
SetTimer(1, 1000);
return 0;
}
解决方法
SetPaneWidths()
是一个解决方法,用于解决CMultiPaneStatusBarCtrl::SetPanes()
方法中的一个错误。 该错误将默认窗格之后的所有窗格的宽度限制为总共100像素。 此解决方法允许任意窗格宽度。
void SetPaneWidths(int* arrWidths, int nPanes)
{
// find the size of the borders
int arrBorders[3];
m_status.GetBorders(arrBorders);
// calculate right edge of default pane (0)
arrWidths[0] += arrBorders[2];
for (int i = 1; i < nPanes; i++)
arrWidths[0] += arrWidths[i];
// calculate right edge of remaining panes (1 thru nPanes-1)
for (int j = 1; j < nPanes; j++)
arrWidths[j] += arrBorders[2] + arrWidths[j - 1];
// set the pane widths
m_status.SetParts(m_status.m_nPanes, arrWidths);
}
计时器处理程序
这是计时器处理程序的代码。 您还必须为WM_TIMER
消息创建一个消息映射条目。
LRESULT OnTimer(UINT, WPARAM, LPARAM, BOOL&)
{
// get the current date and time
SYSTEMTIME st;
::GetLocalTime(&st);
CString str;
// Pane 1: Display the date
str.Format("%i/%i/%i", st.wMonth, st.wDay, st.wYear);
m_status.SetPaneText(IDR_DATE, str);
// Pane 2: Display the time
str.Format("%i:%02i", st.wHour, st.wMinute);
m_status.SetPaneText(IDR_TIME, str);
return 0;
}
使用条款
本文提供的示例应用程序可免费用于任何目的。
本软件按“现状”分发,不提供任何形式的担保。