动态创建MFC控件时如何重新创建资源编辑器使用的样式?
Posted
技术标签:
【中文标题】动态创建MFC控件时如何重新创建资源编辑器使用的样式?【英文标题】:How to recreate style used by resource editor when creating MFC controls dynamically? 【发布时间】:2009-07-21 09:23:13 【问题描述】:我需要在 MFC 对话框中动态创建一些控件。到目前为止,创建工作正常,但动态创建的控件看起来与使用资源编辑器创建的控件不同。一些控件甚至表现不同。我认为,我缺少生成的代码所做的一些初始化。
目前我只创建CStatic
和CEdit
控件。当我动态创建它们时,两者都不使用标准的 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控件时如何重新创建资源编辑器使用的样式?的主要内容,如果未能解决你的问题,请参考以下文章