关于在模态对话框中获取父窗口对象的方法研究

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于在模态对话框中获取父窗口对象的方法研究

姚君

/************************************************ *******************************/ 测试方法

/************************************************ *******************************/ 首先,新建一个默认的单文档应用程序。然后添加对话框资源,并为该对话框资源关联一个类,例如:CSl;为添加菜单,如Test;为view 类添加成员变量:public: COLORREF m_clr; 在view 类下添加菜单命令函数:void CColrView::OnTest() { // TODO: Add your command handler code here Csl dlg(this);//指定当前view 类窗口为模态对话框父窗口dlg.DoModal();} 在CSl 类中添加消息响应函数(WM_PAINT): void Csl::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Add your message handler code here CColrView *

cp=(CColrView *)GetParent();//不能正确的获取父窗口view 类对象指针CWnd *cw=GetParent(); m_clr=((CColrView *)m_pParentWnd)->m_clr;//可以通过断点debug,发现m_clr 是我们要的值。// Do not call CDialog::OnPaint() for painting messages } 注意:m_pParentWnd 是在CDialog 类中定义的,该类的头文件是"AFXWIN.H ”;protected: CWnd*

m_pParentWnd; 为什么调用CWnd 类的GetParent 方法不能

正确的获取到父窗口类对象指针的问题留待有时间认真阅读该函数源代码后再予以说明。

[---------------------------------------------------------------------------------------------------------------------

---------------------------------------------------] 关于GetParent 方法不能正确获取父窗口类对象指针的问题已得到解决,先将研究结果放置于下方

[---------------------------------------------------------------------------------------------------------------------

---------------------------------------------------] 首先,来看MFC 的源代码,这儿找到的是CWnd* CWnd::GetParentOwner(),该函数源码位于WINCORE.CPP 中。CWnd*

CWnd::GetParentOwner() const { if (GetSafeHwnd() == NULL) // no Window attached return NULL;

ASSERT_VALID(this); HWND hWndParent = m_hWnd; HWND hWndT; while ((::GetWindowLong(hWndParent, GWL_STYLE) & WS_CHILD) && (hWndT

= ::GetParent(hWndParent)) != NULL) { hWndParent = hWndT; } return CWnd::FromHandle(hWndParent); } 首先,调用了WIN32API 函数GetWindowLong来获取Windows Styles,然后与WS_CHILD 进行&运算,之后又调用全局API 函数GetParent 获取父窗口句柄.注意,这儿是一个While 循环,

所以最终找到的将是the most immediate parent or owner window that is not a child window (does not have the

WS_CHILD style)的句柄。最后将句柄传给CWnd::FromHandle 函数并将返回的CWnd 指针作为函数的返回值。因为没有找到GetParent 函数源码,那么就MSDN 一下,在MSDN 中是这样介绍的:Remarks Call this function to get a pointer to a child window’s parent window (if any). The GetParent function returns a pointer the immediate parent. In contrast, the GetParentOwner function returns a pointer to the most immediate parent or owner window that is not a child window (does not have the WS_CHILD style). If you have a child window within a child window GetParent and GetParentOwner return different results. 现在让我们回到上边的程序中断点调试。在CMainFrame 类的OnCreate 函数中有一个this 调用,我们就在这儿设置第一个断点;在view 类OnTest 函数设置第二个断点;在CSl 类OnPaint 函数中设置第三个断点。然后调试运行。我们会发现指针cp、cw 的值其实就是this 指针的值,也就是指向了框架类窗口对象。所以我们想要调用m_clr 就会出错。CWnd::GetParent()函数在view 类方法中调用时可以正确的找到父窗口。

[---------------------------------------------------------------------------------------------------------------------

相关文档
最新文档