【发布时间】:2014-08-23 19:30:42
【问题描述】:
我为一个(无模式)对话框编写了一个资源脚本,该对话框应该包含一个编辑控件(用于显示非编辑日志报告):
IDD_LOG DIALOGEX 10, 10, 300, 200, 0
STYLE WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_BORDER | WS_SYSMENU | DS_CENTER
CAPTION "Last Log Report"
{
EDITTEXT 301, 0, 0, 250, 180, WS_VISIBLE | WS_CHILD | WS_VSCROLL | ES_MULTILINE | ES_READONLY
}
当我通过菜单调用对话框时
hwndLogDlg = CreateDialog(NULL, MAKEINTRESOURCE(IDD_LOG), hwnd, (DLGPROC)LogDlgProc)
以下几点是不对的:
- 对话框窗口包含一个编辑控件,但上面还有另一个大小相同的编辑控件。该编辑控件似乎是一个非子窗口。
此外,当我在调用
SetDlgItemText(hwndLogDlg, IDDE_LOGTXT, "<Could not load log data>");的编辑控件中设置文本时,它们都已设置。
我怀疑资源编译器将脚本中的编辑控件视为对话框的子项和第二次作为单独的窗口,尽管设置了 WS_CHILD。 - 创建对话框时主窗口被阻止,尽管对话框是无模式的。
- 即使我在 WM_QUIT 和 WM_DESTROY 上调用
DestroyWindow(hwndDlg);,单击对话框窗口的关闭按钮也不会导致它关闭。加上主窗口被阻塞的问题,我关闭一切的唯一方法是从任务栏或任务管理器关闭窗口。
消息循环:
while(GetMessage(&Msg, NULL, 0, 0) > 0) {
if (!IsDialogMessage(hwndDlg, &Msg)){
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
对话框窗口过程:
INT_PTR CALLBACK LogDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam){
switch (message){
case WM_INITDIALOG:{
hwndLogTxt = GetDlgItem(hwndDlg, IDDE_LOGTXT);
fileHandler fH;
if (!fH.init("report.log")){
SetDlgItemText(hwndLogTxt, IDDE_LOGTXT, "<Could not load log data>");
err(ERR_CUSTOM,"Failed to extract log file!","Extraction Error!");
}
else SetDlgItemText(hwndLogTxt, IDDE_LOGTXT, fH.getStr());
break;
}
case WM_DESTROY:{
DestroyWindow(hwndDlg);
break;
}
}
return true;
}
所以我最终想要的是一个包含(只读)编辑控件(占据对话框窗口的所有客户区域)的无模式对话框。 这个问题是关于我的资源语法还是关于我调用它的方式?我什至可能错过了 WM_INITDIALOG 上的必要步骤吗?
【问题讨论】:
-
您的代码行为不正确。因此,您已经发布了对话框模板定义。
-
是的,因为对话框模板几乎是我拥有的关于对话框的所有代码。它也可能是消息循环,但这应该是正确的,因为我确实喜欢msdn.microsoft.com/en-us/library/windows/desktop/… 的其他示例。现在将其添加到问题中。
-
不知道您的幻像编辑控件(显示您的代码)但您对
SetDlgItemText的调用是错误的 - 它需要 parent(对话框) 句柄,而不是控制句柄。 -
我在匆忙复制到这个问题时不小心更改了 SetDlgItemText() 参数,感谢您的提示。我现在添加了对话框窗口过程。
标签: c++ winapi dialog resources