儲存帶區布局 翻譯:tellmenow
命令帶控制項的可配置能力給程式員帶來一個問題。使用者重新排列帶區後,希望定製的布局在應用程式下一次啟動的時候能夠恢複。通過使用下面的函數,可以輕易的達到目的:
BOOL CommandBans_GetRestoreInformation (HWND hwndCmdBands, UINT uBand, LPCOMMANDBANDSRESTOREINFO pcbr);
該函數將單個帶區的資訊儲存到COMMANDBANDSRESTOREINFO結構中。該函數有兩個參數,一個是命令帶控制項控制代碼,一個是將要查詢的帶區的索引值。下面的程式碼片段展示了如何查詢命令帶控制項中每個帶區的資訊。
// Get the handle of the command bands control.
hwndCB = GetDlgItem (hWnd, IDC_CMDBAND);
// Get information for each band.
for (i = 0; i < NUMBANDS; i++) {
// Get band index from ID value.
nBand = SendMessage (hwndCB, RB_IDTOINDEX, IDB_CMDBAND+i, 0);
// Initialize the size field, and get the restore information.
cbr[i].cbSize = sizeof (COMMANDBANDSRESTOREINFO);
CommandBands_GetRestoreInformation (hwndCB, nBand, &cbr[i]);
}
上面的代碼使用RB_IDTOINDEX訊息,將帶區ID轉化成帶區索引,以用於CommandBands_GetRestoreInformation。結構中的資料通常儲存在系統註冊表中。我將在第8章“檔案和註冊表”中講解如何讀寫註冊表資料。
當應用程式恢複的時候,應該從註冊表中讀取恢複資訊,並在建立命令帶控制項的時候使用。
// Restore configuration to a command band.
COMMANDBANDSRESTOREINFO cbr[NUMBANDS];
REBARBANDINFO rbi;
// Initialize size field.
rbi.cbSize = sizeof (REBARBANDINFO);
// Set only style and size fields.
rbi.fMask = RBBIM_STYLE | RBBIM_SIZE;
// Set the size and style for all bands.
for (i = 0; i < NUMBANDS; i++) {
rbi.cx = cbr[i].cxRestored;
rbi.fStyle = cbr[i].fStyle;
nBand = SendMessage (hwndCB, RB_IDTOINDEX, cbr[i].wID, 0);
SendMessage (hwndCB, RB_SETBANDINFO, nBand, (LPARAM)&rbi);
}
// Only after the size is set for all bands can the bands
// needing maximizing be maximized.
for (i = 0; i < NUMBANDS; i++) {
if (cbr[i].fMaximized) {
nBand = SendMessage (hwndCB, RB_IDTOINDEX, cbr[i].wID, 0);
SendMessage (hwndCB, RB_MAXIMIZEBAND, nBand, TRUE);
}
}
上面的代碼假設命令帶控制項已經按照預設配置建立。在實際應用中,尺寸和風格的恢複資訊用於最初建立控制項的時候。在那種情況下,剩餘的將根據COMMANDBANDSRESTOREINFO結構中fMaximized域的狀態來決定是否最大化帶區。只有在所有的帶區被建立和適當的調整尺寸後,才做上面代碼中的最後一步。
該系統對儲存和恢複帶區的布局有一個限制,就是您沒有辦法判斷帶區在控制項中的順序。帶區索引不能提供可靠的資訊,因為經過使用者幾次重新安排帶區後,索引值既不連續也不是按任何定義的順序。解決該問題的唯一方式是強制排列帶區,這樣使用者就不能重新排列帶區。通過設定RBS_FIXEDORDER風格,可以達到這個目的。這樣可以解決這個問題,但如果使用者想要一個不同的順序,就不能夠給使用者提供協助了。在本節最後的例子程式中,我使用帶區索引值來猜測順序。但這個方法不能保證一定能有效。