• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            桃源谷

            心靈的旅行

            人生就是一場旅行,不在乎旅行的目的地,在乎的是沿途的風(fēng)景和看風(fēng)景的心情 !
            posts - 32, comments - 42, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            CodeBlocks插件開發(fā)指南(三)

            Posted on 2010-04-29 20:58 lymons 閱讀(2309) 評論(0)  編輯 收藏 引用 所屬分類: C++C開發(fā)環(huán)境

               CodeBlocks插件開發(fā)指南(三)

            By Lymons(lymons@gmail.com) 2010/4/25


            1. 添加右鍵彈出菜單
            我們在這里,將會在插件中加入右鍵彈出菜單功能。也就是如下圖那樣,在文檔區(qū)內(nèi),點擊鼠標右鍵時會彈出的菜單。我們將在這個菜單中加入屬于我們插件的菜單項目”testplug”


            加入菜單項目的效果如下圖:



            讓我們看看,咱們創(chuàng)建的插件工程中,給我們提供了什么樣的入口代碼了吧。

            1.
            在函數(shù)BuildModuleMenu中添加菜單項。
            在文檔的視圖里才加入菜單項的入口函數(shù)是BuildModuleMenu,它的初始代碼是下面那樣:

               1 void testplug::BuildModuleMenu(const ModuleType type, wxMenu* menu, const FileTreeData* data)
            2 {
            3     //Some library module is ready to display a pop-up menu.
            4     //Check the parameter \"type\" and see which module it is
            5     //and append any items you need in the menu
            6     //TIP: for consistency, add a separator as the first item
            7     NotImplemented(_T("testplug::BuildModuleMenu()"));
            8 }

             

            其實該函數(shù)就是一個往日志里打印log而已,里面調(diào)用的函數(shù)NotImplemented也不起到任何作用,可以無視。
            其中函數(shù)參數(shù)的意義如下:
              
            type   當(dāng)前運行的是CodeBlocks的哪個模塊
              
            men      編輯器的右鍵彈出菜單的實例的指針
                 
            data     IDE環(huán)境的文件數(shù)列表數(shù)據(jù)的指針


            接下來,讓我看看應(yīng)該在這個函數(shù)里加入什么樣的代碼才能加入我們菜單項目

             1 void testplug::BuildModuleMenu(const ModuleType type, wxMenu* menu, const FileTreeData* data)
             2 {
             3     //Some library module is ready to display a pop-up menu.
             4     if (!menu || !IsAttached())
             5         return;
             6     //Check the parameter \"type\" and see which module it is
             7     //and append any items you need in the menu
             8     if (type == mtEditorManager) {
             9         menu->AppendSeparator();
            10         menu->Append(idTestPlug, _("TestPlug"), _("hello world"));
            11     }
            12     //TIP: for consistency, add a separator as the first item
            13     NotImplemented(_T("testplug::BuildModuleMenu()"));
            14 }

             

            IsAttached函數(shù)的意思是檢查插件是否已經(jīng)被載入到CodeBlocks中,沒有載入插件的場合返回FALSE.

            如果當(dāng)前運行的模塊是CodeBlocks的編輯器的話,我們就可以插入我們的菜單項了。插入菜單項的方法非常簡單,就是利用wxMenuAppend接口就可以了。如上面的代碼中使用了如下的語句:
              menu->Append(idTestPlug, _("TestPlug"), _("hello world"));

            該接口的原型聲明為:

            wxMenu::Append
            wxMenuItem* Append(int id, const wxString& item = "", const wxString& helpString = "", wxItemKind kind = wxITEM_NORMAL)

            id:         菜單項的ID.
            item:       
            是在右鍵彈出菜單中顯示的字符串
            helpString:
            是在狀態(tài)條中顯示的字符串
            kind:       菜單項的類型

            我們在第二個參數(shù)item設(shè)置成字符串TestPlughelpString隨便傳一個字符串,第四個參數(shù)kind不用寫,使用默認值即可。

            注意,上面代碼中的menu->AppendSeparator()表示在菜單項中加入一個分割線。AppendSeparator同樣也是wxMenu類的一個成員。

             

            2. 給菜單項創(chuàng)建資源ID

            里面最重要的一個參數(shù)非id莫數(shù)了,因為在GUI中,參單項跟畫面上的控件一樣都屬于插件的資源,所以它也應(yīng)該有一個資源ID,也就是我們這里的參數(shù)id.所以,接下來我們要給菜單項添加一個資源標示。
            const int idTestPlug = wxNewId();  

            如上所示,使用wxNewId函數(shù)來創(chuàng)建一個資源id,并賦值給idTestPlug
            因此,把上述的語句加入到源文件的開始處即可. 即把idTestPlug作為一個全局變量來使用.

            注:wxNewID實際上是一個返回static的全局引用計數(shù)的函數(shù)。在C++中允許在全局變量定義時執(zhí)行某個函數(shù),讓函數(shù)的返回值賦值給全局變量。這在C中是不允許的。

             

            3. 在事件管理表中加入事件處理函數(shù)

            接下來,在插件的event table中加入菜單項被單擊后的事件處理函數(shù)。如下:

            1 // events handling
            2 BEGIN_EVENT_TABLE(testplug, cbPlugin)
            3     // add any events you want to handle here
            4     EVT_MENU(idTestPlug, testplug::OnTestPlug)
            5 END_EVENT_TABLE()

             

            注意,我們這里加入的事件處理函數(shù)的名字是OnTestPlug, 其實我們就是通過宏EVT_MENUidTestPlug和該函數(shù)關(guān)聯(lián)起來。

             

            4. 聲明事件處理函數(shù)

            testplug類中要做一下事件處理函數(shù)的聲明,如下:

               
                
            private:
                    
            void OnTestPlug(wxCommandEvent &event);
             
                    DECLARE_EVENT_TABLE();


             

            OnTestPlug函數(shù)的參數(shù)event是被傳入的是一個事件的實例,它的類名是wxCommandEvent


            5. 實現(xiàn)事件處理函數(shù)

            這里,我們就可以為所欲為了,在OnTestPlug中添加的代碼,在TestPlug菜單項被電擊之后就可以被執(zhí)行了。為了簡單起見,函數(shù)很簡單,僅僅是彈出一個消息框而已。

            1 void testplug::OnTestPlug(wxCommandEvent &event)
            2 {
            3     cbMessageBox(_("This is my first Plugin test program"), _("Info"), wxICON_QUESTION);
            4 }

             

            數(shù)里面僅僅使用cbMessageBox來彈出一個消息。 

            OK了,如果上述的代碼沒有敲錯任何字符的話,你就可以沒有任何錯誤的編譯通過了。如果編譯沒有問題,你就按照5-把你編譯好的插件重新載入到CodeBlocks里了。當(dāng)然在重新載入前,你先得把老版本的插件卸載掉。記住,每次你的插件有什么改動的話,你必須都得這么做。

             

            如果上面的步驟都沒有問題,你可以試試在編輯器中點擊鼠標右鍵,是不是可以發(fā)現(xiàn)右鍵菜單上多了一個 TestPlug 的菜單項。

             

            然后你點擊這個菜單項,是不是就彈出下面的對話框了吧。

            如果沒有出來的話,你就應(yīng)該反復(fù)的檢查上面的任何一個步驟,看看是否有什么沒有照做的地方。

             

            CodeBlock里添加一個菜單項還是很簡單吧。一共就用了不到10行程序就搞定了。接下來,我們將嘗試在CodeBlocks的主菜單里添加一個同名的菜單項。

             

            2. 主菜單中添加下拉菜單
            假設(shè)我們想象下面那樣,在CodeBlocksTools主菜單中加入一個菜單項,那該如何做呢?


            為了方便起見,我們這里加入的菜單項跟上一步的菜單名字是一樣,功能也是一樣的。也就是使用同一個資源id就行了,就是上一步中的idTestPlug. 如果想設(shè)定不同的名字,不同的功能,你可以重復(fù)上一步中的2~5的步驟就可以了。

            關(guān)鍵是要找到,在系統(tǒng)菜單中加入菜單項的入口函數(shù)在哪里。這個函數(shù)就是testplug類的成員函數(shù)BuildMenu。我們可以看它的初始代碼是什么樣的。

               void testplug::BuildMenu(wxMenuBar* menuBar)
            {
                
            //The application is offering its menubar for your plugin,
                
            //to add any menu items you want
                
            //Append any items you need in the menu
                
            //NOTE: Be careful in here The application's menubar is at your disposal.
                NotImplemented(_T("testplug::BuildMenu()"));
            }

             

            BuildModuleMenu函數(shù)一樣,它的初始化函數(shù)基本上也是空的。里面僅僅調(diào)用了一個無關(guān)緊要的函數(shù)NotImplemented。大家注意到,這個函數(shù)的參數(shù)menBar了吧,它是wmMenuBar的實例的指針,這個實例就是系統(tǒng)菜單條(menuBar)的實例。我們只要利用這個實例的接口函數(shù)來加入我們的菜單項了。

            下面,我們看看如何修改這個函數(shù)。

             1 void testplug::BuildMenu(wxMenuBar* menuBar)
             2 {
             3     //The application is offering its menubar for your plugin,
             4     //to add any menu items you want
             5     if (!IsAttached())
             6         return;
             7     //Append any items you need in the menu
             8     int pos = menuBar->FindMenu(_("&Tools"));
             9     if (pos != wxNOT_FOUND) {
            10         m_ToolsMenu = menuBar->GetMenu(pos);
            11         m_ToolsMenu->AppendSeparator();
            12         m_ToolsMenu->Append(idTestPlug, _("TestPlug\tCtrl-1"));
            13     }
            14  
            15     //NOTE: Be careful in here The application's menubar is at your disposal.
            16     NotImplemented(_T("testplug::BuildMenu()"));
            17 }

             

                   首先,跟上一節(jié)一樣,我們在加入我們的任何動作之前,都要判斷我們的插件是否已經(jīng)被載入到CodeBlock中了,這時候使用IsAttached()就可以了。

                   在菜單條menBar中找到Tools主菜單的位置
            使用的函數(shù)是FindMenu, 參數(shù)就是菜單的名字,即一個字符串。該函數(shù)的返回值是該菜單的位置索引,如果查找的菜單不在主菜單中的話,它會返回wxNOT_FOUND.

                   根據(jù)這個位置得到Tools菜單的實例
            使用函數(shù)GetMenu就可以得到菜單的實例了,該函數(shù)參數(shù)就是菜單的位置索引,也就是上一步FindMenu的返回值。

                   利用這個實例就可以在Tools菜單中加入TestPlug菜單項了。
            有了菜單的實例,就可以跟在右鍵彈出菜單那樣,在里面加入我們自己的菜單項。方法跟1-1是一樣的,這里就不重復(fù)了。
            注意:在Apennd函數(shù)的第二個參數(shù)是菜單項的名字,我們這里是"TestPlug\tCtrl-1"。這個字符串里有"\tCtrl-1"的字樣,表示激活該菜單項的快捷間是Ctrl-1. 也就是你在IDE中按下Ctrl-1鍵就會執(zhí)行該菜單項對應(yīng)消息處理函數(shù),在我們的例子中,則是彈出下面的消息框:

            到此為止,在主菜單中添加菜單項的任務(wù)就完成了。如果想要為該菜單項添加自己的消息處理函數(shù),則重復(fù)上一步中的2~5的步驟就可以了。

            我的個人簡歷第一頁 我的個人簡歷第二頁
            亚洲综合久久综合激情久久| 99久久超碰中文字幕伊人| 久久精品国产亚洲AV无码娇色| 亚洲va国产va天堂va久久| 国产精品久久久久9999高清| 久久综合久久综合久久综合| 亚洲伊人久久综合影院| 久久久久99精品成人片欧美| 久久最新精品国产| 亚洲国产日韩综合久久精品| 久久99精品久久久久久久久久 | 欧美无乱码久久久免费午夜一区二区三区中文字幕| 久久国产影院| 精品国产VA久久久久久久冰| 国内精品久久久久国产盗摄| 日本福利片国产午夜久久| 波多野结衣久久一区二区| 很黄很污的网站久久mimi色| 一本一本久久A久久综合精品| 久久中文字幕精品| 成人精品一区二区久久| 国产99久久九九精品无码| 一本一本久久aa综合精品| 免费一级做a爰片久久毛片潮| 久久久久亚洲AV成人网| 精品久久久久久无码专区| 久久人人爽人人爽人人片AV麻烦 | 久久人妻少妇嫩草AV蜜桃| 久久久精品免费国产四虎| 亚洲色大成网站www久久九| 亚洲精品视频久久久| 三级韩国一区久久二区综合| 久久国产午夜精品一区二区三区| 久久国产高清字幕中文| 91精品国产高清久久久久久国产嫩草| 麻豆成人久久精品二区三区免费| 久久亚洲精品成人AV| 无码AV波多野结衣久久| 亚洲伊人久久精品影院| 亚洲午夜无码久久久久| 亚洲精品乱码久久久久久自慰|