我为(无模式)对话框编写了一个资源脚本,该脚本应包含一个编辑控件(用于显示非编辑日志报告):
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>");
,都将同时设置它们。DestroyWindow(hwndDlg);
WM_QUIT和WM_DESTROY ,单击对话框窗口的关闭按钮也不会导致它关闭。再加上主窗口被阻塞的问题,我关闭所有内容的唯一方法是从任务栏或任务管理器关闭窗口。消息循环:
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上缺少必要的步骤了吗?
一些评论:
a)我想您实际上LogDlgProc
在打给CreateDialog()
?你还有ShowWindow(hwndDlg, SW_SHOW);
追求CreateDialog()
吗?
b)您的EDITTEXT
控件在资源文件中以数字作为id声明,您的逻辑使用IDDE_TXT
-更改对话框资源以具有EDITTEXT IDDE_TXT...
c)更改代码以将您的编辑控件设置为SetDlgItemText(hwndDlg, IDDE_TXT, ...);
;确保fH.getStr()
返回正确的字符串值
d)fH
如有必要,请在读取后关闭(取决于fileHandler
实施方式)
e)返回FALSE
未处理的消息
f)WM_DESTROY
在您致电之前,您不会得到a DestroyWindow
,我认为处理IDCANCEL应该足够了
您的对话程序应该看起来像
INT_PTR CALLBACK LogDlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{ switch (message)
{ case WM_INITDIALOG:
{ fileHandler fH;
if (fH.init("report.log"))
{ SetDlgItemText(hwndDlg, IDDE_TXT, fH.getStr());
// close fH
}
else
{ SetDlgItemText(hwndDlg, IDDE_TXT, "<Could not load log data>");
err(ERR_CUSTOM,"Failed to extract log file!","Extraction Error!");
}
return TRUE;
}
case WM_COMMAND:
if (LOWORD(wParam) == IDCANCEL)
{ DestroyWindow(hwndDlg);
return TRUE;
}
//EDIT start
if (HIWORD(wParam) == EN_SETFOCUS && LOWORD(wParam) == IDDE_TXT)
{ SendDlgItemMessage(hwndDlg, IDDE_TXT, EM_SETSEL, -1, -1);
return TRUE;
}
//EDIT end
}
return FALSE;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句