增加帶區 翻譯:tellmenow
REBARBANDINFO結構用來描述控制項中的每個帶區,通過給CommamndBands_AddBands函數傳遞一個REBARBANDINFO結構數組,可以給應用程式添加帶區。CommandBands_AddBands函數原型如下:
BOOL CommandBands_AddBands (HWND hWndCmdBands, HINSTANCE hinst, UINT cBands, LPREBARBANDINFO prbbi);
再調用該函數之前,您必須先把準備加到控制項裡的每個帶區的資訊填寫到REBARBANDINFO結構中。該結構定義如下:
typedef struct tagREBARBANDINFO{
UINT cbSize;
UINT fMask;
UINT fStyle;
COLORREF clrFore;
COLORREF clrBack;
LPTSTR lpText;
UINT cch;
int iImage;
HWND hwndChild;
UINT cxMinChild;
UINT cyMinChild;
UINT cyMinChild;
UINT cx;
HBITMAP hbmBack;
UINT wID;
UINT cyChild;
UINT cyMaxChild;
UINT cyIntegral;
UINT cxIdeal;
LPARAM lParam;
} REBARBANDINFO;
幸運地是,雖然該結構看上去很宏偉壯觀,但其中的許多域可以被忽略掉,因為對未初始化的域有預設值。和通常的Windows結構一樣,做為一種容錯安全措施,cbSize需要填充為結構的尺寸。fMask域則填充了許多標誌,用來指出結構中其它域中哪些域填寫的是有效資訊。在討論到每個域的時候,我會描述這些標誌的。
如果fMask域中指定了RBBIM_STYLE標誌,那fStyle域就必須使用帶區的風格標誌來填充。適用的標誌如下:
RBBS_BREAK 帶區從新的一行開始
RBBS_FIXEDSIZE 帶區不能被調整大小。當指定了該標誌,帶區的“小把手”將不顯示。
RBBS_HIDDEN 當命令帶被建立後,帶區不可視。
RBBS_GRIPPERALWAYS 帶區有可調尺寸的小把手,即使命令帶只有一個帶區。
RBBS_NOGRIPPER 帶區沒有可調尺寸的小把手,因此使用者不能移動帶區
RBBS_NOVERT 如果使用CCS_VERT風格,命令帶控制項垂直顯示的話,帶區不會顯示出來。
RBBS_CHILDEDGE 在帶區的頂部和底部繪製邊線
RBBS_FIXEDBMP 當帶區改變大小的時候,帶區的背景位元影像不移動。
基本上這些標誌是自解釋型的。雖然命令帶通常顯示在視窗頂部,但是他們可以建立成垂直命令帶並顯示在視窗左邊。在這種情況下,RBBS_NOVERT風格允許程式員來指定當命令帶在垂直方向時,帶區不顯示。包含菜單或略寬一些控制項的帶區是很適合這種標誌的,因為它們在垂直帶區上不能被正確顯示。
clrFore和clrBack域中填寫的是顏色資訊,在應用程式繪製帶區的時候,會用這些顏色繪製前景色彩和背景色。需要注意的是,只有在掩碼域中設定了RBBIM_COLORS標誌時這兩個域才有用。對這兩個域以及用來為帶區指定背景位元影像的hbmBack域來說,只有在帶區包含透明命令條的時候才有用。否則命令條會佔據帶區的大部分空間,並遮蓋任何背景位元影像或者顏色。在“配置單獨帶區”一節中,我將解釋如何使命令條透明。
lpText域指定了用來標記單個帶區的可選文本。這些文字將直接顯示在帶區條的左邊。iImage域用於指定一個顯示在帶區條左邊的位元影像,使用包含在映像清單控制項中的圖象列表的索引來填充iImage域。當和命令帶控制項的RBS_SMARTLABELS風格配套使用的時候,文字和位元影像顯地更加重要。指定了RBS_SMARTLABELS風格以後,如果帶區被還原或者最大化,文字就會顯示出來;如果帶區被最小化,位元影像就顯示出來。該技術被H/PC Explorer用在它的命令帶控制項上。
wID域中填充的是帶區的ID值。帶區ID是很重要的,如果您計劃在建立帶區後配置它們或者想查詢它們的狀態的話。即使您不打算在程式裡使用帶區ID,保持每個帶區ID唯一也是很重要的,因為控制項自身使用該ID來管理帶區。只有在fMask域中設定了RBBIM_ID標誌時才會檢查wID域。
如果帶區中預設的命令條控制項需要被另一個控制項替代的話,hwndChild域就是很有用的了。為了替換命令條控制項,必須首先建立新控制項,再把該控制項的視窗控制代碼放到hwndChild域中。只有在fMask域中設定了RBBIM_CHILD標誌時才會檢查hwndChild域。
cxMinChild和cyMinChild域中定義了帶區可以縮小到的最小尺寸。當使用預設命令條以外的控制項時,這兩個域對定義帶區的高度和最小寬度很有用。只有在fMask域中設定了RBBIM_CHILDSIZE標誌時才會檢查這兩個域。
當帶區被使用者最大化的時候,會使用cxIdeal 域。如果這個域沒有初始化,命令帶最大化時會伸展到整個控制項寬度。通過設定cxIdeal,應用程式可以限制帶區最大化的寬度,這對於帶區上的控制項只佔整個帶區寬度一部分的情況來說是很方便的。只有在fMask域中設定了RBBIM_IDEALSIZE標誌時才會檢查這個域。
lParam域提供了一個空間來儲存由應用程式定義的關於帶區資訊的值。只有在fMask域中設定了RBBIM_LPARAM標誌時才會檢查這個域。
REBARBANDINFO中的其它域多用於更靈活的rebar控制項,而不僅僅是命令帶控制項。下面的代碼建立了一個命令帶控制項,初始化了一個帶三個REBARBANINFO結構的數組並把帶區加到控制項裡。
// Create a command bands control.
hwndCB = CommandBands_Create (hInst, hWnd, IDC_CMDBAND, RBS_SMARTLABELS | RBS_VARHEIGHT, himl);
// Initialize common REBARBANDINFO structure fields.
for (i = 0; i < dim(rbi); i++) {
rbi[i].cbSize = sizeof (REBARBANDINFO);
rbi[i].fMask = RBBIM_ID | RBBIM_IMAGE | RBBIM_SIZE | RBBIM_STYLE;
rbi[i].fStyle = RBBS_FIXEDBMP;
rbi[i].wID = IDB_CMDBAND+i;
}
// Initialize REBARBANDINFO structure for each band.
// 1. Menu band.
rbi[0].fStyle |= RBBS_NOGRIPPER;
rbi[0].cx = 130;
rbi[0].iImage = 0;
// 2. Standard button band.
rbi[1].fMask |= RBBIM_TEXT;
rbi[1].cx = 200;
rbi[1].iImage = 1;
rbi[1].lpText = TEXT ("Std Btns");
// 3. Edit control band.
hwndChild = CreateWindow (TEXT ("edit"), TEXT ("edit ctl"),
WS_VISIBLE | WS_CHILD | WS_BORDER,
0, 0, 10, 5, hWnd, (HMENU)IDC_EDITCTL,
hInst, NULL);
rbi[2].fMask |= RBBIM_TEXT | RBBIM_STYLE | RBBIM_CHILDSIZE | RBBIM_CHILD;
rbi[2].fStyle |= RBBS_CHILDEDGE;
rbi[2].hwndChild = hwndChild;
rbi[2].cxMinChild = 0;
rbi[2].cyMinChild = 25;
rbi[2].cyChild = 55;
rbi[2].cx = 130;
rbi[2].iImage = 2;
rbi[2].lpText = TEXT ("Edit field");
// Add bands.
CommandBands_AddBands (hwndCB, hInst, 3, rbi);
上面的代碼中建立的命令帶控制項有三個帶區,一個包含一個菜單,一個包含一組按鈕,一個則使用編輯控制項代替了命令條。使用RBS_SMARTLABELS 和 RBS_VARHEIGHT 風格建立了控制項。當命令條最小化的時候,智能標籤顯示一個表徵圖;當不在最小化狀態時,顯示文字表徵圖。RBS_VARHEIGHT風格則允許控制項上的每行有不同的高度。
在一個迴圈裡初始化了REBARBANINFO結構中共用的域。接下來,結構中剩餘的域根就據控制項中的每個帶區進行定製。包含編輯控制項的第三個帶區初始化是最複雜的。該帶區需要更多的初始化,因為編輯控制項需要適當的調整尺寸來匹配其它帶區中命令條控制項的標準高度。
使用映像清單索引來初始化每個帶區中的iImage域。該映像列表建立並傳遞進了CommandBands_Create函數。用在第二和第三個帶區中的文本域被標記所填充。包含菜單的第一個帶區中並不包含文本標記,因為菜單不需要標記。可以對第一個帶區使用RBBS_NOGRIPPER風格,這樣它就不能在控制項上移動了。這可以使菜單帶區固定顯示在控制項中適當的位置上。
既然我們已經建立了帶區,那是時候來看看如何初始化它們了。(待續)