Status Bar完成

Status Bar完成
    Status Bar所提供的消息相当的诡异。Status Bar里面的Items的数量以及宽度要一次性设置好,每次修改的时候都要推翻重建一次,只不过里面的Text倒是可以单独改掉。在XP底下有效的raise border似乎在Vista就没有了。看来Vista已经从伪3D彻底转向了2D了。

    Status Bar在CreateWindowEx的时候会自动将自己放在窗口的最底下,每一次修改Status Bar的尺寸的时候,它又会自动把自己放在窗口的最底下。当然,你可以让他出现在最上面。虽然如此,但是我封装的时候还是想自由地修改尺寸和位置,当且仅当我想让他出现在窗口最下面的时候他才出现在窗口最下面,于是我只好截获Status Bar的WM_SIZE消息并扔掉了。

    当初为每一个控件都自动Subclass掉的想法还真是正确啊……

Status Bar完成_第1张图片
    下面是设置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      }

你可能感兴趣的:(Status Bar完成)