青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

桃源谷

心靈的旅行

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

CodeBlocks插件開發指南(三)

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

   CodeBlocks插件開發指南(三)

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


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


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



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

1.
在函數BuildModuleMenu中添加菜單項。
在文檔的視圖里才加入菜單項的入口函數是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 }

 

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


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

 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函數的意思是檢查插件是否已經被載入到CodeBlocks中,沒有載入插件的場合返回FALSE.

如果當前運行的模塊是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:
是在狀態條中顯示的字符串
kind:       菜單項的類型

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

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

 

2. 給菜單項創建資源ID

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

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

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

 

3. 在事件管理表中加入事件處理函數

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

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()

 

注意,我們這里加入的事件處理函數的名字是OnTestPlug, 其實我們就是通過宏EVT_MENUidTestPlug和該函數關聯起來。

 

4. 聲明事件處理函數

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

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


 

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


5. 實現事件處理函數

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

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

 

數里面僅僅使用cbMessageBox來彈出一個消息。 

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

 

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

 

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

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

 

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

 

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


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

關鍵是要找到,在系統菜單中加入菜單項的入口函數在哪里。這個函數就是testplug類的成員函數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函數一樣,它的初始化函數基本上也是空的。里面僅僅調用了一個無關緊要的函數NotImplemented。大家注意到,這個函數的參數menBar了吧,它是wmMenuBar的實例的指針,這個實例就是系統菜單條(menuBar)的實例。我們只要利用這個實例的接口函數來加入我們的菜單項了。

下面,我們看看如何修改這個函數。

 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 }

 

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

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

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

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

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

我的個人簡歷第一頁 我的個人簡歷第二頁
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲免费不卡| 一区二区三区|亚洲午夜| 欧美在线免费观看亚洲| 亚洲在线播放| 国产又爽又黄的激情精品视频| 亚洲欧美综合v| 午夜精品久久久久久久蜜桃app | 久久精品国产视频| 国产精品视频专区| 久久精品在线视频| 久久精品国产一区二区电影| 亚洲高清免费在线| 亚洲人久久久| 国产精品―色哟哟| 久热精品在线视频| 欧美成人免费播放| 篠田优中文在线播放第一区| 久久福利电影| 一区二区三区免费看| 亚洲欧美电影在线观看| 精品盗摄一区二区三区| 亚洲欧洲免费视频| 国产日韩欧美一区在线| 欧美国产综合| 国产精品视频不卡| 欧美国产亚洲精品久久久8v| 欧美性猛片xxxx免费看久爱| 久久久国产亚洲精品| 欧美电影免费观看大全| 午夜久久久久久久久久一区二区| 久久精品女人| 亚洲视频在线视频| 久久精品免费播放| 亚洲在线观看免费视频| 久久亚洲精品伦理| 亚洲欧美日本国产有色| 久久婷婷国产综合精品青草| 亚洲图片在线| 欧美成人中文字幕| 久久精品99无色码中文字幕 | 亚洲午夜一区二区三区| 亚洲大胆女人| 亚洲欧美电影院| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲欧美日韩一区在线| 亚洲国产高清一区二区三区| 亚洲欧美成人综合| 中文一区二区| 免费在线成人| 久久久水蜜桃av免费网站| 欧美日韩直播| 亚洲国产高清在线观看视频| 国内精品久久久久影院色| 99日韩精品| 99国产精品| 欧美jizz19hd性欧美| 免费亚洲电影| 激情成人综合网| 欧美一区二区三区在线| 欧美一区二区三区免费观看视频 | 午夜精彩视频在线观看不卡| 一本色道久久综合| 欧美日韩中文在线观看| 亚洲全部视频| 中文国产亚洲喷潮| 欧美日韩不卡合集视频| 亚洲欧洲一级| 一本色道精品久久一区二区三区 | 欧美精品日韩三级| 亚洲激情偷拍| 亚洲视频在线观看| 欧美性事免费在线观看| 一本色道**综合亚洲精品蜜桃冫| 在线视频欧美一区| 欧美日韩中文字幕| 亚洲视频在线观看视频| 亚洲欧美久久| 国产婷婷色综合av蜜臀av| 欧美一区国产一区| 免费在线欧美视频| 中文av一区特黄| 老色批av在线精品| 国产一区二区欧美| 久久久亚洲国产天美传媒修理工| 久久久综合网站| 91久久香蕉国产日韩欧美9色 | 亚洲精品久久久久久久久| 一本色道久久加勒比88综合| 欧美日韩精品免费| 午夜精品视频| 亚洲国产精品毛片| 亚洲女同精品视频| 国产一区二区精品在线观看| 麻豆精品网站| 一区二区免费在线视频| 久久在精品线影院精品国产| 亚洲精品免费一区二区三区| 国产精品久久久久久久久久尿| 午夜精品三级视频福利| 欧美国产视频一区二区| 亚洲永久免费精品| 国产婷婷97碰碰久久人人蜜臀| 麻豆成人在线播放| 亚洲欧美激情视频| 欧美激情欧美激情在线五月| 亚洲网址在线| 在线色欧美三级视频| 欧美日韩一区二区高清| 久久久九九九九| 亚洲午夜国产一区99re久久| 免费欧美日韩| 午夜精品理论片| 亚洲日本成人在线观看| 国产女主播在线一区二区| 欧美成人性网| 欧美自拍偷拍| 亚洲视频网在线直播| 亚洲成人在线视频播放| 久久精品一区蜜桃臀影院 | 国产亚洲二区| 欧美日韩美女| 欧美岛国激情| 久久久久久久综合色一本| 一区二区精品在线| 亚洲国产精品一区二区久| 久久久国产精品一区二区三区| 一区二区三区日韩在线观看| 亚洲国产精品123| 国产手机视频一区二区| 欧美午夜在线观看| 欧美国产在线视频| 免费欧美日韩| 久久一区二区视频| 久久国产精品久久久久久电车| 一级成人国产| 妖精成人www高清在线观看| 亚洲欧洲精品一区二区三区不卡 | 亚洲欧洲日韩综合二区| 理论片一区二区在线| 久久久999精品视频| 久久www成人_看片免费不卡| 亚洲一区二区在线免费观看| 宅男精品视频| 亚洲影音一区| 亚洲欧美日韩一区二区| 亚洲免费一在线| 亚洲欧美视频一区二区三区| 午夜精品久久久久久久久| 亚洲自拍偷拍麻豆| 午夜精品久久久久久久蜜桃app| 亚洲午夜免费福利视频| 亚洲自拍偷拍一区| 亚洲欧美视频一区| 久久本道综合色狠狠五月| 欧美专区日韩专区| 久色成人在线| 亚洲电影在线观看| 日韩视频精品在线| 亚洲一区二区精品在线| 午夜精品影院在线观看| 欧美一区二区视频免费观看| 久久久精品tv| 欧美激情在线| 国产精品视频精品| 黄网站免费久久| 日韩网站在线观看| 亚洲欧美三级在线| 美日韩精品视频| 91久久国产综合久久| 亚洲色图自拍| 久久国产直播| 欧美紧缚bdsm在线视频| 国产精品久久久久999| 狠狠狠色丁香婷婷综合激情| 亚洲激情另类| 先锋亚洲精品| 亚洲国产成人午夜在线一区 | 亚洲国产免费看| 亚洲午夜激情网站| 久久亚洲综合色一区二区三区| 免费一级欧美片在线观看| 国产精品第一区| 在线观看日韩一区| 亚洲欧美日韩成人高清在线一区| 久久精品一区二区三区四区| 亚洲激情一区二区| 欧美一区二区三区久久精品| 免费亚洲电影在线| 国产精品一香蕉国产线看观看| 亚洲国产精品久久久久秋霞不卡| 亚洲在线观看| 亚洲高清在线观看| 欧美一区二区三区另类| 欧美日韩一区二区在线视频| 狠狠色狠狠色综合日日tαg| 亚洲自拍偷拍视频| 亚洲黄色天堂| 久久影视精品| 韩国av一区二区三区四区| 亚洲香蕉在线观看|