getOwner與getParent的區別

2021-07-04 11:15:29 字數 1917 閱讀 6043

cwnd::getowner 這個函式獲得視窗的擁有者的指標。如果視窗沒有擁有者,則預設地返回父視窗物件的指標。注意在擁有者和被擁有者之間的關係與父子關係在幾個重要方面的差別。例如,具有父視窗的視窗被限制在父視窗的客戶區內,但是被擁有的視窗可以被畫在桌面上的任何位置。 cwnd::getparent 如果這個成員函式執行成功,則返回父視窗指標;否則返回值為null,表明發生了錯誤或沒有父視窗。呼叫這個函式以獲得子視窗的父視窗(如果有)的指標。getparent函式返回直接父視窗的指標。 要知道乙個視窗有乙個父視窗(他是父視窗的child),就是用getparent得到,乙個child視窗只能在父視窗的客戶區移動。 而對於對話方塊來說,他的父視窗永遠是最頂層的視窗,但是可以用getowner得到他的邏輯意義上的「父視窗」(因為對話方塊可以在螢幕中到處移動

,而child不是的。)

cwnd,cdc, c***等都是mfc的類,這些類提供了很多成員函式來執行系統呼叫等操作,但是核心的類成員資料都是 控制代碼,(包括視窗控制代碼,dc控制代碼,執行緒控制代碼等)。

m_hwnd

m_hdc

m_hthread

如果這些類物件的這些控制代碼為空,就表示無效物件。比如你 cwnd * pwnd = new cwnd,執行是合法的,但是沒有create就沒有視窗控制代碼,基本上就是乙個無效物件,只是系統記憶體申請了記憶體分配空間而已,很多操作都無法執行(debug模式下會出現斷言錯誤視窗)。

但是,假如你申請了乙個cwnd,cdc的物件實體,可以使用attach來指定乙個有效的控制代碼付給這個物件。那麼此物件就是valid的了。你可能跟蹤看看attach的實現,其實就是給m_h***賦值,而detach就是值復位。

這2個操作沒有申請記憶體釋放記憶體操作,就是乙個賦值而已,是不是成對使用看你**的實際情況吧。只要理解了這2函式的意義就行了

其實cwnd,cdc等類就是多了乙個包裝,方便使用者(程式開發者)使用,如果用sdk開發,完全可以實現一樣的功能。

控制代碼是作業系統核心物件,而視窗指標、dc指標是使用者物件(由你的程式管理)。

首先,要明白windows物件和mfc物件的區別。mfc物件實際上並沒有把整個windows物件都包裝在其中,它只是有乙個視窗控制代碼而已,這個視窗控制代碼如果指向乙個實際存在的視窗物件(視窗物件,也就是wndclass,是乙個windows物件),那麼這個mfc物件就是有效的,否則這個mfc物件是空的。如果你還不明白,請回憶一下,當我們使用mfc建立乙個視窗時,是分兩步進行的,第一步,new乙個cwnd物件,這一步是建立mfc物件,但是其中的hwnd還是非法的,因為對應的windows物件還沒有被建立出來;第二步,呼叫cwnd的成員函式create建立真正的windows物件,同時,把先前建立的mfc的cwnd物件的hwnd成員指向該視窗,這樣才算建立完畢乙個視窗。而如果你是用sdk方式,那麼只要建立乙個wndclass結構,然後呼叫create或者createex就建立了乙個視窗。 

好,現在回答你的問題,你可以假設,現在你已經有了乙個有效視窗控制代碼,那麼你想把這個視窗和乙個cwnd物件關聯起來怎麼辦?很簡單,用attach,其實就是讓乙個cwnd物件的hwnd成員指向這個視窗控制代碼。這就是attach主要完成的任務。

第二個,關於detach。如前所述,wndclass其實和cwnd根本沒有什麼關係。它們之間只是通過cwnd的成員hwnd聯絡起來的。如果把attach看做「聯姻」的話,那麼detach就是「離婚」了,通俗地說,就是切斷乙個cwnd物件和乙個有效視窗的臍帶。為什麼要切斷呢?因為cwnd是c++的物件,c++的物件有乙個生存期的概念,脫離了該物件的作用域,這個物件就要被銷毀,但是windows物件沒有這個特點,當銷毀cwnd物件的時候,我們不一定希望wndclass一起被銷毀,那麼在此之前,我們就先要把這個「臍帶」剪斷,以免「城門失火,殃及池魚」。

eg:cwnd* pwnd = new cwnd;

pwnd->create(_t("static"), "hi", ws_child | ws_visible,

SQL與NoSQL MySQL與NoSQL的融合

寫這一篇內容的原因是mysql5.6.2突然推出了memcached的功能。nosql to innodb with memcached的出現,可以看出nosql對關聯式資料庫的確產生了巨大的影響,個人覺得這是乙個非常大的進步,可以讓開發人員更加方便的使用nosql和關聯式資料庫。nosql一般被認...

指標與陣列 a與 a區別

假設宣告了乙個陣列a,則 a表示陣列a的首位址,a與 a 0 表示陣列a首元素的首位址,那麼 a 1與a 1有哪些區別呢?通過下面的實驗來說明。int i 0 int a 5 int p int a 1 for i 0 i 5 i printf a 0x p,a 0x p,a 1 0x p n a,...

apache與tomcat與weblogic對比

apache,tomcat,weblogic都是常用的中介軟體,發布 等應用都離不開這些好東東。強大程度對比apache 新手容易將apache與tomcat混亂。apache與tomcat都是同乙個公司生產的,apache是輕量級的,tomcat是企業級的。apache一般與php mysql等整...