チュートリアル① ~「HmAutoCompleteEx.dll」利用方法 開発準備編~

概要

この章より、いくつかのステップに分けて、「HmAutoCompleteEx.dll」の利用方法を解説してゆきます。

チュートリアルが目指すもの

チュートリアルの最終目標は「プログラミング言語 Perl」用の入力補完拡張用の.dllを作成することになります。
(Perlの話題自体は登場しません。)
話がブレないよう、チュートリアルの目標を統一し、理解を促進するためとなります。

Perl言語の設定

秀丸の「ファイルタイプ別の設定」を利用して、「.pl」という拡張子に対して、
下画像のような設定を施しておきましょう。
これから行っていくチュートリアルの動作確認の上で、

  • 「リスト」が選択されていること、
  • 「現在編集中のテキスト」にチェックが入っていること。
  • 可能であれば、何らかのPerl用の「辞書ファイル」をネット等から拾ってきて、設定しておくとよいでしょう。

(大切なことは「入力補完のウィンドウ」を出しやすくして確認しやすくすること、
「入力補完ウィンドウ」中に上下等で選択出来るタイプの「リスト」であることです。)

PICTURE

SDKのダウンロード

更新日 2017/12/13
HmAutoCompleteExPlug.zip ver 0.802

上記ファイルに含まれるプロジェクトを利用していくことで、「HmAutoCompleteEx.dll」上で動作するファイルを作成することが出来ます。

プロジェクトに含まれる最小のサンプル

今回の最小サンプルは「入力補完まわりの機能を秀丸で使った時に、コールバック関数が呼ばれる」ので、
それをデバッグモニターで確認できるようにする、というものです。

#include <windows.h>
#include "OutputDebugStream.h"

#define MACRO_DLL extern "C" __declspec(dllexport)


MACRO_DLL int OnCreate(HWND hWnd, LPCTSTR pwszFileName) {
	OutputDebugStream(L"OnCreate:%s\n", pwszFileName);
	return TRUE;
}
 
MACRO_DLL int OnListBoxSelectedIndexChanged(HWND hWnd, int iListBoxSelectedIndex, LPCTSTR pwszListBoxSelectedItem, int iItemHeight) {
	OutputDebugStream(L"OnListBoxSelectedIndexChanged:%s\n", pwszListBoxSelectedItem);
	return TRUE;
}

MACRO_DLL int OnDestroy(HWND hWnd) {
	OutputDebugStream(L"OnDestroy\n");
	return TRUE;
}

using AUTOCOMPLETELIST = void;
MACRO_DLL AUTOCOMPLETELIST* OnQueryListBoxCustomAdded(HWND hWnd, AUTOCOMPLETELIST *pAutoCompleteOriginalList) {
	OutputDebugStream(L"OnQueryListBoxCustomAdded:\n");
	return NULL;
}

MACRO_DLL int OnKeyDown(HWND hWnd, WPARAM wParam) {
	OutputDebugStream(L"OnKeyDown:%c\n", wParam);
	return TRUE;
}

コンパイル

コンパイルする前に、「プロジェクト」の「プラットフォームツールセット」のバージョンが、
今使っているVisual Studioのバージョンと一致するか確認しましょう。
複数のVisual Studioがインストールされていれば別ですが、そうでない限り、プラットフォームツールセットとVisual Studioのバージョンは一致させる必要があります。
(要するにVisual Studio 2015を使ってる人は、下画像の赤線部分をVisual Studio 2015にするということ)

PICTURE

「HmAutoCompleteEx.dll」と「HmAutoCompleteExPlug.dll」を秀丸ディレクトリにコピー

コンパイルすることで、「HmAutoCompleteExPlug.dll」が出来上がりました。

「HmAutoCompleteEx.dll」と「HmAutoCompleteExPlug.dll」を秀丸ディレクトリにコピーしましょう。

呼び出す設定

HmAutoCompleteEx.dll自体はある程度自由に呼び出せますが、
最も相応しい呼び出し場所は、
秀丸マクロの「自動起動」から「アクティブ切り替え後」あたりで呼び出すといったものです。

PICTURE

マクロ内容

#HMACE = loaddll( hidemarudir + @"\HmAutoCompleteEx.dll" );
if (#HMACE) {
    #_ = dllfuncw( #HMACE, "SetHidemaruHandle", hidemaruhandle(0), filename2 );
    #_ = dllfuncw( #HMACE, "BindAutoCompleter", hidemarudir + "\\HmAutoCompleteExPlug.dll", "\\.pl$" );
} else {
    message("dllが無い");
}

#hmaceをfreedll(FreeLibrary)しないよう注意してください。
秀丸終了時に、#hmaceは自動的にfreedllされます。

デバッグモニターの用意

普段デバッグモニターを利用していない人は、
当サイトにて秀丸専用のデバッグモニターを提供していますので
こちらを利用してください。

他のデバッグモニターでも問題はありません。
(dbmonなどと検索してください)

入力補完をしてみる

適当に「.pl」ファイルを秀丸で開いて、
実際に入力補完をして挙動を確かめてみましょう。
今回コンパイルしたコールバック関数が呼ばれている様子がわかるでしょうか。

PICTURE

どのような入力補完がらみの操作をすると、どの関数がコールバックされるのか、確認すると良いでしょう。

  • OnCreate

    単語補完ウィンドウの生成直後。

  • OnDestroy

    単語補完ウィンドウが消滅直前。

  • OnListBoxSelectedIndexChanged

    単語補完リストの選択項目が変更された際に、変更前のものと変更後のものが続けざまに呼ばれる

  • OnQueryListBoxCustomAdded

    単語補完リストの項目内容が変更される際、続けざまに呼ばれる。

  • OnKeyDown

    秀丸上で、キーボードが押される度に呼び出される呼ばれる。

次節からウィンドウ描画へ

今回のものはデバッグ領域に出すだけといった地味なものでしたが、
次節からいよいよウィンドウ描画へと入っていきます。

しかし、心配は要りません。
.NETをベースとした解説であるため、簡単でありプログラム経験が浅い人でも理解しやすい、記述しやすいものとなっています。