记录一下使用CStatusBar遇到的问题,这问题太蠢了,先上代码:
//系统默认的几个项,即使不手动设置也会显示文字
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_OVR,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
};
m_pStatusBar = new CStatusBar();
if(!m_pStatusBar->Create(this) || !m_pStatusBar->SetIndicators(indicators, sizeof(indicators) / sizeof(UINT)))
{
AfxMessageBox(_T("创建状态栏失败!"));
return FALSE;
}
CRect rcClient;
GetClientRect(&rcClient);
ScreenToClient(rcClient);
//问题就出在这一句MoveWindow
m_pStatusBar->MoveWindow(0, rcClient.bottom, rcClient.Width(), 80);
m_pStatusBar->ShowWindow(SW_SHOW);
看了代码半天,死活想不出来问题在哪,然后看到了一篇求助帖,跟我的问题一模一样:
https://bbs.youkuaiyun.com/topics/390939459?list=6515742
看完就知道原因了:MoveWindow把状态栏的高设得太大了,导致状态栏下半部分已经超出对话框显示区域了,状态栏的文本估计默认显示居中,就显示不出来了,下面是修改后的代码:
m_pStatusBar = new CStatusBar();
if(!m_pStatusBar->Create(this) || !m_pStatusBar->SetIndicators(indicators, sizeof(indicators) / sizeof(UINT)))
{
AfxMessageBox(_T("创建状态栏失败!"));
return FALSE;
}
CRect rcClient;
GetClientRect(&rcClient);
ScreenToClient(rcClient);
//就把MoveWindow最后一个参数改成了60
m_pStatusBar->MoveWindow(0, rcClient.bottom, rcClient.Width(), 60);
m_pStatusBar->ShowWindow(SW_SHOW);
隐约可以看到文字已经露出来了:
上面的代码还有问题,坐标算的乱七八糟,正确的代码贴上:
CRect rcClient;
GetClientRect(&rcClient);
m_pStatusBar->MoveWindow(0, rcClient.bottom - 20, rcClient.Width(), 20);
m_pStatusBar->ShowWindow(SW_SHOW);
隔了一天,又发现原来状态栏的坐标可以不用自己计算,直接调用RepositionBars也能把状态栏移动到窗口底部,效果是一样的:
static UINT indicators[] =
{
IDS_UNUSESPACE,
IDS_USERNAME,
IDS_LOGINSTATE,
IDS_LOGINTIME
};
m_pStatusBar = new CStatusBar();
if(!m_pStatusBar->Create(this) || !m_pStatusBar->SetIndicators(indicators, sizeof(indicators) / sizeof(UINT)))
{
AfxMessageBox(_T("创建状态栏失败!"));
return FALSE;
}
m_pStatusBar->SetPaneInfo(0, IDS_UNUSESPACE, SBPS_STRETCH, 100);
m_pStatusBar->SetPaneInfo(1, IDS_USERNAME, SBPS_NORMAL, 100);
m_pStatusBar->SetPaneInfo(2, IDS_LOGINSTATE, SBPS_NORMAL, 100);
m_pStatusBar->SetPaneInfo(3, IDS_LOGINTIME, SBPS_NORMAL, 100);
m_pStatusBar->SetPaneText(0, _T("xxx"));
m_pStatusBar->SetPaneText(1, _T("测试用户"));
m_pStatusBar->SetPaneText(2, _T("已登录"));
m_pStatusBar->SetPaneText(3, _T("已登录时间:"));
//调用一下RepositionBars调整状态栏位置,该函数默认会把状态栏移动到窗口底部
//IDS_UNUSESPACE 是我自定义的状态栏子项ID,这个可以随便改
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, IDS_UNUSESPACE);
调整窗口大小的时候也可以计算状态栏的位置和窗格大小:
void CtestStatusBarDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
//当窗口大小被调整后,状态栏要重新计算位置和各子项的宽
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, IDS_UNUSESPACE);
}