关于对话框的父窗口问题
本人通过如下方法创建对话框,所在类为自定义控件,类名为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




