MFC获得主窗口和父窗口指针
VC++中有關(guān)句柄和指針及其轉(zhuǎn)換
1.MFC窗口的句柄和指針的轉(zhuǎn)換
????? (1) 一般窗口對(duì)象都會(huì)有一個(gè)其對(duì)應(yīng)的句柄變量,所以我們可以取此對(duì)象的m_hWnd屬性來得到句柄。
????? (2)使用GetSafeHwnd函數(shù)取得程序所在窗口類的句柄
????? (3)使用FromHandle函數(shù)來通過句柄得到其想要的指針
????? 其他的一些方法:
????? GetActiveWindow 取當(dāng)前活動(dòng)窗口句柄
????? AfxGetMainWnd?? 取主窗口句柄
????? GetForegroundWindow 取前臺(tái)窗口句柄
????? FindWindow尋找參數(shù)指定的窗口
????? EnumWindow枚舉窗口
2. 上下文無(wú)關(guān)設(shè)備的句柄和指針的轉(zhuǎn)換
????? (1)this->m_hDC
????? (2)CDC::GetSafeHdc
????? (3)可以使用FromHandle函數(shù)來通過句柄得到其想要的指針
3.Gdi對(duì)象的句柄和指針的轉(zhuǎn)換
??????? (1)this->m_hObject
??????? (2)CGdiObject::GetSafeHandle
??????? (3)可以使用FromHandle函數(shù)來通過句柄得到其想要的指針
4.窗口、控件的指針和句柄的相互轉(zhuǎn)化
(1)指針轉(zhuǎn)化為句柄
在MFC應(yīng)用程序中首先要獲得窗口的指針,然后將其轉(zhuǎn)化為句柄
CWnd* pWnd;
HANDLE hWnd = pWnd->GetSafeHwnd();
(2)句柄轉(zhuǎn)化為指針
在MFC應(yīng)用程序中首先獲得對(duì)話框控件的句柄,然后獲得其指針
HANDLE hWnd;
GetDlgItem(IDC_xxx,&hWnd);
CWnd * pWnd = FromHandle(hWnd);
?
獲得程序窗口指針的辦法
(1)獲得主框架窗口指針(任何時(shí)候都可以用,只要是MFC程序中)
CWnd* pWnd = AfxGetMainWnd();
(2)獲得對(duì)話框中控件指針
CWnd* pWnd = GetDlgItem(IDC_xxx);
(3)獲得對(duì)話框中某控件的句柄
HANDLE GetDlgItem(m_hDLG,m_nID_DlgItem);
(4)獲得GDI對(duì)象的句柄
HANDLE m_hGDIObj = m_pGDIObj->GetSafeHanle();
版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
假如父窗口類名稱為CFatherDlg,那么在子窗口中可以調(diào)用GetParent獲取父窗口對(duì)象指針,如
CFatherDlg* pFather = (CFatherDlg*)GetParent();
這樣就能夠用pFather調(diào)用所有父類的公開方法和類成員變量了
這個(gè)代碼只針對(duì)對(duì)話框應(yīng)用,文檔應(yīng)用沒用過
其實(shí)這個(gè)最好的方法還是傳指針
GetParent()??;??獲取到父指針后再進(jìn)行一下強(qiáng)制轉(zhuǎn)換
在這里,你要明白指針都是32位的,只是因?yàn)镃++是強(qiáng)類型的語(yǔ)言,所以不轉(zhuǎn)換編譯不通過
因此進(jìn)行強(qiáng)制轉(zhuǎn)換可以騙過編譯器
雖然轉(zhuǎn)換了,但是因?yàn)椴还苁裁粗羔樁际?2位,所以并沒有損失數(shù)據(jù)
比如在CMyView中獲取CFrameWnd的指針可以這樣
CFrameWnd *pFrameWnd = ((CFrameWnd *)GetParent());
http://www.cctry.com/thread-2635-1-1.html
在父類中定義了一個(gè)變量 com,子類模式對(duì)話框,里面有一個(gè)tab控件,tab控件上的一頁(yè)上有個(gè)button,我想單機(jī)button,調(diào)用父類的com。使用GetParent(),有問題,沒有獲取到com的狀態(tài),獲取的代碼如下: CSetZeroDlg *parent = (CSetZeroDlg *)GetParent(); CCalibrationDlg *pparent = (CCalibrationDlg *)parent->GetParent(); 請(qǐng)問怎么解決? 獲取一個(gè)類的變量,在該類被實(shí)例化后,只要獲取該類的對(duì)象或?qū)ο笾羔樅笸ㄟ^對(duì)象或?qū)ο笾羔樇纯稍L問,這是一般的方法,根本就不用管他是父類還是子類。你想訪問父類中定義了一個(gè)變量 com變量,那么只要獲取父類對(duì)象即可。GetParent函數(shù)是獲取該窗口的父窗口對(duì)象的窗口類指針,而不是獲取父類對(duì)象窗口指針。不要把類的父子關(guān)系與窗口的父子關(guān)系混淆了。? MFC編程中常常遇到子窗口向父窗口傳遞參數(shù)的情況,這就需要獲得父窗口的指針。
??????? 例:主對(duì)話框CMyMainDlg通過按鈕ButtonA進(jìn)入對(duì)話框CMyParentDlg,CMyParentDlg在通過按鈕ButtonB進(jìn)入對(duì)話框CMyChildDlg。現(xiàn)在需要在CMyChildDlg分別訪問CMyParentDlg和CMyMainDlg的內(nèi)容,需要在CMyChildDlg中加入以下兩條語(yǔ)句:
??????? CMyMainDlg??? *pMMD = (CMyMainDlg*)AfxGetMainWnd();???? //獲取主窗口指針
??????? CMyParentDlg *pMPD = (CMyParentDlg*)this->GetParent();?? //獲取父窗口指針
??????? 其中,this代表當(dāng)前窗口指針,指向CMyChildDlg;pMMD和pMPD便是指向主窗口和父窗口的指針。
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的MFC获得主窗口和父窗口指针的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CString与LPCWSTR、LPST
- 下一篇: java会被rust替代吗_自从尝了 R