Status Bar所提供的消息相当的诡异。Status Bar里面的Items的数量以及宽度要一次性设置好,每次修改的时候都要推翻重建一次,只不过里面的Text倒是可以单独改掉。在XP底下有效的raise border似乎在Vista就没有了。看来Vista已经从伪3D彻底转向了2D了。
Status Bar在CreateWindowEx的时候会自动将自己放在窗口的最底下,每一次修改Status Bar的尺寸的时候,它又会自动把自己放在窗口的最底下。当然,你可以让他出现在最上面。虽然如此,但是我封装的时候还是想自由地修改尺寸和位置,当且仅当我想让他出现在窗口最下面的时候他才出现在窗口最下面,于是我只好截获Status Bar的WM_SIZE消息并扔掉了。
当初为每一个控件都自动Subclass掉的想法还真是正确啊……
下面是设置Item属性的代码,相当恶心啊。虽然我封装的时候仍然给了additem、insertitem和deleteitem,但是却不得不写成这个样子。下面这几个是protected函数,专门用来刷新属性的。
1 void VL_WinStatus::RefreshItem(VInt Index)
2 {
3 INT wParam=Index;
4 if(FItems[Index].Border)
5 {
6 if(FItems[Index].Raise)
7 {
8 wParam|=SBT_POPOUT;
9 }
10 }
11 else
12 {
13 wParam|=SBT_NOBORDERS;
14 }
15 VUnicodeString Text=FItems[Index].TextLeft+L'\t'+FItems[Index].TextCenter+L'\t'+FItems[Index].TextRight;
16 SendMessage(FHandle,SB_SETTEXT,wParam,(LPARAM)Text.Buffer());
17 }
18
19 void VL_WinStatus::RefreshItems()
20 {
21 INT Borders[3];
22 SendMessage(FHandle,SB_GETBORDERS,0,(LPARAM)Borders);
23 VInt w=Borders[0];
24 VInt h=Borders[1];
25 VInt s=Borders[2];
26 INT Rights[STATUS_BAR_MAX_ITEM_COUNT]={0};
27 VInt CurrentRight=w;
28 for(VInt i=0;i<FItems.GetCount();i++)
29 {
30 if(i==FItems.GetCount()-1 && FItems[i].Width==0)
31 {
32 Rights[i]=-1;
33 }
34 else
35 {
36 CurrentRight+=FItems[i].Width;
37 Rights[i]=CurrentRight;
38 CurrentRight+=s;
39 }
40 }
41 SendMessage(FHandle,SB_SETPARTS,FItems.GetCount(),(LPARAM)Rights);
42 for(VInt i=0;i<FItems.GetCount();i++)
43 {
44 RefreshItem(i);
45 }
46 }
posted on 2008-08-15 23:34
陈梓瀚(vczh) 阅读(1539)
评论(1) 编辑 收藏 引用 所属分类:
C++