【要望】プラグイン作成のサンプル

  1. プラグイン作成始めました
    =========================

    Hi!
    おひさしぶりです。玄米茶です。

    いつの間にか始まってた冷やし中華みたいに、なんとなくプラグイン作成始めました。

    そこで要望というか質問みたいなものなのですが、C版のカスタムバーのサンプルプログラムを作って頂けないでしょうか。デルファイ版はあるようですが、残念ながら勉強不足なものですみません。

    ```cpp
    // 構造体初期化
    CUSTOM_BAR_INFO cb;
    cb.cbSize = 200;
    cb.hwndClient = 0;
    cb.hwndCustomBar = hwnd;
    cb.iPos = CUSTOM_BAR_RIGHT;
    cb.pszTitle = (LPCWSTR)L"カスタムバー";

    // カスタムバーを開きます
    UINT cbid = Editor_CustomBarOpen(hwnd, &cb);

    // カスタムバーを閉じる
    //Editor_CustomBarClose(hwnd, cbid);
    ```

    今のところこんな感じでカスタムバーを呼び出しています。
    現状 ON/OFF は出来るようになったのですが、そこへの文字列の表示となると使い方に全く見当がつかない状態です。

    このままでは、私のやる気が冷やし中華みたいに季節限定になってしまいそうです。

    是非とも店の定番メニューに昇格させたいので、御一考よろしくお願いします。
    (ホント簡単なサンプルでかまいません)

    【追伸】
    Editor_GetSelType のフラグに定義されている数値が古くなってました。

        #define SEL_TYPE_NONE 0
        #define SEL_TYPE_CHAR 1 → 33
        #define SEL_TYPE_BOX 2  → 34

    といっても、基本変わって無いようなので今のところ問題ないです。
    Plugin SDK もそのうちでいいので更新よろしくお願いします。

    今後はマクロだけじゃなくプラグインの話題も盛り上がる事を期待しつつ、
    それでは!

     |  玄米茶  |  返信
  2. ●玄米茶 さん

    プラグイン一開発者の ks です.
    作成者仲間が増えるのは大歓迎ですので,是非頑張って下さい.

    カスタムバーに文字やボタンなどを表示するには,コントロールをどう作るかが問題です.
    私はダイアログを ATL+WTL で作り,それをバーに貼り付けています.
    玄米茶さんは C++(?) で作られているようですが,コントロールは何で作られる予定でしょうか(SDK / MFC/ WTL / etc...)
    それによっては,私でもサンプルを提示できるかもしれません.
    # 特にまだ決められてないようでしたら,先日公開された VS Community 2013 が MFC を使えると言うことで今確認中ですが,使えるなら MFC がお勧めです.
    # ただ入れるのに 9GB とか必要なので,手軽には確認できないですが.

     |  ks  |  返信
  3. ● 玄米茶 さん

    お久しぶりですね!お元気そうでなによりです。
    結論から申しますと、私、C 言語さぱーり分かりません… サンプルもあの程度が限界で…ゴホ、ゴホ。
    C 言語だとカスタムバーどうやって開くんだコレ!?と思ったので SDK にサンプルを同梱できませんでした。
    スミマセン。

    > Editor_GetSelType のフラグに定義されている数値が古くなってました。

    ご報告ありがとうございます。
    そういえば SDK のほう更新するの忘れてた気がします。確認しておきます。

    ● ks さん

    ご対応ありがとうございます。
    私より ks さんの方がプラグイン開発にお詳しいと思いますので、ご協力いただけて心強いです!

    何の力にもなれず、申し訳ございません…

     |  Kuro  |  返信
  4. ●kuro さんへ

    普通にお久しぶりです。って挨拶しちゃったけど、よくよく考えたら1年半(あれ? もしかしてもっと?)くらいぶりでしたね。  
    改めましてHPリニューアルおめでとうございます(おせーよw)。  
    機会があれば書き込もうと思っていたのですが、時が経つのは早いですね。  

    サンプルの件は少し残念ですがあきらめます。私も夏の終わりからC言語、秋頃からプラグイン作成を始めたのでサンプルがあっても使えたかどうか怪しいものですから、どうぞお気になさらずに。  

    カスタムバーは暫くお預けにして、別ページに文字列操作の結果を表示することにしました。その際に更新状態とUndoバッファを空にしてすぐに閉じられる様にしました。  

    ```cpp
    // 更新状態・Undoバッファを空に  
    Editor_EmptyUndoBuffer(hwnd);  
    Editor_SetModified(hwnd, FALSE);  
    ```

    これマクロには無い機能なので便利ですよね。  
    (ちょいちょいこんなの挟んだらdll作成に興味持ってくれる人増えるかな?)  

    kuroさんには溜まってた不具合報告と要望を別スレッドに用意します、それではまた!  

    ●ks さんへ

    ks さんとは実はお久しぶりなんです。  
    去年 ks さんのHPでお世話になっていたんですよ。今年は C++ に手を出しちゃいました。でもC言語で最初に作ったのは『C++版ゆっくりボイスで読み上げプラグイン』なのでこの辺あんまり変わってませんね。おっと、今年はちゃんと漢字かな交じりを変換出来るようになりましたよ!  

    でも時々エラーで落ちます。ダメじゃーんwww  

    多分バッファが少ないのかも!? まあだいたい動けば……  
    あっゴメンゴメン全く成長してなかったわ。  

    挨拶長すぎました。  

    カスタムバーに関してなのですがデルファイで用意された物を操作するものだと勘違いしていました。となると、カスタムバーのハンドルを取得してボタンなどコントロールの親に設定するという事になるのでしょうか? 
    (……孫ウィンドウのハンドルの取得ってどうやるんだろ、調べなきゃ。 Editor_CustomBarOpen()でハンドルが返ればよかったんですが管理番号ですよね……。)  

    あと、コントロール(SDK,MFC,WTL,etc...)に Win32 API って含まれます?  
    まだ勉強始めたばかりでフレームワークまで進んでないので Win32 API 以外一切使ったこと無いです。  

    ああC#の頃を思い出してきた。あの頃も私一切分かってなかったですよね。  
    まだこんな状態なので、サンプルいただくのは早いかもしれません。  
    でも、もちろんあるに越したことは無いですしあれば弄って学べるので、ks さんが負担にならない程度なら是非お願いします。  

    コントロールにこだわりは無いので、もしサンプルを作って頂けるなら MFC でも何でも使って頂いて結構です。それに合わせて環境用意し勉強します。  

    それでは!

     |  玄米茶  |  返信
  5. ● 玄米茶 さん

    > 去年 ks さんのHPでお世話になっていたんですよ。今年は C++ に手を出しちゃいました。でもC言語で最初に作ったのは『C++版ゆっくりボイスで読み上げプラグイン』なのでこの辺あんまり変わってませんね。おっと、今年はちゃんと漢字かな交じりを変換出来るようになりましたよ!  
    > でも時々エラーで落ちます。ダメじゃーんwww  

    更新サボってて申し訳ありません.1 年放置してしまってるので,今回の VS Community 2013 公開で何とか Blog も更新しようかと思います.
    ゆっくりボイス読み上げプラグインですか,懐かしい話です.
    ただ落ちるのは……多分メモリ回りのバグですかね.
    きちんと書いていないサンプルは,結構メモリ回り適当だったりするので.

    > カスタムバーに関してなのですがデルファイで用意された物を操作するものだと勘違いしていました。となると、カスタムバーのハンドルを取得してボタンなどコントロールの親に設定するという事になるのでしょうか? 
    > あと、コントロール(SDK,MFC,WTL,etc...)に Win32 API って含まれます?  
    > まだ勉強始めたばかりでフレームワークまで進んでないので Win32 API 以外一切使ったこと無いです。 

    カスタムバーの呼び出し方は書かれている通りで問題なくて,課題なのはそこに表示するボタンや文字の扱いなんです.
    普通のアプリ同様にダイアログを作成して,それをカスタムバーに貼り付ける(Editor_CustomBarOpen に渡す)必要があって,このダイアログを作成するのはプラグイン開発の知識と言うよりは Windows の GUI プログラミングの話になってきます.
    Delphi では標準の GUI フレームワークが提供されているので迷う必要が無いのですが,C++ は標準の GUI フレームワークなんてものはないので,自分で一から書く(Win32API)か,公開されているフレームワークを利用することになります.
    Win32API で書けるのでしたらそれでも OK なんですが,コード量が増えますし管理も大変なので,一般的にはフレームワークの利用をお勧めします(軽量,高速なんてものを目指すなら Win32API もありですが).
    すぐにサンプルは提示できませんが,Win32API の場合は CreateWindow で作成したウィンドウハンドルを Editor_CustomBarOpen に渡します.
    このフレームワークというのが結構な数ありまして,有名どころが先に挙げた MFC, WTL や,後 Qt, GTK+ あたりでしょうか.
    フレームワークがあると,リソースエディタ上でコントロールを貼ったり移動したりと作成が楽でわかりやすいですし,コード量も減ります.
    なので,世間一般の Windows アプリはほぼ何らかのフレームワークを利用していると思います.
    C# でのプラグイン開発を進めていたのはこの GUI 環境回りのこともあって,C#(正確には .NET)は標準の GUI 環境が用意されていますし,その扱いも極めて楽です(凝ったことをしなければ).

    Win32API でのサンプルは,使われるようでしたらご用意します.
    が,フレームワーク利用にどっぷり浸かった身なので,しばしお待ち下さい.思い出します.

     |  ks  |  返信
  6. ボタンを付けてみた
    ===================

    なんだかややこしい事になってきた感がありますが、誰かの何かのキッカケになるかもしれないので出来るとこまでやって残しておこう。  
    ということで、アドバイスのとおりカスタムバーのハンドルを取得して、ボタンの親に設定してみました。  
    おかげさまで、みごとにボタンが出来ました! なるほどこうやって使うものなのですね。  
    苦労した分、モフモフしまくりです。(まぁ何もしないボタンですが)  

    ```cpp
    // 構造体初期化
    CUSTOM_BAR_INFO cb;
    cb.cbSize = 200;
    cb.hwndClient = 0;
    cb.hwndCustomBar = hwnd;
    cb.iPos = CUSTOM_BAR_RIGHT;
    cb.pszTitle = (LPCWSTR)L"カスタムバー";

    // カスタムバーを開きます
    UINT cbid = Editor_CustomBarOpen(hwnd, &cb);

    // カスタムバーのハンドルを取得
    HWND chhwnd = FindWindowEx( hwnd, 0, L"TPanel", 0);
    HWND cbhwnd = FindWindowEx( chhwnd, 0, L"TPanelEx", cb.pszTitle);

    // (何もしない)ボタン生成
    CreateWindow(
        TEXT("BUTTON"), TEXT("モフモフ"),
        WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
        0, 0, 100, 25,
        cbhwnd, NULL, (HINSTANCE)cbid, NULL
    );
    /*
       HINSTANCE にカスタムバーの ID 入れてみたけど正しいか分かりません。  
       ks さんの云うカスタムバーに貼り付ける(Editor_CustomBarOpen に渡す)  
       というのはこういうことでしょうか?  
       コンソールで勉強していたのでGUIアプリの作法やらの勘が働きません。  
       何か違う気がしますがボタンは出来たので"良し"です。  
    */
    ```

    で、コールバック関数を作ってメッセージボックスでも出そうと思ったのですが、動かねぇ……  
    あれ、これ……DLLだから通常の方法じゃだめなんじゃ?  

    この後少しだけ、エディットやスクロールバー付けたりもしてみました。  

    これは初心者には手に余る代物ですね^^;  
    なんだか Mery の中でちっちゃなエディタを作ってる気になりましたよ。  
    カスタムバーを使うという事は、まさにそういうことになるのでしょうね。思った以上にめんどくさくて、やっぱりフレームワーク要りますね。想定外でした。  
    コールバック関数も基本的な知識のみなので、dll作成で応用が利かなく本体へメッセージが届いてない状態のようです。なので、これ以上は無理そうです。  

    残念ですがカスタムバーに関しては、ここで一旦やめておきます。  
    後は ks さんがサンプルを作ってくれるのを気長に待って、いつの日か再び挑戦してみようと思います。  

        季節限定だからいいって事もありますよね。(おい!)  

    いや、あきらめてないから!  
    打ち切り漫画みたいな"あれ"じゃないから!  
    何か思いついたり、きっかけがあればまたやるって!  

    それでは、しばらくお休みです。  
    kuro さん、ks さん、いろいろありがとうございました。

     |  玄米茶  |  返信
  7. ● 玄米茶 さん

    > それでは、しばらくお休みです。  
    いや、休ませませんよー

    http://merysmacro.up.seesaa.net/plugin_build/CustombarSample.zip

    Win32API でボタンを反応させるサンプルを 2 つ、MFC 版を 1 つ作成しました。
    なお、ビルドには VS Community 2013 が必要です。

    サンプル中、
    Basic_Win32API_1 は Mery が用意しているカスタムバーに直接貼り付けてごにょごにょするパターン、
    Basic_Win32API_2 はウィンドウを作成してその配下にコントロールを置く(元々想定していた)パターン

    ただどちらも、
    > コールバック関数も基本的な知識のみなので、dll作成で応用が利かなく本体へメッセージが届いてない状態のようです。なので、これ以上は無理そうです。  

    とコールバック関数(ウィンドウプロシージャ)の基本的な知識があるとのことで、読めると思います(信じてます)。
    作ってしまえば、MFC 版がやっぱ一番楽という感じです。

    # Win32API で作るのって、こんなに面倒だったけな
    # たぶん何か間違ってるんだと思う

     |  ks  |  返信
  8. ●ks さんへ  

    サンプルありがとうございます。  
    もう、モフモフですよ! モフモフ!  

    ふむふむ、こうやってカスタムバーのウィンドウプロシージャに割り込むのか、なるほど!  
    なんて動作が分かった今だから言えますが、初見では  

    > 読めると思います(信じてます)。  

    って云われてるのに、ヤベーこの2行全く意味ワカンネー状態でしたw  

    取り合えず前回まで作ってた物に組み込んで、インテリセンス(?)で確認したりで、
    これはLONG型へキャストなのか、とか知ってる形に変えていったら……  
    あれこれ見たことある! でやっと理解できました。  

    関数自体は勉強してても忘れてたり使い方が分かってなかったのでサンプルは大変助かりました。  
    これでまた先へ進めそうです。  

    MFC版の方はどうやって勉強しようかサイトを物色中なので、
    サンプルを活用できる状態になるまでには少し時間が掛かりそうです。  
    それでは VS Community 2013 導入の前の色々バックアップやら、
    要らないプロジェクトの整理に戻ります(←これが大変w)。  

    では!

     |  玄米茶  |  返信
スポンサーリンク