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

Xpe*_*tal 5 c++ mfc

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

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

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

我尝试通过调用SetLimitText()控件来解决这个问题,但这并未改变行为.

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

CStatic** m_pLabels;
CEdit**   m_pEdits;
Run Code Online (Sandbox Code Playgroud)

控件的创建发生在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");
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Dav*_*idK 5

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

  pEdits[i]->SetFont(GetFont());
Run Code Online (Sandbox Code Playgroud)


Aam*_*mir 4

我认为最好的方法是通过对话框编辑器在对话框上放置一个控件,将其视觉样式设置为您选择的样式,然后在文本编辑器中打开 .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
Run Code Online (Sandbox Code Playgroud)

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

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