为啥子控件不出现在 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 中的主要内容,如果未能解决你的问题,请参考以下文章

第三章 控件(6~7课)

在MFC 如何设置按钮的颜色

如何在 MFC 的 CWnd 中显示 CFormView?

焦点不会改变嵌套 CWnd 派生类中的制表键

MFC中怎么让一个继承CWnd的静态控件来响应鼠标移动的消息

六. 对话框编程--Windows编程课程学习笔记