スクリプト並び替え管理プラグインでスクリプトをドラッグアンドドロップしたとき「震える」になってしまう · Issue #44 · ePi5131/patch.aul · GitHub
Skip to content

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

Open

Description

@hebiiro

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

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

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

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

Activity

  1. changed the title [-]スクリプト並び替えプラグインでスクリプトをドラッグアンドドロップしたとき「震える」になってしまう[/-] [+]スクリプト並び替え管理プラグインでスクリプトをドラッグアンドドロップしたとき「震える」になってしまう[/+] on Jun 24, 2022
  2. ePi5131 commented on Jun 26, 2022

    @ePi5131
    Owner

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

  3. hebiiro commented on Jun 27, 2022

    @hebiiro
    Author

    すべての子ウィンドウを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);
    }
    

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

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

  4. hebiiro commented on Jun 27, 2022

    @hebiiro
    Author

    直接取得する方法

    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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions