CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  界面

关于对话框的父窗口问题

楼主silencee(原子)2006-03-02 15:30:20 在 VC/MFC / 界面 提问

本人通过如下方法创建对话框,所在类为自定义控件,类名为CComboBtns。  
  CPanel   *pPanel;  
   
  //创建图元工具集合工具面板  
  pPanel   =   new   CPanel(   this   );  
  if(!pPanel->Create(IDD_PANEL,   this))  
  {  
  TRACE("Create   Panel   fails.");  
  return   FALSE;  
  }  
   
  //pPanel->SetParent(   this   );  
  if(   this->GetSafeHwnd()   !=   NULL   )  
  {  
  TRACE("不为空\r\n");  
  TRACE("面板的父窗口是%d\r\n",   this->GetSafeHwnd());  
  TRACE("面板的父窗口是%d\r\n",   pPanel->GetParent()->GetSafeHwnd());  
  }  
  TRACE("面板的父窗口是%s\r\n",   pPanel->GetParent()->GetRuntimeClass()->m_lpszClassName);  
   
  输出结果为:  
  不为空  
  面板的父窗口是332286  
  面板的父窗口是528816  
  面板的父窗口是CMainFrame  
  甚至明确设置的父窗口,结果还是一样。为什么创建对话框明明父窗口不是空的,结果还是以MainFrame作为父窗口呢?麻烦大侠们指点迷津呀。 问题点数:20、回复次数:9Top

1 楼Atomictry(天影)回复于 2006-03-02 15:58:34 得分 0

确实不解,this->GetSafeHwnd()应该与pPanel->GetParent()是一样的。  
  看看其他人的解释。Top

2 楼silencee(原子)回复于 2006-03-06 11:27:24 得分 0

怎么没有人能解决啊???  
  Top

3 楼silencee(原子)回复于 2006-03-06 11:30:04 得分 0

我郁闷啊!!!!!!!  
  仁慈的主啊,赐于我一个高手吧!!!!顶礼膜拜,再拜.Top

4 楼syy64(太平洋)回复于 2006-03-06 11:34:25 得分 0

对话框和控件类是两码事。Top

5 楼Mackz(在相互)回复于 2006-03-06 12:13:38 得分 0

The   GetParent   function   returns   a   pointer   to   the   immediate   parent   (if   it   exists).   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.    
   
  另外,“this->GetSafeHwnd()应该与pPanel->GetParent()是一样的”这句话不知作何解?Top

6 楼YufengShi(浪子)回复于 2006-03-06 12:41:11 得分 0

CPanel是怎么定义的?Top

7 楼silencee(原子)回复于 2006-03-06 14:03:50 得分 0

CPanel的定义:  
  class   CPanel   :   public   CDialog  
  {  
  //   Construction  
  public:  
  constructor  
  CPanel(CWnd*   pParent   =   NULL);  
  ~CPanel();  
  private:  
  void   InitIcon(int   Index);  
  CArray<CBtnInfo,   CBtnInfo>   m_BtnInfo;  
  int   m_uIndex;  
  int   m_uIconNum;  
  CArray<CPanelBtn*,   CPanelBtn*>   m_Btns;  
  CToolTipCtrl   m_tip;  
   
  //   Dialog   Data  
  //{{AFX_DATA(CPanel)  
  enum   {   IDD   =   IDD_PANEL   };  
  //   NOTE:   the   ClassWizard   will   add   data   members   here  
  //}}AFX_DATA  
   
  //   Overrides  
  //   ClassWizard   generated   virtual   function   overrides  
  //{{AFX_VIRTUAL(CPanel)  
  public:  
  virtual   BOOL   PreTranslateMessage(MSG*   pMsg);  
  protected:  
  virtual   void   DoDataExchange(CDataExchange*   pDX);         //   DDX/DDV   support  
  //}}AFX_VIRTUAL  
   
  //   Implementation  
  protected:  
   
  //   Generated   message   map   functions  
  //{{AFX_MSG(CPanel)  
  afx_msg   int   OnCreate(LPCREATESTRUCT   lpCreateStruct);  
  afx_msg   void   OnBtnClick(WPARAM   wParam,   LPARAM   lParam);  
  afx_msg   void   OnActivate(   UINT   nState,   CWnd*   pWndOther,   BOOL   bMinimized   );  
  //}}AFX_MSG  
  DECLARE_MESSAGE_MAP()  
  };Top

8 楼silencee(原子)回复于 2006-03-07 11:37:32 得分 0

那么请问我如何获得对话框在创建时传进去的父窗口指针呢?创建对话框函数BOOL   Create(   LPCTSTR   lpszTemplateName,   CWnd*   pParentWnd   =   NULL   );中的参数pParentWnd的定义MSDN是  
  这样描述的:Points   to   the   parent   window   object   (of   type   CWnd)   to   which   the   dialog   object   belongs.   If   it   is   NULL,   the   dialog   object's   parent   window   is   set   to   the   main   application   window.我在创建对话框时,是指明了父窗口的。使用GetParent时获得的是main   application   window,在我的程序中就是MainFrame,用GetParentOwner得到的是他自己CPanel。这些都是通过传递消息给父窗口测试的。我真的搞糊涂了,~-~Top

9 楼silencee(原子)回复于 2006-03-10 09:08:37 得分 0

我已经知道怎么获得对话框在创建时传进去的父窗口指针了。原先是想在CPanel中发送消息给他的父窗口的,GetParent(得到MainFrame窗口的指针)和GetParentOwner(CPanel的指针)都得不到正确的父窗口,即得到的父窗口不是当时创建时传进去的父窗口指针,所以我只好另辟蹊径,找别的方法了。我在CPanel定义一个CWnd*变量,在CPanel::OnCreate(LPCREATESTRUCT   lpCreateStruct)中通过参数lpCreateStruct结构中的hwndParent来获得父窗口。发送消息给该窗口可以收到消息。问题是解决了,但是到现在我也不知道为什么GetParent得到的为什么是MainFrame,还有GetParent和GetParentOwner的区别。Top

相关问题

  • 无模式对话框的父窗口???
  • 对话框的控件怎么获得父窗口的句柄?
  • 子对话框如何操作父窗口的控件?
  • 子对话框如何操作父窗口的控件?
  • 如何实现父窗口关闭时不弹出对话框?
  • 对话框算窗口吗?
  • 创建一模式对话框后怎样向其父窗口传递数据?
  • 以View为父窗口弹出的对话框,其GetParent()不是View?
  • 框架页面弹出的模态对话框刷新其父窗口
  • 线程中非模式对话框怎么传递参数给父窗口?

关键词

  • 指针
  • virtual
  • 消息
  • cpanel
  • 父窗口
  • ppanel
  • 对话框
  • getparent
  • getparentowner
  • 面板

得分解答快速导航

  • 帖主:silencee

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo