使用MFC以编程方式创建控件

时间:2009-06-09 18:43:20

标签: c++ mfc

我只是想知道该怎么做。 我写道:

CEdit m_wndEdit;

并在按钮事件处理程序(对话框应用程序)中, 我写道:

m_wndEdit.Create(//with params);

但我仍然没有看到控件出现在用户界面中。

我实际上是在按钮处理程序中写的:

CWnd* pWnd = GetDlgItem(IDC_LIST1);
CRect rect;

pWnd->GetClientRect(&rect);

//pWnd->CalcWindowRect(rect,CWnd::adjustBorder);

wnd_Edit.Create(ES_MULTILINE | ES_NOHIDESEL | ES_READONLY,rect,this,105);

wnd_Edit.ShowWindow(SW_SHOW);

this->Invalidate();

id 105不存在。 (我在Create的{​​{1}}成员函数中使用它。我只是把它放在那里。它不应该是你想给新控件的id吗?它应该已经存在吗?

3 个答案:

答案 0 :(得分:4)

使用MSDN中提到的示例检查以下标志集:

   pEdit->Create(ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_NOHIDESEL | ES_READONLY,
      rect, this, 105);

答案 1 :(得分:4)

  • 无需使用Invalidate()

  • 将WS_VISIBLE标志添加到您的创建标志,您不需要ShowWindow

  • 您正在IDC_LIST1所在的位置创建按钮 - 您可能希望在GetClientRect()之后执行pWdn-> Destroy()

  • 您传递给Create()的ID可以是任何内容,当然如果您想要稍后处理来自此按钮的消息,则需要使用正确的ID。在这种情况下,最简单的方法是在resource.h中手动添加一个条目。

  • “我把这段代码放在按钮事件处理程序中”是什么意思 - 哪个按钮?与你想要创作的那个不同,我可能希望?您的代码是否完全被调用,当您放入断点时是否会停止?调用Create()后wnd_Edit-> m_hWnd的值是多少?

  • wnd_Edit是对话框的成员,对,而不是函数局部变量?

答案 2 :(得分:0)

wnd_Edit究竟是什么?如果它是该函数中的局部变量,则可能是问题所在。 CWnd析构函数破坏与CWnd关联的窗口。因此,当wnd_Edit超出范围时,编辑框也会被销毁。 如果不是这样,请检查Create()的返回值。它是NULL吗?如果是,请检查GetLastError()的值。