2012-08-04 98 views
2

我想我的問題對於那些花時間處理Win32 API的人來說相對容易。註冊窗口類

所以我的問題是:
初始化一個WNDCLASSEX實例後,我們需要使用「RegisterClassEx」函數「注​​冊」它,爲什麼?我們爲什麼這樣做?這個註冊是什麼意思,以及在什麼情況下我需要註冊的東西?

回答

5

RegisterClassEx返回的ATOM唯一標識您的「窗口類」,然後可以在其他Windows API中引用該窗口類。 [MSDN]

實際上,它是一個散列,以減少每次創建或查找窗口時處理的數據量。這也意味着可以輕鬆創建和識別具有相同功能的多個窗口。

我正在解決上述的實際問題。 Hans Passant的answer正確地解釋了這是爲C. Further MSDN example提供的OO類概念。

+0

感謝您的回答! – RiskX 2012-08-04 13:00:27

4

單詞在函數名中是重要的。當您使用面向對象的語言(如C++,Delphi,Java或C#等)編寫代碼時,則使用關鍵字創建具有行爲的對象。但是winapi被設計爲使用C語言,一種沒有這種功能的語言。 RegisterClassEx()函數是對它的一種模擬,它可以讓你創建一個窗口,從一個已命名的類「派生」它的行爲,你可以覆蓋的行爲。使用該類名稱創建的每個窗口都具有相同的行爲。

您傳遞的WNDCLASSEX結構給出了一個窗口的默認行爲。這種結構的最重要的成員是:

  • lpszClassName。這相當於C++類的名稱。您稍後可以調用CreateWindowEx()並傳遞該名稱以獲得以某種方式表現的窗口。 Windows本身調用RegisterClassEx()來註冊幾個內置的窗口類,然後您可以在自己的代碼中重新使用它們。 「編輯」,「按鈕」和「列表框」就是很好的例子。
  • lpfnWndProc。這就是窗口類的特定默認行爲。其窗口過程的地址,實現特定消息的消息處理程序。您可以進一步自定義默認行爲,換句話說,通過在CreateWindowEx()調用中指定另一個窗口過程,從基類「派生」您自己的類。這樣的窗口過程必須始終調用DefWindowProc(),相當於調用基類方法。換句話說,一個窗口有一個虛擬方法。
  • hIcon等。這些相當於基類的屬性,它們設置影響默認消息處理程序的默認值。幫助您保持簡單的窗口過程。例如,很少需要爲WM_ERASEBKGND編寫消息處理程序,hbrBackground成員爲窗口設置默認背景。

即使您不打算重新使用窗口,Windows也要求您調用RegisterClassEx()。這是迄今爲止您自己的代碼中最常用的函數。直到你編寫一個實現控件的庫,其他代碼可以使用的窗口,你纔會開始真正利用它。像「編輯」一樣。