搞了這麼久的Windows開發,我依然會頻繁地對這個問題比較茫然:什麼是一個頂級(top-level)窗口?那,今天就來叨叨一下。
一個top-level窗口是一個不是子窗口的窗口(繞口令來了)。說白了,就是說,這個窗口不帶有WM_CHILD屬性。
更多解析> top-level窗口和子窗口不同,一個top-level窗口可以被顯示在屏幕的任何位置,而子窗口一般隻能顯示在它的父窗口的客戶區。
> 有很多文檔裡定義top-level窗口為:一個沒有父窗口的窗口。這個說法可能到導緻某種誤解:很多人認為使用CreateWindow(Ex)并傳遞一個有效的父窗口句柄可以創建一個”有父窗口”的窗口。如果根據這個定義,則這個窗口就不是一個top-level窗口。
> 一個top-level窗口可以被或者不被擁有,但是它永遠也不可能是一個子窗口。我們可以說一個窗口有一個擁有者,但是它沒有一個父窗口。
> top-level窗口可以是一個重疊(Overlapped)窗口(帶有WS_OVERLAPPED屬性,通常作為應用程序主窗口), 也可以是一個彈出式窗口(帶有WM_POPUP屬性,通常用于各類彈出消息框)。
> 一些涉及窗口操作的API如CreateWindow(Ex), MoveWindow, SetWindowPos,總是使用屏幕坐标系(左邊原點位于屏幕左上角)。
倆例子兒下面創建了一個top-level窗口,因為它沒有設置WM_CHILD屬性。同時,它沒有設置父窗口,所以它沒有被擁有。
下面也是創建了一個top-level窗口,因為它沒有設置WM_CHILD屬性。同時,它設置了父窗口,所以它被這個父窗口所擁有。
總結
經過這麼一番咀嚼,應該是搞明白什麼是一個top-level窗口了吧?今日份叨叨完畢。
最後本文來自”代碼大拿”(CodeGuru):《Windows SDK: What is a top-level window?》
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!