2

我们正在尝试将一段使用 CWnd.SubclassWindow 方法在 MFC 中编写的 C++ 代码转换为 Borland C++ Builder 代码。有谁知道如何进行子类化(使用 TForm 对象进行子类化) - 我们完全陷入困境。任何指针将不胜感激!蒂亚!

规格:

我们有一个现有的用 Borland C++ 编写的基类,它继承自 TForm,它用于为从它继承的所有表单赋予某种外观和感觉(例如,它处理 WM_NCPAINT 和 WM_NCHITTESTheavily)。

现在我们想使用此代码为用其他语言(准确地说是 MSVC++/MFC 和 C#)编写的表单提供相同的外观和感觉。

我们认为使用 Windows 子类化将是一个好主意,而不是重写所有代码。然后我们可以将所有现有的和测试过的代码填充到一个 DLL 中,然后只需使用 hWnd 调用它,该窗口就会自动获得新的外观和感觉。

究竟为什么这是不可能的,我真的不能说——我自己不使用 Borland C++ 编写代码。我只用了几分钟就在 MFC 中编写了一个存根,向 Borland C++ 开发人员展示了我想要什么,他们花了几天时间试图模仿 MFC 的 CWnd::SubclassWindow 方法,但没有成功。

据我了解,问题在于当您执行“new TForm()”时,会在您有机会停止之前自动创建一个新窗口。所以替换然后 WindowProc工作但不需要的 TForm 窗口在屏幕上浮动,没有用!!!!

4

2 回答 2

1

查看Codegear Online Docs,它描述了 WindowProc 子类化机制。

C++Builder 使用底层的 Delphi VCL,因此搜索“Delphi Window subclassing”将比试图找到专门的 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_NCHITTEST那么听起来不太可能有很多 VCL 特定的东西在里面 - 它可能只是直接敲击 Win32 API?如果那里没有任何 VCL,那么在 VC++ 中编译应该几乎可以神奇地工作。

无论如何:这几乎肯定是可能的。我有一个用 BCB5(早于 WinXP)构建的应用程序,通过巧妙地使用窗口挂钩、子类化等(其中大部分不是我自己的)仍然非常乐意处理 XP 甚至 Aero(这不是说维护并不痛苦)。如果这是可能的,你的应用程序当然应该是。VCL 遵循与 MFC 不同的范式,但它仍然很灵活。

于 2009-02-10T16:40:08.873 回答