Borland C++ Builder 中的 Windows 子类化

Posted

技术标签:

【中文标题】Borland C++ Builder 中的 Windows 子类化【英文标题】:Windows Subclassing in Borland C++ Builder 【发布时间】:2009-02-09 10:55:04 【问题描述】:

我们正在尝试将一段使用 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 works 但是一个不需要的 TForm 窗口在屏幕上浮动,没有用!!!!

【问题讨论】:

你真的是指 Borland 必须在 10 多年前停止销售和支持的 OWL 吗? 嗯,我以为它被称为... MFC中的代码行... 【参考方案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 不同的范式,但它仍然很灵活。

【讨论】:

我无法将我的答案塞进 300 个字符的评论中,所以我编辑了原来的问题! 非常感谢您的回答!!!但是,我查看了代码并重新编译到 MSVC++ 是我真正想要避免的事情。除此之外,它还有将近100个小位图资源,恐怕我必须手动添加。 叹息【参考方案2】:

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

C++Builder 使用底层的 Delphi VCL,因此搜索“Delphi Window subclassing”将比试图找到专门的 C++ 更富有成效。 C++Builder 程序员必须至少能够阅读 Delphi 代码,即使他们不必编写任何代码!

【讨论】:

寻找 Delphi 示例听起来不错,谢谢! :-) (你发给我的例子恐怕不适用,因为我想子类化一个已经由另一个应用程序创建的窗口,尽管在同一个进程中)。

以上是关于Borland C++ Builder 中的 Windows 子类化的主要内容,如果未能解决你的问题,请参考以下文章

添加了库; Borland C++ Builder 无故暂停

Borland C++ builder 6 链接器错误

Borland C++ Builder 6 上的奇怪链接器错误

虚拟内存地址空间不足(Borland C++ Builder 6 程序)

无法在 Borland C++ Builder 中使用 SetWindowsHookEx 和 LowLevelKeyboardProc

C++有几种,是否有微软的,还有borland c++和c++ builder?还有没有别的,哪些是淘汰了的?