MFC之CStatusBar文字不显示

记录一下使用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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值