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

Posted

技术标签:

【中文标题】动态创建MFC控件时如何重新创建资源编辑器使用的样式?【英文标题】:How to recreate style used by resource editor when creating MFC controls dynamically? 【发布时间】:2009-07-21 09:23:13 【问题描述】:

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

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

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

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

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

CStatic** m_pLabels;
CEdit**   m_pEdits;

控件的创建发生在对话框类的OnInitDialog() 方法中:

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");

感谢您的帮助!

【问题讨论】:

我不知道我应该选择哪个答案作为“接受的答案”,因为每个答案都回答了我的问题的一部分。这里的正常程序是什么? 好问题 - 不确定!我建议你只选择最能提供信息的一个并接受它,并附上一些评论来解释你做了什么。 另一种可能的解决方案是我自己回答问题,引用您的答案,然后选择我的答案作为接受的答案。或者我可以回答类似“阅读其他答案以获得最终解决方案”。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

例如,在具有确定/取消按钮和文本控件的对话框上放置一个简单按钮后,我的对话框在 .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

现在,由于我掌握了有关如何在后端创建对话框的所有信息,因此我可以简单地通过代码复制此行为。

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

【讨论】:

是的,通常我也会这样做。【参考方案3】:

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

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

【讨论】:

谢谢,解决了。我一定以某种方式错过了样式标志,因为我之前尝试过打开 .rc 文件的方法,但不知道为什么。

以上是关于动态创建MFC控件时如何重新创建资源编辑器使用的样式?的主要内容,如果未能解决你的问题,请参考以下文章

MFC如何动态添加控件

请教MFC中如何循环处理相同类型的控件,如编辑框之类的?

具有动态创建控件的 MFC 应用程序突然停止响应

MFC中动态添加控件----寻找多年的秘籍,吐血推荐

如何使用 CSpinButtonCtrl 类在 MFC 中动态创建微调按钮控件?

MFC如何添加自定义控件