菜單條資源 翻譯:tellmenow
如前所述,菜單條在很多方面都像一個工具條控制項。查看菜單條使用的資源,會看到這兩個對象的一些差別是在於外觀上。圖5-7顯示了一個簡單菜單條。
圖5-7(略):一個開啟了編輯菜單(Edit)的簡單菜單條。
當建立菜單條時,SHMENUBARINFO結構中的nToolBarId域被適當的設定,因為nToolBarID標識的資源不是菜單資源,而是一個用於菜單條控制項的定製資源。為了建立圖5-7所展示的菜單條,資源編輯器將在.RC檔案中建立下面的文本:
///////////////////////////////////////////////////////////////////////////
// Data
//
IDM_MENU SHMENUBAR MOVEABLE PURE
BEGIN
IDM_MENU, 4,
I_IMAGENONE, IDM_SHAREDNEW, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, IDS_SHNEW,
0, NOMENU,
I_IMAGENONE, ID_EDIT, TBSTATE_ENABLED,
TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_EDIT, 0, 0,
I_IMAGENONE, IDM_MAIN_COMMAND1, TBSTATE_ENABLED,
TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_HELP, 0, 1,
0, ID_BACKBTN, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, 0, ID_BACKBTN, 2,
END
///////////////////////////////////////////////////////////////////////////
// Menu bar
//
IDM_MENU MENU DISCARDABLE
BEGIN
POPUP "Edit"
BEGIN
MENUITEM "Cut", ID_EDIT_CUT
MENUITEM "Copy", ID_EDIT_COPY
MENUITEM "Paste", ID_EDIT_PASTE
END
POPUP "Tools"
BEGIN
MENUITEM "About", IDM_HELP_ABOUT
MENUITEM "Options", ID_TOOLS_OPTIONS
END
END
大多數情況下,不需要準確的知道資源編輯器在資源中放置了什麼資源。然而,有必要瞭解格式,這樣可以容易的更改使用了菜單條的應用程式,也可以在碰到使用的裝置上資源編輯器不能建立菜單條控制項的時候,來方便使用。資源實際上就是對工具條上按鈕的描述。下面的代碼提供了前述資料的格式:
IDM_MENU SHMENUBAR MOVEABLE PURE
BEGIN
IDM_MENU, 4,
I_IMAGENONE, IDM_SHAREDNEW, TBSTATE_ENABLED,
TBSTYLE_AUTOSIZE, IDS_SHNEW, 0, NOMENU,
I_IMAGENONE, ID_EDIT, TBSTATE_ENABLED,
TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_CAP_EDIT, 0, 0,
I_IMAGENONE, IDM_MAIN_COMMAND1, TBSTATE_ENABLED,
TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_HELP, 0, 1,
0, ID_BACKBTN, TBSTATE_ENABLED,
TBSTYLE_AUTOSIZE, 0, ID_BACKBTN, 2,
END
資源檔中的第一行中,IDM_MENU是資源ID,SHMENUBAR是資源類型,MOVEABLE和PURE是資源標誌。IDM_MENU作為ID需要傳遞到SHCreateMenuBar的SHMENUBARINFO 結構中。資源類型SHMENUBAR實際上被嚮導定義成了RCDATA,資源編譯器將它理解成一個由應用程式使用的簡單資源資料塊。這一點很重要,因為SHMENUBAR並沒有被定義在Pocket PC 的包含檔案(include files)中,只有使用Pocket PC 應用嚮導(AppWizard)來建立菜單條資源時才會包含它。所以,對於非嚮導產生的菜單條資源檔,需要加入以下內容到RC檔案中:#define SHMENUBAR RCDATA
BEGIN/END塊中第一行資料是:IDM_MENU, 4。這一行定義了菜單資源,用於建立菜單條上單獨的快顯功能表。數字4表示該項在SHMENUBAR資源中的編號。每一項要麼是菜單條上的快顯功能表,要麼就是一個按鈕。
因為書本印刷格式的原因,導致大家看到的前面的資源描述中每項的描述都被折成了兩行。讓我們看一下資源中的最後一項--回退(Back)按鈕項:
0, ID_BACKBTN, TBSTATE_ENABLED, TBSTYLE_AUTOSIZE, 0, ID_BACKBTN, 2,
對該行進行垂直折行,加入注釋後,資源描述如下:
0, // Bitmap index
ID_BACKBTN, // WM_COMMAND ID value
TBSTATE_ENABLED, // Initial state of "button"
TBSTYLE_AUTOSIZE, // Style of "button"
0, // String resource ID of text label
ID_BACKBTN, // String resource ID of tooltip
2, // Submenu index
菜單條上該項的圖片在位元影像數組中的索引就包含在第一個域中。如果該項沒有位元影像,就設定成I_IMAGENONE。在上面的例子中,使用的圖片是位元影像數組中的第一個。下一個域包含該項的ID值。對按鈕來說,該值就是當按鈕被點壓時隨WM_COMMAND訊息發送到父視窗的那個ID值。對於菜單來說,當查詢子功能表控制代碼的時候可以用這個ID來標識子功能表。因為shell在菜單條中會使用自己的ID集合,所以應用程式不應該使用小於100的值。這條規則一樣適用於菜單、按鈕以及字串資源ID。
菜單條使用兩個預定義的功能表項目ID:IDM_SHAREDNEW 和 IDM_SHAREDNEWDEFAULT。這兩個ID會添加一個New(建立)功能表項目,用來顯示其它應用程式註冊的功能表項目。兩個ID的區別是,簡單的點一下功能表項目,IDM_SHAREDNEWDEFAULT就會顯示一個新的功能表項目。而使用IDM_SHAREDNEW,則將New菜單變成了一個帶下拉式箭頭的按鈕。在New按鈕上點擊,會發送WM_COMMAND訊息到父視窗,指出應該建立一個新文檔。在箭頭上點擊則顯示新菜單自身。對於非Pocket PC系統,只有當shell為系統提供New菜單支援的時候,New菜單才會顯示在菜單條上,否則,預定義的新功能表項目ID將被忽略。
接下來的兩個域是按鈕/根功能表項目的初始狀態和風格。狀態域使用的是工具條的狀態標誌來進行描述的,例如TBSTATE_ENABLED 和TBSTATE_CHECKED。對於菜單,狀態幾乎總是TBSTATE_ENABLED。風格域也是使用工具條風格標誌來描述的,例如用於按鈕的TBSTYLE_BUTTON,用於功能表項目的TBSTYLE_DROPDOWN。有文本而不是位元影像的項以及包含位元影像的項通常也會設定TBSTYLE_AUTOSIZE 來告訴菜單條調整按鈕的尺寸來適應功能表項目中的文本。
下一個域是功能表項目文本的字串資源ID。文字和第一個域中指定的圖片是並排擺放的。在上面的例子中,該項只是一個簡單的位元影像按鈕,所以沒有指定字串資源。對功能表項目來說,是字串資源來標記菜單,而不是在菜單資源中指定的子功能表名。如果需要的話,您可以使用7個預定義的字串ID,它們作為自解釋型常量被定義在Aygshell.h檔案中。
#define IDS_SHNEW 1
#define IDS_SHEDIT 2
#define IDS_SHTOOLS 3
#define IDS_SHVIEW 4
#define IDS_SHFILE 5
#define IDS_SHGO 6
#define IDS_SHFAVORITES 7
#define IDS_SHOPEN 8
如果您需要一個不同的文本,那麼您的應用程式必須用字串資源定義文本,並將ID傳遞到這個域中。下一個域是工具提示資訊(tool tip)域。同樣,您必須使用字串資源ID來填充這個域。
最後一個域規定了子功能表,當使用者點這個項,就會彈出來。只有風格域包含TBSTYLE_DROPDOWN標誌(表示該項附加了一個菜單),這個子功能表值才是有效。這個值代表子功能表的菜單資源索引。本節提到的例子中有兩個子功能表:編輯(Eidt)菜單,包含了Cut,Copy和Paste三個功能表項目;工具(Tools)菜單,包含About和選項(Options)兩個功能表項目。 按鈕上顯示的文字是來自菜單條資源中,而不是來自菜單資源。例如,
可以按下面的代碼來修改菜單資源,而不用改變菜單條中的文本。
///////////////////////////////////////////////////////////////////////////
// Menu bar
//
IDM_MENU MENU DISCARDABLE
BEGIN
POPUP "Cat"
BEGIN
MENUITEM "Cut", ID_EDIT_CUT
MENUITEM "Copy", ID_EDIT_COPY
MENUITEM "Paste", ID_EDIT_PASTE
END
POPUP "Dog"
BEGIN
MENUITEM "About", IDM_HELP_ABOUT
MENUITEM "Options", ID_TOOLS_OPTIONS
END
END
現在,根菜單名字是Cat和Dog,而不是Edit和Options。因為菜單條從菜單條項中取名字,而不是從菜單資源中取,所以這個改變並沒有影響應用程式。
對菜單條的長篇描述是讓您瞭解基礎知識。只有在很少見的情況下,才需要您手工操縱資源。當然,這些知識很容易使用的。