关于状态栏,indicators数组中ID_SEPARATOR有何特别?

seai 2008-11-28 06:30:12
这是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,又只有第一个显示内容?
...全文
1646 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
oliverwind2008 2012-03-18
  • 打赏
  • 举报
回复
不学vc 就别做程序员
hcvtwj 2011-06-13
  • 打赏
  • 举报
回复
是否因为ID_SEPARATOR这个ID的值为0的缘故?
seai 2009-04-21
  • 打赏
  • 举报
回复
可能查下mfc源码就可以看到这里面的疑问了.不过偶滴水平还不够,找来找去没找准位置,算了,准备结了
悟迟 2009-04-17
  • 打赏
  • 举报
回复
帮顶
bai_hua_lin 2008-12-01
  • 打赏
  • 举报
回复
非常赞同4楼所说的。状态栏编程所需要的函数基本上在CStatusBar这个类中可以找到,这些函数的用法应该首先看MSDN。我也认为是你自己编程过程中有差错所致。
hityct1 2008-12-01
  • 打赏
  • 举报
回复
不懂,up
seai 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bai_hua_lin 的回复:]
非常赞同4楼所说的。状态栏编程所需要的函数基本上在CStatusBar这个类中可以找到,这些函数的用法应该首先看MSDN。我也认为是你自己编程过程中有差错所致。
[/Quote]

貌似我问的就不是那些函数的用法,为什么都只说函数用法呢?


重问一遍

现在比较疑惑的是,为什么给区域分配ID_SEPARATOR这个ID,则只在第一个ID_SEPARATOR表识的区域显示提示,
而给区域分配比如是ID_INDICATOR_LEFT这样的ID,则,每个ID_INDICATOR_LEFT对应的区域都显示相同的内容。
seai 2008-11-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Tinary3v0 的回复:]
ID_SEPARATOR其实就是一个“占位符”,说白了就是占了一个空位置。

楼主上面说的那些信息,错乱应该是你设定状态栏值的时候出现的问题。

[/Quote]

谢谢,辛苦了

这样说其实不对的,它们不是“占位符”,而是状态栏中相应区域的ID,
现在比较疑惑的是,为什么给区域分配ID_SEPARATOR这个ID,则只在第一个ID_SEPARATOR表识的区域显示提示,
而给区域分配比如是ID_INDICATOR_LEFT这样的ID,则,每个ID_INDICATOR_LEFT对应的区域都显示相同的内容。
starytx 2008-11-29
  • 打赏
  • 举报
回复
学习,顺便up一下
Tinary3v0 2008-11-29
  • 打赏
  • 举报
回复
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出现显示不同,那个很正常 因为你可能错位显示了某些东西。
seai 2008-11-29
  • 打赏
  • 举报
回复
MFC在哪一步做的执行中将ID_SEPARATOR对应的区域设置为“就绪”的?
seai 2008-11-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qap22 的回复:]
帮顶
[/Quote]

必须的
qap22 2008-11-28
  • 打赏
  • 举报
回复
帮顶

15,978

社区成员

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

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