【C++】為什麼在Windows API程式設計中必須註冊RegisterClass?
我想問為什麼在使用API開發Windows GUI時,必須註冊一個視窗類?它的概念是什麼?
我已經讀過Charles Petzold撰寫的《 Programming Windows》的前三章,但是我仍然想知道顯式註冊類的目的是什麼。我為什麼要明確地做呢?為什麼在後臺無法在CreateWindow()(或CreateWindowEx())函式中完成它?我的意思是,為什麼RegisterClass()不在CreateWindow()內部執行的程式碼,或者為什麼CreateWindow()不呼叫RegisterClass()本身?
我也一直在閱讀MSDN上的文件,並且我知道RegisterClass()函式通過填充WNDCLASS結構將視窗過程與視窗類相關聯。我知道這是處理來自作業系統的訊息的函式,但是為什麼有必要將該函式(WinProc一個)註冊到與CreateWindow()分開的函式中的類中?
我可以理解存在CreateWindow()函式的原因,以及為什麼它不自動顯示建立的視窗的原因。這意味著我也瞭解ShowWindow()函式的用途。
我確信這種行為肯定有充分的理由,以便讓程式設計師在需要時註冊一個類,而我只是看不到那些原因,所以我要你們闡明這個問題。
請記住,我是使用Windows API進行GUI開發的新手。我已經在MATLAB中完成了一些GUI,這與Windows API有所不同,但仍然使我瞭解了一些Windows原理,尤其是回撥函式的用途。我不知道此資訊是否有用,但是如果您需要進行類比,請成為我的客人。
解決辦法
既然您用C++標記了問題,我將給您一個C++類比...RegisterClass基本上是您定義一個類並將其包含在程式中(非常類似於C++中的#include)。 WNDPROC是您在建立例項時以及在視窗內發生的所有事件的處理程式。CreateWindow在概念上與您在C++中執行new相同。您要讓Windows建立一個新視窗,並且必須告訴它視窗的型別。 Windows包含一組預定義的視窗,例如Button或Edit,但是如果您要建立自己的視窗的例項,那很好,您只需告訴它您想要建立的“類”即可。您已經通過呼叫RegisterClass註冊了此類,因此Windows現在可以直接轉到定義並建立視窗的例項。