日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

MFC获得主窗口和父窗口指针

發(fā)布時(shí)間:2025/3/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MFC获得主窗口和父窗口指针 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。