天天看點

Windows Mobile 菜單條資源使用

菜單條資源         

     菜單條在很多方面都像一個工具條控件。檢視菜單條使用的資源,會看到這兩個對象的一些差别是在于外觀上。圖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 

     POPUP "Edit"

     BEGIN

         MENUITEM "Cut",                          ID_EDIT_CUT

         MENUITEM "Copy",                         ID_EDIT_COPY

         MENUITEM "Paste",                        ID_EDIT_PASTE

     END

     POPUP "Tools"

         MENUITEM "About",                        IDM_HELP_ABOUT

         MENUITEM "Options",                      ID_TOOLS_OPTIONS

大多數情況下,不需要準确的知道資源編輯器在資源中放置了什麼資源。然而,有必要了解格式,這樣可以容易的更改使用了菜單條的應用程式,也可以在碰到使用的裝置上資源編輯器不能建立菜單條控件的時候,來友善使用。資源實際上就是對工具條上按鈕的描述。下面的代碼提供了前述資料的格式:

    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,

       TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_HELP,      0,          1,

     0,            ID_BACKBTN,         TBSTATE_ENABLED, 

       TBSTYLE_AUTOSIZE,                     0,            ID_BACKBTN, 2,

資源檔案中的第一行中,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)兩個菜單項。 按鈕上顯示的文字是來自菜單條資源中,而不是來自菜單資源。例如,

可以按下面的代碼來修改菜單資源,而不用改變菜單條中的文本。

     POPUP "Cat"

     POPUP "Dog"

現在,根菜單名字是Cat和Dog,而不是Edit和Options。因為菜單條從菜單條項中取名字,而不是從菜單資源中取,是以這個改變并沒有影響應用程式。

對菜單條的長篇描述是讓您了解基礎知識。隻有在很少見的情況下,才需要您手工操縱資源。當然,這些知識很容易使用的。

本文轉自peterzb部落格園部落格,原文連結:http://www.cnblogs.com/peterzb/archive/2009/05/19/1460966.html,如需轉載請自行聯系原作者。