3

TOpenDialog と TOpenPictureDialog を VCL スタイルでスキンすることはできますか?

4

2 に答える 2

5

短い答えはいいえです。現在、Delphi XE2 または XE3 を使用して、VCL スタイルを非 VCL フォーム (または VCL アプリケーションの外部で作成されたフォーム) に直接適用することはできません。

Vcl スタイルをこれらの種類のダイアログに適用することは技術的に可能ですが、これには多くの作業が必要です (私は多くの作業が必要だと思います)。

重要なのは、WH_CBTフックを使用してHCBT_CREATEWNDコードを検出し、ウィンドウのクラスが (ダイアログ ボックスのクラス) であるかどうかを確認することです。ここから、関数を使用してウィンドウ プロシージャをインデックス#32770に置き換えることができます。SetWindowLongGWL_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);

上記のタスクの一部は既に完了していますが、まだ完了していません。この種のプロジェクトは多くの時間を必要とするためです。

ここに画像の説明を入力

于 2012-12-18T22:21:16.740 に答える
4

興味のあるVCL Styles Utils Project方は、ダイアログをサポートするようになりました

ここに画像の説明を入力

この機能の詳細については、このブログ投稿を参照してください。

于 2013-11-11T16:38:07.317 に答える