VC中窗口ID,句柄,指針三者相互轉換函數

VC中窗口 ID 句柄,指針三者相互轉換函數

ID--HANDLE--HWND三者之間的互相轉換
id->句柄        hWnd = ::GetDlgItem(hParentWnd,id);
id->指針        CWnd::GetDlgItem();
句柄->id        id = GetWindowLong(hWnd,GWL_ID);
句柄->指針    CWnd *pWnd=CWnd::FromHandle(hWnd);
指針->ID       id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);
                                            GetDlgCtrlID();
指針->句柄     hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;  
編程

指針的使用在編程過程當中相當重要,恰到好處並能正確無誤的使用指針不但可以提升程序自身的運行效率,並且有助於節省程序執行所須要消耗的資源。指針對應着某個數據在內存空間中的地址,獲得了指針就能夠自由地修改該數據。句柄表明指針的「指針」,也能夠將其比做表中數據項的索引值( 表對應某個進程自身的內存空間 )。句柄是間接的引用對象。函數

        指針和句柄的不一樣之處spa

  • 句柄所指的能夠是一個很複雜的結構,而且頗有可能與系統有關的,好比上面所說線程的句柄,它指向的就是一個類或者結構,它和系統有很密切的關係。當一個線程因爲不可預料的緣由而終止時,系統就能夠經過句柄來回收它所佔用的資料,如CPU,內存等等。反過來想,這些句柄中的某一些,是與系統進行交互用的。
  • 指針它也能夠指向一個複雜的結構,但一般是由用戶自我定義的,因此一些必需的工做都要由用戶本身完成,特別是在刪除的時候。
  • 另外須要注意的是句柄每每有本身的存在區限,好比一個進程,若是將其傳遞到另外一個進程中,句柄也就失去了意義( 表中數據項的索引值,索引離開了具體的表也就失去了意義 )。

        具體轉換線程

        ( 句柄轉爲指針 )指針

        CWnd* pWnd=FromeHandle(hMyHandle); 
        pWnd->SetWindowText("Hello World!"); 

        or 

        CWnd* pWnd; 
        pWnd->Attach(hMyHandle);  
對象

        MFC類中有的還提供了標準方法,好比Window句柄索引

        static CWnd* PASCAL FromHandle( 
        HWND hWnd 
        ); 
        HWND GetSafeHwnd( ) const; 

        對於位圖: 
        static CBitmap* PASCAL FromHandle( 
       HBITMAP hBitmap 
         );  
         static CGdiObject* PASCAL FromHandle( 
       HGDIOBJ hObject 
         ); 
        HGDIOBJ GetSafeHandle( ) const;
進程

        固然,更詳細的信息須要在具體使用中自我查詢。內存

建 議:指針和句柄的使用屬於比較複雜、危險性較高的應用,在具體實踐中,若是能夠,儘可能不要使用指針和句柄,最好選擇現有的、封裝無缺的方式來實現,更別提指針同句柄的轉換了,它更加危險。資源

        好比在操做字符串時,儘可能使用CString類來實現,經過定義好的構造、析構函數來完成分配和回收,最好不要經過指針來動態操做。

相關文章
相關標籤/搜索