菜鸟提问,为什么用m_wndStatusBar.SetPaneText()会出错

qqwwing 2004-05-07 04:17:28
照书上的写法,在单文档中首先增加一个字符串资源,如ID_NEWPANE,初值为00,然后在CFrameWnd类中加入

static UINT indicators[] =
{
ID_SEPARATOR,
ID_NEWPANE,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};

这时编译后已经可以看到窗格,显示为00。这时我想改变它的显示值,不是初值,还是照书上的写法,直接在OnCreat()函数中加入

m_wndStatusBar.SetPaneText(ID_NEWPANE,"");

此时编译没有错,但是运行时会弹出出错框。应该是ASSERT错误。调试可以找到是下面的函数出错

inline AFX_STATUSPANE* CStatusBar::_GetPanePtr(int nIndex) const
{
ASSERT((nIndex >= 0 && nIndex < m_nCount) || m_nCount == 0);
return ((AFX_STATUSPANE*)m_pData) + nIndex;
}

这么用SetPaneText()是不是不对啊,请各位大侠赐教!
...全文
313 10 点赞 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
qqwwing 2004-05-07
解决了,谢谢各位大哥的回复,
  • 打赏
  • 举报
回复
qqwwing 2004-05-07
那应该怎么写啊,能给一个例子吗?
  • 打赏
  • 举报
回复
microsy 2004-05-07
第一个参数是索引 不是字符串资源
BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE );

Parameters

nIndex
Index of the pane whose text is to be set.

lpszNewText
Pointer to the new pane text.

bUpdate
If TRUE, the pane is invalidated after the text is set
  • 打赏
  • 举报
回复
菜牛 2004-05-07
SetPaneText()第一个参数用错了,请查MSDN。
  • 打赏
  • 举报
回复
qqwwing 2004-05-07
刚才的没写清楚

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}

if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
//这就是我加的位置
m_wndStatusBar.SetText(ID_NEWPANE,"");

// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);

//m_wndStatusBar.SetPaneText(ID_NEWPANE,"");

return 0;
}
  • 打赏
  • 举报
回复
qqwwing 2004-05-07
我的OnCreate()函数代码如下

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}

if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}

m_wndStatusBar.SetText(ID_NEWPANE,"");

// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);


return 0;
}
  • 打赏
  • 举报
回复
ygzdev 2004-05-07
放的位置有关系,要在有的语句之后去,你没有给代码具体就不好说,你试试放到其他位置,多放几次
  • 打赏
  • 举报
回复
qqwwing 2004-05-07
5555………是不是我的问题太简单了大家都不屑于回答啊
  • 打赏
  • 举报
回复
qqwwing 2004-05-07
楼上的大哥语句中的 rect是在哪定义的?而且SetText()也不是CStatusBar类的成员函数啊,
  • 打赏
  • 举报
回复
王国凡 2004-05-07
可以这样创建:
m_StatBar.Create(WS_CHILD | WS_BORDER | WS_VISIBLE ,rect,this,IDD_MYBAR_DIALOG);

...

可以用 SetText 改变值,例如改变第一个 panel 的值为 WIDTH BORDER 即:
m_StatBar.SetText("WITH BORDER.", 0,0);
  • 打赏
  • 举报
回复
相关推荐
发帖
VC/MFC
加入

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-05-07 04:17
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……