这是vs自动生成的代码
static UINT indicators[] =
{
ID_SEPARATOR,           // 状态行指示器
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};这是vc技术内幕中的一个例子写的代码
static UINT indicators[] =
{
ID_SEPARATOR,  // first message line pane
ID_SEPARATOR,  // second message line pane
ID_INDICATOR_LEFT,
ID_INDICATOR_RIGHT,
};不理解为何状态栏的小区域里设置为ID_SEPARATOR,就一定在对应的地方显示提示信息,如果是别的值就不会显示提示信息,而且,像上面那样,如果有两个ID_SEPARATOR也只会在第一个ID_SEPARATOR对应的区域显示提示信息,后面那个什么也不做。static UINT indicators[] =
{
ID_INDICATOR_CAPS,
ID_INDICATOR_CAPS,
ID_SEPARATOR,           // 状态行指示器
ID_SEPARATOR,           // 状态行指示器
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};而我改成这样之后,第一、二个区域,都显示相同的内容(大小写指示),3、4就不显示一样的提示信息?我自己理解的话,每个区域,都是唯一的一个从0开始多索引,要设置每个区域的内容都根据相应的索引去的,那么怎么会出现,两个ID_INDICATOR_CAPS的区域就显示相同的内容,而两个ID_SEPARATOR,又只有第一个显示内容?

解决方案 »

  1.   

    MFC在哪一步做的执行中将ID_SEPARATOR对应的区域设置为“就绪”的?
      

  2.   

    ID_SEPARATOR其实就是一个“占位符”,说白了就是占了一个空位置。楼主上面说的那些信息,错乱应该是你设定状态栏值的时候出现的问题。设定状态栏的文字至少可以有下面两种方式:
    pStatus->SetPaneText( pStatus->CommandToIndex(IDS_panel1), str );  //这种通过转换将ID值转换成位置值,用于自己定义的indicators
    pStatus->SetPaneText(3,str);  //这种直接通过位置值来设定例如下面这个indicators:
    static UINT indicators[] =
    {
    IDS_panel1,
    IDS_panel2,
    ID_SEPARATOR,
    ID_SEPARATOR,
    ID_SEPARATOR,
    };我可以使用:pStatus->SetPaneText( pStatus->CommandToIndex(IDS_panel1), str ); 来设定
    也可以使用:pStatus->SetPaneText( 0,str); 来设定,效果是一样的。如果你对状态栏的本身的状态不做更高的要求,例如不通过系统的一些状态来设定你的indicators,如下面的这个insert状态这么复杂的控制:
    STRINGTABLE
    BEGIN
        ID_INDICATOR_INS "INS"
    END// In CMainFrame's message map
    ON_UPDATE_COMMAND_UI (ID_INDICATOR_INS, OnUpdateIndicator)// In CMainFrame::OnCreate
    static UINT nIndicators[] = {
        ID_SEPARATOR,
        ID_INDICATOR_INS
    };m_wndStatusBar.Create (this);
    m_wndStatusBar.SetIndicators (nIndicators, 2);// Elsewhere in CMainFrame
    void CMainFrame::OnUpdateIndicator (CCmdUI* pCmdUI)
    {
        pCmdUI->Enable (m_bInsert);
    }你大可把你的indicators设定为:
    static UINT indicators[] =
    {
    ID_SEPARATOR,   //有的时候第一个出现的ID_SEPARATOR被默认占用,也就是 // 状态行指示器 
    ID_SEPARATOR,
    ID_SEPARATOR,
    ID_SEPARATOR,
    ID_SEPARATOR,
    };然后使用:
    pStatus->SetPaneText( 0,str0);
    pStatus->SetPaneText( 1,str1);
    pStatus->SetPaneText( 2,str2);
    pStatus->SetPaneText( 3,str3);
    pStatus->SetPaneText( 4,str4);
    这样去设定没一个状态栏窗口的显示内容。你说的3,4出现显示不同,那个很正常 因为你可能错位显示了某些东西。
      

  3.   


    谢谢,辛苦了这样说其实不对的,它们不是“占位符”,而是状态栏中相应区域的ID,
    现在比较疑惑的是,为什么给区域分配ID_SEPARATOR这个ID,则只在第一个ID_SEPARATOR表识的区域显示提示,
    而给区域分配比如是ID_INDICATOR_LEFT这样的ID,则,每个ID_INDICATOR_LEFT对应的区域都显示相同的内容。
      

  4.   

    非常赞同4楼所说的。状态栏编程所需要的函数基本上在CStatusBar这个类中可以找到,这些函数的用法应该首先看MSDN。我也认为是你自己编程过程中有差错所致。
      

  5.   


    貌似我问的就不是那些函数的用法,为什么都只说函数用法呢?
    重问一遍现在比较疑惑的是,为什么给区域分配ID_SEPARATOR这个ID,则只在第一个ID_SEPARATOR表识的区域显示提示, 
    而给区域分配比如是ID_INDICATOR_LEFT这样的ID,则,每个ID_INDICATOR_LEFT对应的区域都显示相同的内容。
      

  6.   

    可能查下mfc源码就可以看到这里面的疑问了.不过偶滴水平还不够,找来找去没找准位置,算了,准备结了
      

  7.   

    是否因为ID_SEPARATOR这个ID的值为0的缘故?