Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
hebiiro opened this issue Jun 24, 2022 · 3 comments
Labels
enhancement New feature or request

Comments

@hebiiro
Copy link

hebiiro commented Jun 24, 2022

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

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

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

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

@hebiiro hebiiro changed the title スクリプト並び替えプラグインでスクリプトをドラッグアンドドロップしたとき「震える」になってしまう スクリプト並び替え管理プラグインでスクリプトをドラッグアンドドロップしたとき「震える」になってしまう Jun 24, 2022
@ePi5131 ePi5131 added the enhancement New feature or request label Jun 26, 2022
@ePi5131
Copy link
Owner

ePi5131 commented Jun 26, 2022

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

@hebiiro
Copy link
Author

hebiiro commented Jun 27, 2022

すべての子ウィンドウを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
Copy link
Author

hebiiro commented Jun 27, 2022

直接取得する方法

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 から特定する。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants