65.9K
CodeProject 正在变化。 阅读更多。
Home

为 MFC 对话框添加状态栏

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (82投票s)

2002年5月17日

CPOL

2分钟阅读

viewsIcon

468151

downloadIcon

10229

展示如何在基于对话框的应用程序中使用状态栏

引言

有人在 VC++ 论坛上询问如何在对话框中添加状态栏,我愚蠢地回答说,他们只需要在他们的对话框类中有一个 CStatusBar 成员,并且应该从 OnInitDialog() 处理程序中调用 Create()。 然后另一个人回复说它不起作用,然后我自己试了一下,结果震惊地发现什么也没发生。 无论如何,我意识到这并不是一项太复杂的任务。 我想我应该写一篇关于在对话框中添加状态栏的小文章。 也有一个 MSDN 示例可以做到这一点,但是他们从 CStatusBar 派生了一个类,并且做了一些对于我们使用状态栏所做的常见简单事情来说不需要的复杂的事情。

八个简单步骤

步骤 1

我假设您已经准备好使用基于对话框的 MFC 应用程序。 从“视图”菜单中选择“资源符号”,并添加两个新符号,ID_INDICATOR_NISHID_INDICATOR_TIME。 您可以使用 VS 6 建议的默认值,但有时它可能会建议一个已经被使用的值,在这种情况下,您可能需要手动更改它。 无论如何我必须这么做。 我想知道这是一个已知的错误吗。

第二步

打开您的字符串表,并在其中添加两个条目 - ID_INDICATOR_NISHID_INDICATOR_TIME。 并设置一些默认值,无论您想使用什么。 这真的无关紧要。

步骤 3

将一个 CStatusBar 成员添加到您的主对话框类。

CStatusBar m_bar;

步骤 4

打开相应的 cpp 文件,并在文件顶部添加以下内容:-

static UINT BASED_CODE indicators[] =
{
    ID_INDICATOR_NISH,
    ID_INDICATOR_TIME
};

步骤 5

现在我们必须创建我们的状态栏。 一个好的地方是在我们的 CDialog 派生类的 OnInitDialog 函数中执行此操作。

m_bar.Create(this); //We create the status bar

m_bar.SetIndicators(indicators,2); //Set the number of panes 

CRect rect;
GetClientRect(&rect);
//Size the two panes
m_bar.SetPaneInfo(0,ID_INDICATOR_NISH, 
    SBPS_NORMAL,rect.Width()-100);      
m_bar.SetPaneInfo(1,ID_INDICATOR_TIME,SBPS_STRETCH ,0);

//This is where we actually draw it on the screen
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,
    ID_INDICATOR_TIME);

步骤 6 - 背景颜色

在步骤 5 结束时,我们实际上在屏幕上有一个状态栏。 这两个窗格显示了我们在字符串表中设置的默认值。 但是现在,假设您要更改背景颜色。 当然,这完全是可选的。 您可以将此行添加到 OnInitDialog(...)

m_bar.GetStatusBarCtrl().SetBkColor(RGB(180,180,180));

请注意,我们必须获取底层状态栏控件以调用 SetBkColor 函数。

步骤 7 - 添加时钟

假设您希望右侧窗格显示当前时间。 首先设置一个计时器。 只需将此行添加到 OnInitDialog(...)

SetTimer(100,1000,NULL);

现在将以下代码添加到 WM_TIMER 处理程序

void CDlgStatusBarDlg::OnTimer(UINT nIDEvent) 
{
    if(nIDEvent==100) 
    {
        CTime t1;
        t1=CTime::GetCurrentTime();
        m_bar.SetPaneText(1,t1.Format("%H:%M:%S"));
    }
    CDialog::OnTimer(nIDEvent);
}

步骤 8 - 显示 X 和 Y 坐标

假设您想显示鼠标在对话框中移动时的 X、Y 坐标。 您需要做的是覆盖 OnMouseMove

void CDlgStatusBarDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
    CString s;
    s.Format("X=%d Y=%d",point.x,point.y);
    m_bar.SetPaneText(0,s);
    CDialog::OnMouseMove(nFlags, point);
}
© . All rights reserved.