2009-02-09 86 views
2

我們試圖將使用CWnd.SubclassWindow方法編寫的MFC中的一段C++代碼轉換爲Borland C++ Builder代碼。有誰知道如何進行子類化(帶有TForm對象的子類) - 我們完全被卡住了。任何指針將非常感謝! TIA!Borland C++ Builder中的Windows子類化

具體細節:

我們有寫入的Borland C++從TForm的繼承,這是用來給所有形式,從它繼承特定的外觀和感覺(它處理WM_NCPAINT和WM_NCHITTESTheavily,例如現有的基類)。

現在我們希望使用此代碼爲其他語言(MSVC++/MFC和C#)寫的表單提供相同的外觀和感覺。

而不是重寫所有代碼,我們認爲使用Windows子類化將是一個好主意。然後,我們可以將所有現有的和經過測試的代碼填充到一個DLL中,然後使用hWnd調用它,並且該窗口將自動獲得新的外觀和感覺。

究竟爲什麼這是如此不可能真的不合格,我不想說 - 我自己沒有用Borland C++編碼。我在幾分鐘內在MFC中寫了一個存根,向Borland C++開發人員展示了我想要的東西,他們花了好幾天的時間嘗試模仿MFC CWnd :: SubclassWindow方法,但沒有成功。

從我的理解,問題是,當你做一個「新的TForm()」,然後一個新的窗口被自動創建之前,你有任何機會來阻止它。因此,取代然後WindowProc 工程但一個不需要的TForm窗口在屏幕上浮動,無用!

+0

你真的意味着Borland必須在10年前停止銷售和支持的OWL嗎? – mghie 2009-02-09 11:30:21

+0

嗯,我認爲這是所謂的...我只是一個M $的傢伙,我試圖找出爲什麼這些Borland C++開發人員無法模仿我能用MFC中的一行代碼做什麼。 – 2009-02-10 16:20:58

回答

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不同的範式,但它仍然靈活。

+0

我無法將我的答案填入評論的300個字符中,因此我編輯了原始問題! – 2009-02-10 17:05:45

1

查看Codegear Online Docs,它描述了子類化的WindowProc機制。

C++ Builder使用底層的Delphi VCL,所以搜索「Delphi Window子類」將比試圖找到特定的C++更具成效。 C++ Builder程序員必須至少能夠閱讀Delphi代碼,即使他們不必寫任何代碼!

相關問題