CStatusBarCtrl状态栏停靠位置的疑问?

ismycxp 2008-05-07 06:52:03

  1. m_wndStatusBar.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM,
  2. CRect(0,0,0,0), this, 0);

  3. // You can set the no. of parts of the StatusBar (4 in this case)
  4. // and the width of each part not -1 means remaining width

  5. int strPartDim[4]= {180, 260, 340, -1};
  6. m_wndStatusBar.SetParts(4, strPartDim);

  7. m_wndStatusBar.SetText(_T("Dialog / StatusBar / Toolbar"),0,0);
  8. m_wndStatusBar.SetText(_T("Example"), 1, 0);



如上代码,程序刚启动时,状态是靠最下面的
但如果最大化,状态栏不会自动适应窗口的大小,

要怎么做才能让状态栏自动能适应窗口的大小,始终保持在最下面的风格呢?
...全文
给本帖投票
351 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Italoser 2021-07-09
  • 打赏
  • 举报
回复

21年路过。。。

ralf 2009-12-31
  • 打赏
  • 举报
回复
什么意思啊,如需要阅读该回复,请登录或注册CSDN!


ismycxp 2008-05-08
  • 打赏
  • 举报
回复
怎么没人回答啊...
ismycxp 2008-05-08
  • 打赏
  • 举报
回复
谢谢各位,

在WM_SIZE我添加了如下代码:

void CLotteryDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码
CRect rect;
GetClientRect(&rect);
ASSERT(m_wndStatusBar.SetWindowPos(&wndTop,0,rect.bottom-20,cx,20,SWP_DRAWFRAME));
}


可是刚运行的时候都是会弹出错误,我只能按忽略才能继续运行,

不知道有没有解决方法?

之前我也是用CStatusBar的,但发现创建CStatusBar后,却不能显示,
各位如果有现成的代码,能否发上来看看?

谢谢大家!
菜牛 2008-05-08
  • 打赏
  • 举报
回复
MFC的内部机制在文档/视图框架下有,MFC没有为对话框设计状态栏机制。
ismycxp 2008-05-08
  • 打赏
  • 举报
回复
啊,非常感谢...

谢谢cnzdgs,和Mackz

此问题已经得到解决...

结帖!!!!!!!!!!!!!!!!!!!!!!!
菜牛 2008-05-08
  • 打赏
  • 举报
回复
OnSize中需要判断控件是否有效,因为OnSize会被多次调用,最初调用的时候控件还没有创建:
if (IsWindow(m_wndStatusBar.GetSafeHwnd()))
{
m_wndStatusBar.MoveWindow(&wndTop, 0, cy - 20, cx, 20);
}
ismycxp 2008-05-08
  • 打赏
  • 举报
回复
谢谢cnzdgs兄,

我用了你的代码了,代码如下:
void CLotteryDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

// TODO: 在此处添加消息处理程序代码
CRect rt;
GetClientRect(&rt);
rt.top = rt.bottom - 20;
m_wndStatusBar.MoveWindow(&rt);
}

运行时弹出这样的错误,你看看


现在是一头汗啊...
cnzdgs 2008-05-08
  • 打赏
  • 举报
回复
不要用ASSERT。另外,这种情况一般用MoveWindow不用SetWindowPos,我在前面已经给你写了例子代码了,为什么不用?
cnzdgs 2008-05-07
  • 打赏
  • 举报
回复
原来是CStatusBarCtrl,我给当成CStatusBar了。CStatusBarCtrl只能是响应父窗口的WM_SIZE消息,自己来调整大小。其实做法很简单,添加消息响应函数,在CDialog::OnSize的下面加上:
RECT rt;
GetClientRect(&rt);
rt.top = rt.bottom - 20;
m_sbc.MoveWindow(&rt);
这样就可以了。
ismycxp 2008-05-07
  • 打赏
  • 举报
回复
不是吧,Mackz 的方法是我最不想用的...

这样偶合也太强了...

我始终认为MFC有内部的机制可以轻松实现这点

菜牛 2008-05-07
  • 打赏
  • 举报
回复
响应对话框WM_SIZE消息,移动状态栏到底部。
ismycxp 2008-05-07
  • 打赏
  • 举报
回复

m_wndStatusBar.Create(WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,
CRect(0,0,0,0), this,AFX_IDW_STATUS_BAR);

// You can set the no. of parts of the StatusBar (4 in this case)
// and the width of each part not -1 means remaining width

int strPartDim[4]= {180, 260, 340, -1};
m_wndStatusBar.SetParts(4, strPartDim);

m_wndStatusBar.SetText(_T("Dialog / StatusBar / Toolbar"),0,0);
m_wndStatusBar.SetText(_T("Example"), 1, 0);


cnzdgs兄,还是不行啊,

代码如上,可是一点变化都没有...
ismycxp 2008-05-07
  • 打赏
  • 举报
回复
不好意思,

忘记发上来了

头文件是这样定义的

CStatusBarCtrl m_wndStatusBar;
cnzdgs 2008-05-07
  • 打赏
  • 举报
回复
CCS_BOTTOM参数是哪来的?改成CBRS_BOTTOM。
cnzdgs 2008-05-07
  • 打赏
  • 举报
回复
m_wndStatusBar是什么类型?怎么Create有4个参数?

nID给AFX_IDW_STATUS_BAR。
ismycxp 2008-05-07
  • 打赏
  • 举报
回复
忘记说了,我用的是对话框程序

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部