patch.aul icon indicating copy to clipboard operation
patch.aul copied to clipboard

スクリプト並び替え管理プラグインでスクリプトをドラッグアンドドロップしたとき「震える」になってしまう

Open hebiiro opened this issue 2 years ago • 3 comments

この問題は『設定ダイアログにスクロールを付ける』&『設定ダイアログを高速描画する』&『スクリプト選択コンボボックスがウィンドウ外に出現する』の条件が重なったときに発生するようです。

この条件下だと ::UpdateWindow() を呼んでも設定ダイアログに WM_CTLCOLOREDIT が送信されないようです。よって、

  1. 設定ダイアログの WM_COMMAND (LOWORD(wParam) == 2079) をフックする。
  2. 設定ダイアログの子ウィンドウを末尾から列挙する。
  3. ウィンドウテキストが「震える」のコンボボックスを探す。
  4. コンボボックスを引数にして WM_CTLCOLOREDIT を設定ダイアログに手動で送る。

このような処理をしてほしいです。実際に実装してみたソースコードはこちらにあります。 https://github.com/hebiiro/AviUtl-Plugin-script_sort_patch/

hebiiro avatar Jun 24 '22 11:06 hebiiro

・例えばすべてのコンボボックスに対してWM_CTLCOLOREDITすると何か不都合が起きますか? ・本当は「末尾のアニメーション効果の効果名コンボボックス」のハンドルを直接取得するのがうれしいですよね 要解析 それともこれはできない?

ePi5131 avatar Jun 26 '22 19:06 ePi5131

すべての子ウィンドウをWM_CTLCOLOREDITで送っても多分問題ないと思います。スクリプト並び替え管理プラグインが

  1. ::GetClassName()でクラス名が "ComboBox" かチェックする。
  2. ::GetWindowText()でウィンドウ名が "震える" かチェックする。
  3. ::GetDlgCtrlID()でコントロールIDを取得して変数に格納する。
  4. 条件に一致するコントロールが複数あった場合は一番最後(末尾)のコンボボックスのIDが格納される。

というような処理をしてくれるはずです。

コンボボックスのIDは8100~8147の48個と決まっているようなので、

for (UINT i = 0; i < 48; i++) {
	HWND control = ::GetDlgItem(settingDialog, 8100 + i);
	if (::IsWindowVisible(control))
		::SendMessage(settingDialog, WM_CTLCOLOREDIT, 0, (LPARAM)control);
}

これでもいいような気もします。

直接取得する方法は何度か解析してるんですけどまだよく分かっていません。

hebiiro avatar Jun 27 '22 10:06 hebiiro

直接取得する方法

DWORD exedit = g_auin.GetExEdit();
DWORD comboBoxArray = exedit + 0x168A2C;

// カレントオブジェクトを取得する。
int objectIndex = g_auin.GetCurrentObjectIndex();
ExEdit::Object* object = g_auin.GetObject(objectIndex);

// フィルタの個数を取得する。
int c = object->countFilters();

// 追加されたフィルタを取得する。
int filterIndex = c - 2;

// コンボボックスの先頭インデックスを取得する。
// (コンボボックスの個数は filter->check_n に入っている)
short check_begin = object->filter_param[filterIndex].check_begin;

// 0 番目のコンボボックスを取得する。
HWND comboBox = *(HWND*)(comboBoxArray + (check_begin + 0) * 24);
::SendMessage(settingDialog, WM_CTLCOLOREDIT, 0, (LPARAM)comboBox);

comboBoxArray と ExEdit::Object の check_begin から特定する。

hebiiro avatar Jun 27 '22 12:06 hebiiro