菜鸟提问,为什么用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()是不是不对啊,请各位大侠赐教!
...全文
423 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
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);
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; //this->Create(NULL,"元器件绘制系统",WS_MAXIMIZE); 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_wndToolBarDraw.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBarDraw.LoadToolBar(IDR_DRAW_ICCHIP)) { 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 } // 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_wndToolBarDraw.EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBarDraw); this->FloatControlBar(&m_wndToolBarDraw,CPoint(30,120)); //m_wndToolBarDraw.SetSizes(CSize(25+7,25+6),CSize(25,25)); // CG: The following line was added by the Splash Screen component. // CSplashWnd::ShowSplashScreen(this); // CG: The following line was added by the Splash Screen component. CSplashWnd::ShowSplashScreen(this); return 0; }
VC++常用函数一应俱全 内容举例: 在状态栏中添加时间 1)在String Table中添加New String,在此定义为ID_INDICATOR_CLOCK, 将其Caption设为00:00:00(由于状态栏根据Caption确定时间窗格的缺 省宽度,使用此值将为时间的显示预留空间)。注 2)在MainFrm.cpp中indicators声明处添加ID_INDICATOR_CLOCK,代 码如下:   这一步中ID_INDICATOR_CLOCK的插入位置将影响时间窗格在状态栏中 的显示位置。   3)安装定时器:在MainFrm.cpp中OnCreate函数处添加代码如下:   int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)   { ……   SetTimer(1,1000,NULL);//安装定时器,并将其时间间隔设为1000毫秒   return 0;   }   4)编写时间处理函数:利用ClassWizard为CMainFrame类加入WM_TIMER 的消息处理函数OnTimer,并添加代码如下:   void CMainFrame::OnTimer(UINT nIDEvent)   {// TODO: Add your message handler code here and/or call default   CTime time;   time=CTime::GetCurrentTime();//得到当前时间   CString s=time.Format(″%H:%M:%S″);//转换时间格式,这里格式一定要大写   m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIn-   dex(ID_INDICATOR_CLOCK),s); //显示时钟   CFrameWnd::OnTimer(nIDEvent);}   5)销毁定时器:利用ClassWizard为CMainFrame类加入WM_CLOSE的消息处理   函数OnClose,并添加代码如下:   void CMainFrame::OnClose()   {// TODO: Add your message handler code here and/or call default   KillTimer(1);//销毁定时器

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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