2

CWnd.SubclassWindow メソッドを使用する MFC で記述された C++ コードの一部を、Borland C++ Builder コードに変換しようとしています。サブクラス化 (TForm オブジェクトを使用したサブクラス化) の方法を知っている人はいますか?私たちは完全に立ち往生しています。どんなポインタでも大歓迎です!ティア!

仕様:

TForm から継承する Borland C++ で記述された既存の基本クラスがあります。これは、TForm から継承するすべてのフォームに特定のルック アンド フィールを与えるために使用されます (たとえば、WM_NCPAINT と WM_NCHITTEST を重く処理します)。

ここで、このコードを使用して、他の言語 (正確には MSVC++/MFC と C#) で記述されたフォームに同じルック アンド フィールを提供したいと考えています。

すべてのコードを書き直す代わりに、Windows のサブクラス化を使用することは素晴らしいアイデアだと考えました。次に、すべての既存のテスト済みコードを DLL に詰め込み、それを hWnd で呼び出すだけで、そのウィンドウは自動的に新しいルック アンド フィールを取得します。

なぜこれが不可能なのかは、私にはわかりません。私自身、Borland C++ でコードを書いているわけではありません。Borland C++ 開発者に私が何を望んでいるのかを示すために、MFC でスタブをわずか数分で作成しました。彼らは MFC の CWnd::SubclassWindow メソッドを模倣しようとして何日も費やしましたが、成功しませんでした。

私が理解していることから、問題は、「new TForm()」を実行すると、新しいウィンドウが停止する前に自動的に作成されることです。そのため、WindowProc を置き換えると機能しますが、不要な TForm ウィンドウが画面上に浮かんで使用できなくなります!!!!

4

2 に答える 2

1

サブクラス化のための WindowProc メカニズムについて説明しているCodegear Online Docsを参照してください。

C++Builder は基礎となる Delphi VCL を使用するため、「Delphi ウィンドウ サブクラス化」を検索すると、特に C++ を検索するよりも効果的です。C++Builder プログラマーは、たとえ何も書く必要がなくても、少なくとも Delphi コードを読むことができる必要があります。

于 2009-02-10T21:18:36.943 に答える
1

VCLのことだと思います。TControl オブジェクトの WindowProc プロパティを、独自のウィンドウ プロシージャまたは別のコントロールの WindowProc に設定できます。

編集:より詳細に基づいて、より多くの答え

ウィンドウが画面上で無駄に浮いてしまうのを防ぐnew TFormには、Visible プロパティを false に設定する必要があります。または、CreateParams をオーバーライドして、ウィンドウから WS_VISIBLE スタイルを削除することもできます。

void __fastcall TBlahForm::CreateParams(TCreateParams &Params)
{
    TForm::CreateParams(Params);
    Params.Style&=~WS_VISIBLE;
}
//---------------------------------------------------------------------------

目に見えないウィンドウが作成されますが、ユースケースを理解しているので、これは大したことではありません。

オーバーライドTCustomForm::CreateWndは、同じ問題を攻撃する別の方法になる可能性があります。

私の他の提案は、コードを BCB から VC++ に移植することです。それがいろいろいじくり回していてWM_NCPAINTWM_NCHITTESTVCL 固有のものをたくさん持っている可能性が低いと思われる場合は、おそらく Win32 API を直接叩いているだけですか? そこに VCL が何もない場合、VC++ でのコンパイルはほとんど魔法のように機能するはずです。

いずれにせよ、ほぼ確実に可能です。私は BCB5 (WinXP よりも前のバージョン) で構築されたアプリを持っています。これは、ウィンドウ フック、サブクラス化など (そのほとんどは私自身のものではありません) を巧みに使用することで、XP や Aero (そうではない) を扱うことにも完全に満足しています。維持するのは苦痛ではないと言います)。それが可能であれば、あなたのアプリケーションは確かにそうあるべきです。VCL は MFC とは異なるパラダイムに従いますが、それでも柔軟です。

于 2009-02-10T16:40:08.873 に答える