2012-11-06 32 views
0

當我推着我的第一個WINAPI UI,我發現自己在我的WinMain文件中創建HWND變量大,不舒服的堆棧:WinAPI - 如何組織很多HWND對象?

HWND foo; 
HWND bar; 
HWND baz; 
HWND etc; 

int WINAPI WinMain(...) {} 

當然,這些變量的函數用在文件的其餘部分 - 例如消息循環 - 所以它們必須是可訪問的。

對於我這個相對較小的用戶界面,我會將30個HWND堆積起來,以便它們處於可見範圍內。這讓我非常懷疑我做錯了。

這是應該發生的,還是有一個更實際的方式來組織這?

+1

我可能會用'std :: map '去。這樣,您可以給每個人一個名字,以便您可以輕鬆識別它們,同時將它們分組。 – chris

+0

我以爲像hashmap這樣的東西會很有用,但它似乎有點......主觀的。它似乎增加了另一層次的複雜性(記住關鍵名稱),但也在一個非常公開的範圍內留下了一大堆東西。這個可以嗎? – Ben

+1

爲什麼不讓這些'HWND'變量控制相應對象的類的成員? –

回答

1

你有幾個解決方案,取決於你的程序是什麼。

  1. 您可以將所有這些句柄放在一個或多個容器中,如std::vector
  2. 您可以將它們映射爲chris建議。
  3. 如果程序變大,您可能需要將它們組織成邏輯單元。例如,如果這些窗口中的15個用於邏輯的一半,另一半用於另一半(表示控制器內部的控件),那麼您可能希望以某種方式對這些控件進行分組(文件,類,任何最符合邏輯的)。
0

在主程序中只需要一個HWND,這是主窗口。

該API不需要單個主窗口,但這是最常見的。即使從用戶的角度來看,應用程序提供了幾個明顯獨立的窗口,但在程序中有一個主窗口(它可以是不可見的,但提供分組)是一個好主意。

其他窗口可以是主窗口的子窗口(在其中),也可以是主窗口「擁有」的窗口。一般來說。特別是對於第一個Windows程序。 :-)所以你不需要這些窗口的單獨變量。每當一個窗口對某事做出反應時,這就是一個窗口的消息,這意味着以相關窗口句柄作爲參數調用一個函數。

每個子窗口都可以有一個唯一的整數ID,這是跟蹤它們的一種方法。

但是,隨着您的發展,您需要將狀態與每個窗口關聯,最簡單的方法是使用Windows的「子類」API將指針與每個窗口關聯。然後,您可以將窗口過程調用路由到關聯的C++對象上的方法。在不同的消息可以進一步路由到不同的消息處理方法,每個消息處理方法都可以訪問窗口的狀態(它只是這個C++對象)。

+0

感謝您的提示。當你說「只有一個HWND」時,我有點困惑,因爲所有的公共控件和它們的各種API都創建/需要'HWND'對象。如果可能的話,我試圖避免在入口點前面堆積50個'HWND'變量...... – Ben