随笔-341  评论-2670  文章-0  trackbacks-0
    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) 阅读(1504) 评论(1)  编辑 收藏 引用 所属分类: C++

评论:
# re: Status Bar完成 2008-08-17 01:39 | dell笔记本
的确显示的很奇怪。  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理