我需要动态地在MFC对话框中创建一些控件.到目前为止,创建工作正常,但动态创建的控件与使用资源编辑器创建的控件看起来不同.有些控件甚至表现不同.我想,我错过了生成的代码所做的一些初始化.
目前我只创建CStatic
和CEdit
控制.当我动态创建它们时,两者都不使用标准的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)
谢谢你的帮助!
动态创建的控件最初总是获得股票字体:通常的方法是将控件的字体设置为父对话框的字体:类似于
pEdits[i]->SetFont(GetFont());
Run Code Online (Sandbox Code Playgroud)
我认为最好的方法是通过对话框编辑器在对话框上放置一个控件,将其视觉样式设置为您选择的样式,然后在文本编辑器中打开 .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 当然,您可以在单独的测试项目中执行此操作。
归档时间: |
|
查看次数: |
2595 次 |
最近记录: |