win32 SetDlgItemText 在 WM_INITDIALOG 中不起作用
Posted
技术标签:
【中文标题】win32 SetDlgItemText 在 WM_INITDIALOG 中不起作用【英文标题】:win32 SetDlgItemText not working from within WM_INITDIALOG 【发布时间】:2018-11-04 07:30:32 【问题描述】:我刚开始尝试win32,但遇到了问题。
BOOL CALLBACK UnsavedChangesProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
HWND dHandle = GetActiveWindow();
switch (msg)
case WM_INITDIALOG:
MessageBox(NULL, "In InitDialog", 0, 0);
SetDlgItemText(dHandle, 1004, ("There are unsaved changes to \""));
char error[10];
sprintf_s(error, "%d", GetLastError());
MessageBox(NULL, error, 0, 0);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
case IDSAVE:
DoFileSave(hwnd);
EndDialog(hwnd, TRUE);
PostQuitMessage(0);
break;
case IDEXIT:
EndDialog(hwnd, TRUE);
PostQuitMessage(0);
break;
break;
case WM_CLOSE:
EndDialog(hwnd, FALSE);
break;
default:
return FALSE;
return TRUE;
GetLastError() 返回 1421,未找到控件 ID,但 ID (1004) 肯定对应于我要更改的静态控件。我还尝试使用控件名称(IDC_STATIC_UNSAVED)调用该函数,但没有成功。奇怪的是,如果我将函数调用移动到声明 dHandle 的位置(或摆脱 dHandle 并在函数内部调用 GetActiveWindow()),文本会更改,但它会闪烁,因为每次消息都会调用该函数循环迭代。
是否有一个简单的原因,我错过了这不应该工作? 任何帮助将不胜感激。
编辑:这是资源符号的图像:Resource Symbols 这是对话框模板的图像:Dialog Template 请注意,所有其他控件都按预期工作。
【问题讨论】:
我刚开始尝试 win32 -- 建议 -- Win32 API 已经足够复杂,不应该“尝试”,除非你想成为完全沮丧的是事情无法正常工作。从 Petzold 等书籍或类似材料中获取工作示例。 @Paul 就像任何一种计算技术一样,当然应该对它进行试验。 OP 的问题中没有任何内容表明他没有阅读文档;而是相反。 你为什么不直接使用HWND
传递给你的函数,而不是 GetActiveWindow()
?你的对话模板是什么样的?编辑您的问题以包含minimal reproducible example。
另外,请注意,在您从 WM_INITDIALOG
处理程序返回 TRUE
之前,不会设置焦点。
“我如何找到句柄?” 这是传递给您的处理程序的第一个参数。试试这个:SetDlgItemText(hwnd, 1004, "There are unsaved changes to \"");
【参考方案1】:
对话窗口在hwnd
参数中传递给您的处理程序。不需要调用GetActiveWindow()
- 事实上,当对话框不是活动窗口时,它会给你另一个窗口的HWND
。
所以,替换
HWND dHandle = GetActiveWindow();
SetDlgItemText(dHandle, 1004, ("There are unsaved changes to \""));
与
SetDlgItemText(hwnd, 1004, "There are unsaved changes to \"");
【讨论】:
【参考方案2】:我同意 Sid S.
除了将SetDlgItemText
的第一个参数从dHandle
更改为hwnd
,我还建议使用IDC_STATIC_UNSAVED
而不是硬编码值1004
。所以,SetDlgItemText()
调用变为:SetDlgItemText(hwnd, IDC_STATIC_UNSAVED, ("There are unsaved changes to \""));
【讨论】:
以上是关于win32 SetDlgItemText 在 WM_INITDIALOG 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
在 WM_CREATE 中加载多个位图的 C++ Win32 不会加载
在 WM_COMMAND win32 GUI C++ 中处理 WM_LBUTTONDOWN 和 WM_LBUTTONUP
WIN32 API 中 WM_MOUSEHOVER 上的弹出窗口 - 如何关闭它?