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

ID--HANDLE--HWND三者之間的互相轉換
id->句柄        hWnd = ::GetDlgItem(hParentWnd,id);
id->指針        CWnd::GetDlgItem();
句柄->id        id = GetWindowLong(hWnd,GWL_ID);
句柄->指針    CWnd *pWnd=CWnd::FromHandle(hWnd);

如:CEpdscDlg* pdlg=(CEpdscDlg*)CWnd::FromHandle(myhwnd);//這樣就獲得了對話框資源的指針;使用初始化實例GI()->只能對非控件變量作用。
pdlg->UpdateBranchName(cur,newname);
指針->ID       id = GetWindowLong(pWnd->GetSafeHwnd,GWL_ID);
                                            GetDlgCtrlID();
指針->句柄     hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;  

 

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

        指針和句柄的不同之處

  • 句柄所指的可以是一個很複雜的結構,並且很有可能與系統有關的,比如上面所說線程的句柄,它指向的就是一個類或者結構,它和系統有很密切的關係。當一個線程由於不可預料的原因而終止時,系統就可以通過句柄來回收它所佔用的資料,如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類來實現,通過定義好的構造、析構函數來完成分配和回收,最好不要通過指針來動態操作。

(轉摘)

來自: http://hi.baidu.com/wuyan3158/blog/item/158179d999dfb4e238012f4c.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章