#author("2018-05-26T13:17:37+09:00","default:mat2umoto","mat2umoto") あ #author("2018-05-26T13:18:00+09:00","default:mat2umoto","mat2umoto") #contents *基本的なコードの説明 [#k03ebcb4] DevStudio(VC++6.0)のアドインプロジェクトは「DevStudio Add-in Wizard」を選択して新規作成する。~ コマンドの実装に必要な基本的なコードを以下に示す。~ |リソース|IDR_TOOLBAR_LARGE|大きいアイコンセット(32*32)&br;複数のアイコンが連結されたビットマップ画像となっており、左端から0,1,2...とIDを割り振ってアイコンを指定する。| |~|IDR_TOOLBAR_MEDIUM|小さいアイコンセット(16*16)&br;複数のアイコンが連結されたビットマップ画像となっており、左端から0,1,2...とIDを割り振ってアイコンを指定する。| |CDSAddInクラス|OnConnection()|開発環境がアドインをロードしたときに呼び出されるハンドラ&br;ここで必要なコマンドの登録を行う| |~|OnDisconnection()|開発環境がアドインをアンロードしたときに呼び出されるハンドラ| |IApplicationインタフェース|AddCommand()|コマンドを登録する関数| |~|AddCommandBarButton()|コマンドのツールバーを登録する関数| |>|CCommandsクラス|コマンドが実行されたときに処理を行うための関数を定義するクラス| *コマンド登録の手順 [#z2455d85] 以下、Fooというコマンドを登録する例を記述する。 +実装 ++ツールバーアイコンの準備~ IDR_TOOLBAR_LARGE と IDR_TOOLBAR_MEDIUM を編集して好きなアイコンを準備する。 ++コマンドの名称と説明文を準備する~ ストリングテーブルに準備する例 |ID|値|h |IDS_CMD_FOO_NAME|Foo| |IDS_CMD_FOO_STRING|\nFoo\nFooコマンドを実行する\nFooコマンド| ※あとで2つの文字列を連結してIApplication::AddCommand() の第1引数に渡す。この第1引数には、\nで区切られた4つの文字列を渡す必要がある。~ (1)コマンド名(ユニークな名称の必要がある)~ (2)ツールバー表示用のテキスト~ (3)コマンドの説明テキスト~ (4)ツールヒント用のテキスト~ ++コマンドの登録~ CDSAddIn::OnConnection()のコードを編集し、コマンドを登録する。登録は IApplication::AddCommand() と IApplication::AddCommandBarButton() を用いて行う。ウィザードによって追加されたサンプルコードが参考になるはず(このサンプルコードは邪魔なので必要無くなったら消した方がよい)。~ 以下、Fooコマンドの登録例~ #code(c){{ : VARIANT_BOOL bRet; CString strCmdName; CString strCmdString; short bmpOffset = 0; // Fooコマンドの登録 strCmdName.LoadString(IDS_CMD_FOO_NAME); strCmdString.LoadString(IDS_CMD_FOO_STRING); strCmdString = strCmdName + strCmdString; VERIFY_OK(pApplication->AddCommand(CComBSTR(strCmdString), CComBSTR(strCmdName), bmpOffset++, m_dwCookie, &bRet)); if(bRet == VARIANT_FALSE){ *OnConnection = VARIANT_FALSE; return S_OK; } if(bFirstTime == VARIANT_TRUE){ VERIFY_OK(pApplication->AddCommandBarButton(dsGlyph, CComBSTR(strCmdName), m_dwCookie)); } : }} ※ここでは、コマンド名(IApplication::AddCommand()の第1引数の先頭文字列)と後で実装する関数名(IApplication::AddCommand()の第2引数)を同じにしているが、必ずしも同じにする必要は無い。~ ++コマンドに対応付けられるメソッドの追加~ クラスビューのツリーから「ICommands」を右クリックし、「メソッドの追加」を行う。(引数を持たないメソッドしか作成できない?)~ メソッドは、IApplication::AddCommand() の第2引数に渡した文字列と同じ名称にすること。この例では「Foo」メソッドを追加することになる。 ++メソッドの実装~ CCommands::Foo() が追加されているので、実装を行う。~ 実装の際、開発環境のオブジェクトを操作することができる。~ その場合は、CCommands::m_pApplication 変数を基に必要なオブジェクトを取得することになる。~ ~ 以下に、現在選択されている文字列を取得して前後に()を付与する例を示す。~ #code(c){{ CComPtr<IDispatch> pDisp; // TextDocumentオブジェクトを取得する CComQIPtr<ITextDocument, &IID_ITextDocument> pTextDocument; m_pApplication->get_ActiveDocument(&pDisp); pTextDocument = pDisp; pDisp = NULL; if(!pTextDocument){ return; } // TextSelectionオブジェクトを取得する CComQIPtr<ITextSelection, &IID_ITextSelection> pTextSelection; pTextDocument->get_Selection(&pDisp); pTextSelection = pDisp; pDisp = NULL; if(!pTextSelection){ return; } // 選択中テキストを取得する BSTR bstr; pTextSelection->get_Text(&bstr); CString strSelection(bstr); // 前後に()を付与 strSelection = "(" + strSelection + ")"; // テキストを挿入する pTextSelection->put_Text(strSelection.AllocSysString()); }} ~ また、DevStudioオブジェクトは引数にVariant型が使われている場合がある。そのようなプロパティやメソッドは下記のように使用できる。 #code(c){{ // TextSelectionオブジェクトのStartOfLineメソッドの使用例 // CComVariantクラスを使用できる // dsFirstText や dsMove は enum定数として定義済みだが、数値を指定してもよい pTextSelection->StartOfLine(CComVariant(dsFirstText), CComVariant(dsMove)); }} +アドインの使用 ++アドインの配置 実装が完了したら、ビルドを行う。作成されたDLLを開発環境のAddinフォルダに配置する。(C:\Program Files\Microsoft Visual Studio\COMMON\MSDev98\AddIns)~ ++アドインの登録 開発環境を起動し、メニューの「ツール」-「カスタマイズ」-「アドインおよびマクロファイル」を開くと、作成されたアドイン名が表示されているので、チェックを付けてダイアログを閉じる。 +その他 開発環境を操作したときのイベントに応じて処理を行いたい場合は、ウィザードによって追加されているイベントハンドラを実装する。 |CCommands::XApplicationEvents::*()|Applicationオブジェクトのイベント| |CCommands::XDebuggerEvents::*()|Debuggerオブジェクトのイベント|