C++ 动态创建MFC控件时,如何重新创建资源编辑器使用的样式?

C++ 动态创建MFC控件时,如何重新创建资源编辑器使用的样式?,c++,mfc,C++,Mfc,我需要在MFC对话框中动态创建一些控件。到目前为止,创建工作正常,但是动态创建的控件看起来与使用资源编辑器创建的控件不同。有些控件甚至表现不同。我认为,我缺少生成代码所做的一些初始化 目前我只创建CStatic和CEdit控件。当我动态创建它们时,它们都不使用标准的windows字体(如果我没记错的话,这种字体看起来更像windows 95之前使用的默认字体) 另外,CEdit控件的行为与我使用资源编辑器创建它时的行为不同。动态创建的控件似乎将文本长度限制为可见大小。我可以使用SetWindow

我需要在MFC对话框中动态创建一些控件。到目前为止,创建工作正常,但是动态创建的控件看起来与使用资源编辑器创建的控件不同。有些控件甚至表现不同。我认为,我缺少生成代码所做的一些初始化

目前我只创建
CStatic
CEdit
控件。当我动态创建它们时,它们都不使用标准的windows字体(如果我没记错的话,这种字体看起来更像windows 95之前使用的默认字体)

另外,
CEdit
控件的行为与我使用资源编辑器创建它时的行为不同。动态创建的控件似乎将文本长度限制为可见大小。我可以使用
SetWindowText()
设置较长的文本,并使用
GetWindowText()
将全文读回,但用户不能输入超过显示大小的文本。由资源编辑器创建的
CEdit
控件的行为不同:如果用户输入的文本长度超过可以显示的长度,则输入的文本在控件内“滚动”(没有滚动条,因为它只是一个单行控件)

我试图通过在控件上调用
SetLimitText()
来解决这个问题,但这并没有改变行为

控件将保存到对话框类中定义的数组中:

CStatic** m_pLabels;
CEdit**   m_pEdits;
for (int i = 0; i < max; i++)
{
  m_pLabels[i] = new CStatic();
  m_pLabels[i]->Create("key", WS_CHILD | WS_VISIBLE | SS_RIGHT,
    CRect(10, 10 + i * 30, 130, 35 + i * 30), this);

  m_pEdits[i] = new CEdit();
  m_pEdits[i]->CreateEx(WS_EX_CLIENTEDGE, "EDIT", "",
    WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_BORDER,
    CRect(133, 10 + i * 30, 350, 35 + i * 30), this, i + 100);
  m_pEdits[i]->SetLimitText(499);
  m_pEdits[i]->SetWindowText("value to be edited");
}
控件的创建在dialog类的
OnInitDialog()方法中进行:

CStatic** m_pLabels;
CEdit**   m_pEdits;
for (int i = 0; i < max; i++)
{
  m_pLabels[i] = new CStatic();
  m_pLabels[i]->Create("key", WS_CHILD | WS_VISIBLE | SS_RIGHT,
    CRect(10, 10 + i * 30, 130, 35 + i * 30), this);

  m_pEdits[i] = new CEdit();
  m_pEdits[i]->CreateEx(WS_EX_CLIENTEDGE, "EDIT", "",
    WS_CHILD | WS_TABSTOP | WS_VISIBLE | WS_BORDER,
    CRect(133, 10 + i * 30, 350, 35 + i * 30), this, i + 100);
  m_pEdits[i]->SetLimitText(499);
  m_pEdits[i]->SetWindowText("value to be edited");
}
for(int i=0;i创建(“键”,WS_CHILD | WS|u可见| SS|u RIGHT,
正确的(10,10+i*30130,35+i*30),这个;
m_pEdits[i]=新的CEdit();
m_pEdits[i]->CreateEx(WS_EX_CLIENTEDGE,“编辑”,“”,
WS|U CHILD | WS|U TABSTOP | WS|U VISIBLE | WS|U BORDER,
正确的(133,10+i*30350,35+i*30),这个,i+100;
m_pEdits[i]>SetLimitText(499);
m_pEdits[i]>SetWindowText(“要编辑的值”);
}

谢谢你的帮助

我认为最好的方法是通过对话框编辑器在对话框上放置控件,将其视觉样式设置为您选择的样式,然后在文本编辑器中打开.rc文件,并从中复制该控件的样式。通过这种方式,您将能够创建与通过对话框编辑器添加的控件更接近的控件

e、 例如,在对话框上放置一个简单的按钮,该对话框具有OK/Cancel按钮和文本控件,我的对话框在.rc文件中如下所示:

IDD_MFCAPP_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "MFCApp"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,263,7,50,16
    PUSHBUTTON      "Cancel",IDCANCEL,263,25,50,16
    CTEXT           "TODO: Place dialog controls here.",IDC_STATIC,10,96,300,8
    PUSHBUTTON      "Button1",IDC_BUTTON1,43,17,50,14
END
现在,由于我已经掌握了关于如何在后端创建对话框的所有信息,所以我可以通过代码简单地复制这个behviour


当然,您可以在单独的测试项目中执行此操作。

动态创建的控件最初总是获取常用字体:通常的方法是将控件的字体设置为父对话框的字体:类似

  pEdits[i]->SetFont(GetFont());

您需要将
ES_AUTOHSCROLL
样式添加到编辑框中。当您输入的文本超过框的显示范围时,此样式负责向左滚动文本


在文本编辑器中打开.rc文件并查找控件样式可以帮助您找到这些点。

谢谢,这就解决了问题。我一定是错过了风格标志,因为我以前尝试过打开.rc文件的方法,但不知道为什么。我不知道应该选择哪个答案作为“接受答案”,因为每个答案都回答了我问题的一部分。这里的正常程序是什么?好问题-不确定!我建议你选择信息量最大的一个,接受它,并发表一些评论来解释你所做的事情。另一个可能的解决办法是我自己回答这个问题,引用你的答案,然后选择我的答案作为被接受的答案。或者我可以用类似“阅读其他答案以获得最终答案”的方式回答。是的,通常我也会这样做。