MDIFrameWnd類GetActiveFrame和MDIGetActive的區別
檢視msdn可以知道GetActiveFrame其實是CFrameWnd的方法,是MDIFrameWnd繼承而來的方法,在msdn中其說明為:
CFrameWnd::GetActiveFrame
virtual CFrameWnd* GetActiveFrame( );
Return Value
A pointer to the active MDI child window.
If the application is an SDI application, or the MDI frame window has no active document, the implicit this pointer will be returned.
Remarks
If there is no active MDI child or the application is a single document interface (SDI), the implicit this pointer is returned.
從說明中我們可以看出,如果改CFrameWnd物件是MDI frame window那麼並且其有active document,那麼該方法的返回值應該是active MDI child window。這是官方的說明。
我們在看一下MDIGetActive方法的說明:
CMDIFrameWnd::MDIGetActive
CMDIChildWnd* MDIGetActive(
BOOL* pbMaximized = NULL
) const;
ParametersReturn ValueA pointer to the active MDI child window. |
但實際情況是否如此呢?至少我今天的經驗告訴我,不是如此。還是那個影像處理演算法框架的問題,昨天將RTTI做好之後,今天加進去了。但是其中在呼叫的時候出現了問題,由於訊息響應是在一LeftPanel中,不是在Doc中間,所以需要從CAlgorithDialog中間獲取Doc物件,下面是我的兩種獲取方式:
方法一:
CMainFrame* pWnd=(CMainFrame*)AfxGetMainWnd();
CImgPlatformDoc* pDoc=(CImgPlatformDoc*)pWnd->MDIGetActive()->GetActiveView()->GetDocument();
方法二:
CMainFrame* pWnd=(CMainFrame*)AfxGetMainWnd();
//CImgPlatformDoc* pDoc=(CImgPlatformDoc*)pWnd->MDIGetActive()->GetActiveView()->GetDocument();
CImgPlatformDoc* pDoc=(CImgPlatformDoc*)pWnd->GetActiveFrame()->GetActiveView()->GetDocument();
你會發現第二種方法獲取的pDoc實際上是一個NULL值。今天下午在這個問題上犯困了很久,因為一直沒有辦法獲取到Doc物件,一直覺得很奇怪,各種手段都用上了,包括髮送自定義訊息到CMainFrame中,從CMainFrame中呼叫Doc物件進行處理,但是發現獲取的DOC物件一直是NULL,因為獲取GetActiveFrame的方法一直沒有變,不要和我說你直接用GetActiveDocument方法來獲取DOC物件,我也嘗試過,發現和第二種方法一樣也是空。
到目前為止還沒有找個這兩者之間到底有什麼區別,看到網上很多人說值CMainFrame中直接用GetActiveDocument就可以獲取當前Active的DOC物件了,我表示很懷疑,因為確實會有返回值,但是你檢視物件資料就會發現資料時不對的,而且返回的DOC物件的地址其實是0x00000000也就是說是一個NULL物件。
希望有了解這個問題的同學給我講解一下這個問題吧。
相關文章
- MFC幾個常用函式:OnCreate和OnInitialUpDate,GetActiveFrame和MDIGetActive,Invalidate、SetModifiedFlage、UpdateAll函式
- 介面和抽象類的區別抽象
- Object類和String類equals方法的區別Object
- JAVA中介面和抽象類的區別Java抽象
- 抽象類和介面的區別抽象
- MVC下的DAO介面類和SERVICE介面類區別?MVC
- python新式類和舊式類區別Python
- 偽元素和偽類的區別總結
- HTTP協議類POST 和GET的區別HTTP協議
- 伺服器硬碟的分類和區別伺服器硬碟
- 物件建立模式和類建立模式的區別物件模式
- java-介面和抽象類的聯絡和區別。Java抽象
- python的模組和類有什麼區別Python
- python類中super()和__init__()的區別Python
- Python 靜態方法和類方法的區別Python
- Java中異常分類和Throw和Throws的區別Java
- Java中抽象類和介面的區別Java抽象
- 類銀河惡魔城和類魂的區別是什麼?
- C#中類和結構的一個區別...C#
- 什麼是序列化?物件和類的區別?物件
- StringBuffer類的delete()方法和deleteCharAt()方法的區別delete
- ../和./和/的區別
- date類與calendar的區別
- 和 的區別
- as 和 with的區別
- ||和??的區別
- /*和/**的區別
- JQ操作類與JS操作類的區別JS
- LinkedList和ArrayList的區別、Vector和ArrayList的區別
- http和https的區別/get和post的區別HTTP
- python語言中類和函式的作用及區別!Python函式
- Android主專案和Module中R類的區別Android
- 征服 JavaScript 面試:類繼承和原型繼承的區別JavaScript面試繼承原型
- 【4】JDK和CGLIB生成動態代理類的區別JDKCGLib
- 靜態內部類和非靜態內部類區別
- c# 中的靜態類(satic class)和具體類的區別及用法C#
- [CSS] 偽元素和偽類,::before 和 :before 區別CSS
- 多維度分析:抽象類和介面的區別抽象