DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

DelphiでEmEditorPlugin3、プラグイン本体を記述

で、まあ、肝心のplugin本体のプログラムは次の通りです。

はじめは見慣れない記述ばかりでややこしいと思いますが

基本的に動作制御する
procedure OnCommand(hwnd:HWND);stdcall;

だけを見ればいいです。
他にちょっとだけ気にするのは

ファイルがReadOnly等のときにPluginのEnabledを制御する関数
function QueryStatus(hwnd:HWND; pbChecked:PBOOL ):BOOL;stdcall;

プラグイン設定画面での動作制御
function PlugInProc(hwnd:HWND; nMsg:Integer; WPARAM:Integer; LPARAM :Integer):LRESULT; stdcall;

こんなもんです。
他の関数や定数は見向きしなくて大丈夫です


────────────────────
{-------------------------------
基本的な
EmEditorのプラグインDLLです
--------------------------------}
library ProductBasePlugin;

uses
Windows,
plugin;

// for Resources
const
IDS_MENU_TEXT = 1;
IDS_STATUS_MESSAGE = 2;
IDB_BITMAP = 101;

var
g_nCmdID: UINT = 0;

procedure OnCommand(hwnd:HWND);stdcall;
var
NoSelectFlag: Boolean;
ScrollPoint: TPoint;
SelStartPoint, SelEndPoint: TPoint;
WideStr: WideString;
// CaretPos: TSelectCaretPoint;
begin
{↓再描画停止}
Editor_Redraw(hwnd,FALSE); try

{↓選択位置を保持する}
Editor_GetSelStart( hwnd, POS_LOGICAL_W, @SelStartPoint );
Editor_GetSelEnd( hwnd, POS_LOGICAL_W, @SelEndPoint );
// CaretPos := GetSelectCaretPos(hwnd);

Editor_GetScrollPos(hwnd, @ScrollPoint);
{↑スクロールバー位置をバッファ}

{↓選択状態を保持}
NoSelectFlag := (Editor_GetSelType(hwnd)=SEL_TYPE_NONE);
//-------------------------------
if NoSelectFlag then
begin {↓もし選択領域がなければ全選択する}
Editor_ExecCommand(hwnd,EEID_EDIT_SELECT_ALL);
end;
//-------------------------------

{処理を記述}
// WideStr := Editor_GetSelTextW_Delphi(hwnd);
// SetSelectText(hwnd, WideStr);

//-------------------------------
if NoSelectFlag then
begin
Editor_ExecCommand(hwnd, EEID_ESCAPE);
{↑選択状態をキャンセル}
Editor_SetCaretPos( hwnd, POS_LOGICAL_W, @SelStartPoint );
end else
begin
{↓論理座標を表示座標に変更してSetSelViewを使って文字列を選択}
Editor_LogicalToView( hwnd, @SelStartPoint, @SelStartPoint);
Editor_LogicalToView( hwnd, @SelEndPoint, @SelEndPoint);
Editor_SetSelView(hwnd, @SelStartPoint, @SelEndPoint);
end;
//-------------------------------
// SetSelectCaretPos(hwnd, CaretPos);
Editor_SetScrollPos(hwnd, @ScrollPoint);
{↑スクロールバー位置を元に戻す}
finally Editor_Redraw(hwnd,TRUE); end;
{↑再描画再開}
end;


function QueryStatus(hwnd:HWND; pbChecked:PBOOL ):BOOL;stdcall;
begin
Result := True;

{↓ファイルが書き込み不可能ならPluginを動作させない処理}
// Result := Boolean(SendMessage(hwnd,EE_QUERY_STATUS,
// EEID_EDIT_REPLACE,LPARAM(pbChecked)));
//EEID_EDIT_REPLACEが動作可能かどうか調べている
end;


{-------------------------------
// OnEvents
//状態が変更されたときにイベントが指定されて呼び出されます
機能:
引数説明: lParam: 各種イベントによって意味付けが異なります。
備考: イベントはnEvent パラメータで論理和として指定されます。
例) if (nEvent and EVENT_CREATE) <> then ...;
デフォルトで EVENT_CREATE EVENT_MODIFIED が定義されています
履歴: 2001/02/06
--------------------------------}
procedure OnEvents(hwnd: HWND; nEvent: Integer; lParam: LPARAM );stdcall;
begin
if (nEvent and EVENT_CREATE ) <> 0 then
begin
g_nCmdID := UINT(lParam);
end;

if (nEvent and EVENT_MODIFIED ) <> 0 then
begin
Editor_UpdateToolbar( hwnd, g_nCmdID );
end;

(*
// EVENT_CHANGE テキストの内容が変更された時
// EVENT_CARET_MOVED カーソル位置が移動した時
// EVENT_CLOSE EmEditorが終了する直前とプラグインが開放された時
// EVENT_CONFIG_CHANGED 現在の設定のプロパティが変更された時
// EVENT_CREATE EmEditorが起動した直後とプラグインを追加した時
// EVENT_KILL_FOCUS フォーカスを失った時
// EVENT_MODIFIED 更新状態が変更された時
// EVENT_SCROLL スクロールバーの位置が変更された時
// EVENT_SEL_CHANGED テキストの選択状態が変更された時
// EVENT_SET_FOCUS フォーカスを取得した時
*)
end;

{-------------------------------
// GetMenuTextID
//プラグインのメニューアイテムテキストのリソースIDを取得します
戻り値: リソースID
履歴: 2001/01/10
--------------------------------}
function GetMenuTextID: Integer;stdcall;
begin
result := IDS_MENU_TEXT;
end;

{-------------------------------
// GetStatusMessageID
//ステータスバーテキストとツールバーのツールチップ用テキストを
// \n で結合した文字列のリソースIDを取得します。
戻り値: リソースID
履歴: 2001/01/10
--------------------------------}
function GetStatusMessageID: Integer; stdcall;
begin
result := IDS_STATUS_MESSAGE;
end;

{-------------------------------
// GetBitmapID
//ツールバーに表示されるプラグイン ボタンの
//ビットマップのリソースIDを取得します
戻り値: リソースID
履歴: 2001/01/10
--------------------------------}
function GetBitmapID: Integer;stdcall;
begin
result := IDB_BITMAP;
end;

//関数名を大文字小文字を間違うとエラーになるので注意
function PlugInProc(hwnd:HWND; nMsg:Integer; WPARAM:Integer; LPARAM :Integer):LRESULT; stdcall;
const
szName : String = 'ProductBasePlugin';
szVersion : String = 'Version 1.0';

{-------------------------------
// PlugInProc
//EmEditorプラグイン設定ダイアログ画面の制御
引数説明: hwndParent
プラグインの設定ダイアログのウィンドウ ハンドルが格納されています。
nMsg
EP_で始まる各種メッセージ
WPARAM LPARAM
各種メッセージによって意味付けが異なります。
戻り値: 各種メッセージによって意味付けが異なります。
備考:
履歴: 2001/02/06
--------------------------------}
begin
Result := 0;
case nMsg of
{↓プロパティボタンが利用可能どうかを調べます。}
EP_QUERY_PROPERTIES :
begin
Result := LongInt(false);
end;
{↓プロパティの表示を指示します。
True/False 表示した/しなかった}
EP_SET_PROPERTIES :
begin end;

{↓プラグインの名前を取得します。(変更しないでOK)}
EP_GET_NAME :
begin
Result := Length(szName);
if (LParam <> 0) then
lstrcpyn(PChar(LParam), PChar(szName), wParam);
end;
{↓プラグインのバージョンを取得します。(変更しないでOK)}
EP_GET_VERSION :
begin
Result := Length(szVersion);
if (LParam <> 0) then
lstrcpyn(PChar(LParam), PChar(szVersion), wParam);
end;

{↓アンインストールボタンが利用可能どうかを調べます。(変更しないでOK)}
EP_QUERY_UNINSTALL :
begin
Result := LongInt(true);
end;

{↓アンインストールを実行します。
True/False 実行/非実行(変更しないでOK)}
EP_SET_UNINSTALL :
begin
if MessageBox(hwnd, 'アンインストールしますか?', PChar(szName),
MB_YESNO or MB_ICONQUESTION) = IDYES then
Result := LongInt(true);
end;
end;//end case nMsg of
end;

{ Here is exports section. }

{$WARN SYMBOL_PLATFORM OFF}
exports
OnCommand index 1,
QueryStatus index 2,
OnEvents index 3,
GetMenuTextID index 4,
GetStatusMessageID index 5,
GetBitmapID index 6,
PlugInProc index 7;
{$WARN SYMBOL_PLATFORM ON}

{-------------------------------
//必要なDLLMain
備考: 必要だからあるだけです。
履歴: 2001/01/10 作成
2002/08/04
必要ないどころか
WinXPではOSバグを引き起こすようなのでコメントアウトする
--------------------------------}
(*
function DLLMain(Reason: Integer):Bool;stdcall;
begin
Result := TRUE;
end;
*)

begin
// g_nCmdID := 0;
// DLLProc:=@DLLMain;
// DLLMain(DLL_PROCESS_ATTACH);
end.

────────────────────
スポンサーサイト

| 未分類 | 23:43 | comments:1 | trackbacks:0 | TOP↑

COMMENT

ソースコピペのときは、半角のインデントを全角のインデントに変更しないといけませんね。

| Delフサ | 2006/05/03 23:42 | URL |















非公開コメント

TRACKBACK URL

http://delfusa.blog65.fc2.com/tb.php/5-044d3515

TRACKBACK

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。