CodeBlocks插件開發(fā)指南(二)
By Lymons(lymons@gmail.com) 2010/4/14
1. 創(chuàng)建Plugin工程
① 從File主菜單中,選擇new -> Projects… , 打開工程創(chuàng)建向?qū)υ捒颉?/span>

② 在Projects的列表框中,選擇 Code::Blocks plugin ,然后點(diǎn)擊 Go 按鈕,進(jìn)入插件創(chuàng)建向?qū)υ捒颉?/span>

③ 創(chuàng)建向?qū)У牡谝粋€(gè)畫面中有重要信息說明。請注意的是里面提到了必須設(shè)置#cb, #wx這兩個(gè)全局變量。不過,還好咱們在《CodeBlock插件開發(fā)指南 一》中已經(jīng)對這兩個(gè)變量進(jìn)行了設(shè)置。
咱們在這里,直接點(diǎn)擊Next進(jìn)入到下一個(gè)畫面即可。

④ 在下面這個(gè)畫面,要設(shè)定工程標(biāo)題(Project title)和工程目錄(Folder to create project in:)。 首先要填寫Project title,也就是要寫入工程的名字。如果,工程標(biāo)題和工程目錄決定了,Project filename和 Resulting filename 會自動生成。
注意:CodeBlocks的工程文件的后綴名是.cbp
各項(xiàng)目都設(shè)定完畢后,點(diǎn)擊Next進(jìn)入到下一個(gè)畫面

⑤ 下面是設(shè)置插件的名字,也就是將來編譯成功后,系統(tǒng)自動做成的插件的名字.例如,如果在這里把 Plugin name 設(shè)定成 testplug 的話,將來會在工程目錄下生成:testplugin.zip, testplugin.dll, testplugin.cbplugin 這個(gè)三個(gè)文件。

在Plugin name 中填入你想要的插件名字。盡可能的話請使用英文。
在Plugin type 的下拉列表框中有四項(xiàng):
1. Generic
2. Tool
3. MIME handler
4. Wizard
在Options中有四個(gè)選項(xiàng):
1. Provides configuration dialog 提供配置對話框
2. Creates menu entries 提供主菜單入口
3. Creates popup men entries 提供視圖上的彈出菜單入口
4. Creates toolbar 提供工具條
上述的四個(gè)選項(xiàng)就是插件提供給用戶的四種gui接口。
默認(rèn)情況下,只有第一項(xiàng)是可選項(xiàng)。如果想要四個(gè)選項(xiàng)都可選,則需要選擇Plugin type中的Generic。為了把每個(gè)項(xiàng)目都進(jìn)行說明,我們這里選擇的是Generic
選擇Generic后,Options的四個(gè)選項(xiàng)全部變成可選狀態(tài)。
我們把這四個(gè)選項(xiàng)都選上,然后點(diǎn)擊Next, 就進(jìn)入到下一個(gè)畫面

⑥ 這個(gè)畫面是設(shè)定插件的版本,版權(quán)信息,因?yàn)槭钦f明性的工程,在這里我們什么也沒有填寫。你可以根據(jù)自己的意愿隨便進(jìn)行填寫。

⑦ 因?yàn)椴寮?span>GUI是用的是wxWidgets窗口庫,所以要在這里選擇插件所依賴的版本。
我們在這里選擇wxWidgets 2.8.x。大家應(yīng)該還記得在前面我們已經(jīng)安裝了wxWidgets 2.8.10吧。然后,點(diǎn)擊Next進(jìn)入下一畫面。

⑧ 下面是選擇編譯器,這是向?qū)υ捒蛑械淖詈笠粋€(gè)畫面。我們選擇GNU GCC Complier,然后點(diǎn)擊Finish完成插件工程的創(chuàng)建。

恭喜你,到目前為止,你就創(chuàng)建了一個(gè)CodeBlocks的插件工程了。
正常的情況下,該工程只包含一個(gè).cpp文件和一個(gè).h文件,這個(gè)文件根據(jù)你的插件名字來生成。我們這里就是testplug.cpp 和 testplug.h

注意,在testplug.cpp中包含了sdk.h 和 configurationpanel.h 這兩個(gè)頭文件,他們位于CodeBlocks開發(fā)庫中,是開發(fā)插件必不可少的兩個(gè)頭文件。而插件在連接是所需要的靜態(tài)庫是前面編譯出來的libcodeblocks.a
讓我們看看,這個(gè)插件里主要的東西:插件類的定義
#ifndef TESTPLUG_H_INCLUDED
#define TESTPLUG_H_INCLUDED
// For compilers that support precompilation, includes <wx/wx.h>
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
#include <cbplugin.h> // for "class cbPlugin"
class testplug : public cbPlugin
{
public:
/** Constructor. */
testplug();
/** Destructor. */
virtual ~testplug();
文件wx/wxprec.h, wx/wx.h 是wxWidgets庫的頭文件。
大家可以看到,插件的類的名字是 testplug, 它繼承與cbPlugin, 基類cbPlugin的定義在 cbplugin.h里。
2. 編譯&加載插件
① 現(xiàn)在我們可以從Build主菜單中選擇Build workspace來編譯這個(gè)插件工程了。不出意外的話,應(yīng)該是正常編譯通過的。如果你有編譯錯(cuò)誤的話,請你參考《CodeBlock插件開發(fā)指南 一》來配置編譯環(huán)境。
如果編譯成功的話,應(yīng)該會在工程目錄下生成如下文件:

其中有三個(gè)是最重要的文件
1. testplug.cbplugin
CodeBlocks在載入插件時(shí)所需要的文件
2. testplug.dll
插件的實(shí)現(xiàn)被封裝到這個(gè)dll文件中
3. testplug.zip.
包含了插件的版本信息,壓縮包里最主要就是manifest.xml
不過,大家會發(fā)現(xiàn),這些文件中沒有可執(zhí)行文件。這是因?yàn)椋寮旧聿⒉皇且粋€(gè)能夠獨(dú)立運(yùn)行的可執(zhí)行文件,它僅僅是一個(gè)dll,它是要依附于CodeBlocks來生存的。
② 現(xiàn)在我們可以嘗試用CodeBlocks來載入剛才我們生成的插件。在Build主菜單中選擇Run就可以運(yùn)行這個(gè)插件了。

③ 嗯,奇怪了,點(diǎn)擊Run后,運(yùn)行的怎么是Codeblocks呢。
這就對了,這里Run(運(yùn)行)的不是插件,而是裝載插件的CodeBlocks的IDE環(huán)境,而我們是要在這個(gè)IDE中加載剛才我們創(chuàng)建的那個(gè)插件。
值得注意的是,這里被運(yùn)行起來的IDE環(huán)境是在前面我們編譯成功的那個(gè)codeblocks.exe, 大家還記得吧,這個(gè)可執(zhí)行文件在codeblocks-8.02\src\devel目錄下。如果忘記了,請參考《CodeBlock插件開發(fā)指南 一》的3-④ 。
#注意,如果點(diǎn)擊Run菜單項(xiàng)后,codeblocks不能被運(yùn)行的話,有原因可能是CodeBlocks默認(rèn)設(shè)定了”只允許運(yùn)行一個(gè)實(shí)例”。所以,我們可以把這個(gè)設(shè)定去掉。我們從Settings菜單中選擇 Environments…

此時(shí),會彈出Environment settings對話框,然后我們選擇左邊的 General settings屬性頁。
在屬性頁中把 “Allow only once running instance(needs application restart to take effect)”項(xiàng)目前面的√對號符選掉。
然后重新啟動CodeBlocks生效此配置。

④ 如果,另一個(gè)CodeBlocks能夠被正確啟動,我們就要嘗試載入剛才我們創(chuàng)建成功的插件。我們應(yīng)該從Plugins主菜單中選擇 Manage plugins…
會彈出 Manage plugins對話框,然后我們點(diǎn)擊右邊的按鈕 Install new

會彈出 Select plugin to install 文件選擇對話框,此時(shí)我們定位到我們的插件工程目錄中,選擇目錄里面的testplug.cbplugin文件就可以了。

如果加載成功的話,我們會在Installed plugins: 中看到剛才我們載入的testplug插件,其實(shí)CodeBlocks載入就是我們編譯成功的testplug.dll文件。

⑤ 大家會發(fā)現(xiàn),成功載入插件后,不管我們怎么操作都不能發(fā)現(xiàn)插件的用戶接口在哪兒。這是因?yàn)椋覀儍H僅是創(chuàng)建了一個(gè)空的插件工程,該工程里只提供了各種GUI方式的接口函數(shù),并沒有任何代碼實(shí)現(xiàn),所以不會看到該插件有什么效果的。
唯一能看到視覺效果的是它的About對話框

這個(gè)對話框中,什么信息都沒有。不過你應(yīng)該可以定制它的內(nèi)容。

到目前為止,你應(yīng)該知道如何創(chuàng)建以及運(yùn)行一個(gè)插件了。接下來我們要涉及到具體的編碼了。
2. 添加右鍵彈出菜單
3. 主菜單中添加下拉菜單
4. 添加工具條
5. 在”Log&others”中添加一個(gè)面板(Panel)
6. 添加一個(gè)單獨(dú)的面板
7. 運(yùn)行
① Run
② 載入編譯好的插件