为啥子控件不出现在 MFC 派生的 CWnd 中
Posted
技术标签:
【中文标题】为啥子控件不出现在 MFC 派生的 CWnd 中【英文标题】:Why child control doesn't appear in MFC derived CWnd为什么子控件不出现在 MFC 派生的 CWnd 中 【发布时间】:2014-04-07 11:17:28 【问题描述】:我想将简单的 Cedit 添加到我从 CWnd 派生的 GUI 类中。该类是简单的容器,与 MFC 中的 Panel 相同。在类的构造函数中,我在类中添加了简单的 CEdit 实例。 但是当我在客户端对话框中实例化面板时,面板显示但按钮不显示。为什么它不显示。 面板代码
面板头文件
#pragma once
#include "afxwin.h"
class CPanel :
public CWnd
public:
CPanel(void);
~CPanel(void);
virtual void PreSubclassWindow();
virtual void DoDataExchange(CDataExchange* pDX);
CEdit *txt;
DECLARE_MESSAGE_MAP()
;
面板源文件
#include "stdafx.h"
#include "Panel.h"
CPanel::CPanel(void)
WNDCLASS wndcls;
HINSTANCE hins=AfxGetInstanceHandle();
if(!(::GetClassInfo(hins,_T("CPanelCtrl"),&wndcls)))
wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
wndcls.lpfnWndProc=::DefWindowProc;
wndcls.cbClsExtra=wndcls.cbWndExtra=0;
wndcls.hInstance=hins;
wndcls.hIcon=NULL;
wndcls.hCursor=AfxGetApp()->LoadStandardCursor(IDC_CROSS );
wndcls.hbrBackground=(HBRUSH)(COLOR_3DFACE+13);
wndcls.lpszMenuName=NULL;
wndcls.lpszClassName=_T("CPanelCtrl");
txt=new CEdit();
txt->Create(ES_PASSWORD,CRect(10,10,25,35),this,1);
if (!AfxRegisterClass(&wndcls))
AfxThrowResourceException();
return;
else
return;
CPanel::~CPanel(void)
void CPanel::PreSubclassWindow()
// TODO: Add your specialized code here and/or call the base class
CWnd::PreSubclassWindow();
void CPanel::DoDataExchange(CDataExchange* pDX)
// TODO: Add your specialized code here and/or call the base class
CWnd::DoDataExchange(pDX);
BEGIN_MESSAGE_MAP(CPanel, CWnd)
END_MESSAGE_MAP()
在 OninitDialog 方法的对话框中我喜欢这样
panel=new CPanel();
panel->Create(L"CPanelCtrl",L"Hello ", WS_VISIBLE , CRect(70, 70, 400, 200), this, 1);
【问题讨论】:
【参考方案1】:两个提示:
首先:您为 CEdit 分配与 CPanel 相同的 ID:1。
第二:你在 CPanel 构造函数中创建 CEdit,我会尝试在 CPanel WM_CREATE 处理程序中创建它,因为在 CPanel 构造函数中 CPanel 的 HWND 尚未分配。
【讨论】:
这没关系。据我了解,编辑控件应该是面板内的成员(子)。 @xMRi 它仍然需要一个有效的父 HWND【参考方案2】:-
创建编辑控件的代码只运行一次,因为在窗口类注册后,编辑控件就永远不会被创建。
在创建父窗口时,不能创建子窗口。
在父窗口的 WM_CREATE 处理程序中创建子窗口。
如果您总是有一个编辑控件,为什么要使用指向它的指针。只需创建一个简单的成员。
如果编辑控件位于面板内,则应使用 WS_CHILD。
【讨论】:
谢谢。你是对的。我应该处理 WM_CREATE。通过处理它,一切正常以上是关于为啥子控件不出现在 MFC 派生的 CWnd 中的主要内容,如果未能解决你的问题,请参考以下文章