天天看點

Windows程式設計中為什麼要注冊視窗類?

轉自:http://blog.sina.com.cn/s/blog_711dc8b40100ok9i.html

你想建立什麼樣的視窗呢?那麼,建立什麼樣的視窗呢?建立前,Window系統可不知道你要的是什麼類型的視窗啊(比如标題欄上顯示什麼圖示,滑鼠形狀是什麼,視窗背景顔色等等)。這些類型資訊應在你建立前事先告訴Window系統。可以采用這種方法:就是我們事先寫一份要建立視窗的類型申請表,送出(注冊)給Window系統。然後在建立時,可以讓Windows按這個申請表來建立你所要的視窗了。也就是說我們還應該先送出一個申請表,申請成功後再根據這個表建立一個視窗。

  我們在使用microsoft平台SDK或者MFC程式設計時,在建立視窗類後都要先用RegisterClass函數來注冊視窗類,這個函數需要一個指向視窗類結構的指針。那麼RegisterClass這個windows API函數到底做了什麼呢,關于這個函數的源碼微軟是不會給出來的,因為它隻是提供一個系統程式設計接口,網上也找不到相關說明,隻是粗略介紹需要将類注冊給系統,但從msdn的atom table說明中我們發現這樣一段說明。The system uses atom tables that are not directly accessible to applications. However, the application uses these atoms when calling a variety of functions. For example, registered clipboard formats are stored in an internal atom table used by the system. An application adds atoms to this atom table using。答案有了,在我們構造一個視窗類結構後,我們需要将這個類結構指針加入到system atom table 即SAT中,這樣系統就可以通過查找這張表來找到使用者自定義的視窗類,window預定義的視窗類指針也在SAT中。SAT實際上實作了一種用于查詢的映射,atom實際類型是short,即16位資料。隻有系統才可直接通路這張表,但在調用某些api函數時,如Registerclass,可以告知系統來存取這張表。當然,還有本地原子表和全局原子表,這些表應用程式是可以直接通路的。 

繼續閱讀