TOpenDialog と TOpenPictureDialog を VCL スタイルでスキンすることはできますか?
2 に答える
短い答えはいいえです。現在、Delphi XE2 または XE3 を使用して、VCL スタイルを非 VCL フォーム (または VCL アプリケーションの外部で作成されたフォーム) に直接適用することはできません。
Vcl スタイルをこれらの種類のダイアログに適用することは技術的に可能ですが、これには多くの作業が必要です (私は多くの作業が必要だと思います)。
重要なのは、WH_CBTフックを使用してHCBT_CREATEWND
コードを検出し、ウィンドウのクラスが (ダイアログ ボックスのクラス) であるかどうかを確認することです。ここから、関数を使用してウィンドウ プロシージャをインデックス#32770
に置き換えることができます。SetWindowLong
GWL_WNDPROC
これは簡単な部分でした。Windows ダイアログによって送信されたメッセージを制御できるようになったので、子コントロールを反復 処理し、GWL_WNDPROC インデックスを使用してウィンドウ プロシージャを再度置き換える必要があります。これは、Windows ダイアログで使用される各コントロール (ボタン、syslistview32、Combobox など) の Wrapper クラスを作成することで実行できます (これは大変な作業です)。
syslistview32
これは、 windows クラスの Wrapper クラスの定義のサンプルです。
TListViewWnd = class(TCustomListView)
private
FNewWndProc : Pointer;
FOrgWndProc : Pointer;
Fhwnd: THandle;
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWnd; override;
procedure DestroyWnd; override;
procedure WndProc(var Message: TMessage); override;
public
constructor Create(hwnd: THandle);
destructor Destroy;override;
end;
最後に、この方法で TListView のような Vcl コントロール用に定義された既存の VCL スタイル フックを使用できます。
TStyleManager.Engine.RegisterStyleHook(TListViewWnd, TListViewStyleHook);
上記のタスクの一部は既に完了していますが、まだ完了していません。この種のプロジェクトは多くの時間を必要とするためです。
興味のあるVCL Styles Utils Project
方は、ダイアログをサポートするようになりました
この機能の詳細については、このブログ投稿を参照してください。