win32 SetDlgItemText 在 WM_INITDIALOG 中不工作
win32 SetDlgItemText not working from within WM_INITDIALOG
我刚开始尝试使用 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() returns1421,未找到控件 ID,但 ID (1004) 确实对应于我要更改的静态控件。我也尝试过使用控件名称 (IDC_STATIC_UNSAVED) 调用该函数,但没有成功。奇怪的是,如果我将函数调用移动到声明 dHandle 的位置(或者摆脱 dHandle 并只在函数内部调用 GetActiveWindow() ),文本会更改但会闪烁,因为每次消息都会调用该函数循环迭代。
是否有一个简单的原因导致我遗漏了这行不通的原因?
任何帮助将不胜感激。
编辑:这是资源符号的图像:Resource Symbols
这是对话框模板的图片:Dialog Template
请注意,所有其他控件都按预期工作。
对话框 window 在 hwnd
参数中传递给您的处理程序。无需调用 GetActiveWindow()
- 事实上,当对话框未处于活动状态 window.
时,它会给你另一个 window 的 HWND
所以,替换
HWND dHandle = GetActiveWindow();
SetDlgItemText(dHandle, 1004, ("There are unsaved changes to \""));
和
SetDlgItemText(hwnd, 1004, "There are unsaved changes to \"");
我同意 Sid S。
除了将 SetDlgItemText
的第一个参数从 dHandle
更改为 hwnd
,我还建议使用 IDC_STATIC_UNSAVED
而不是硬编码值 1004
。因此,SetDlgItemText()
调用变为:
SetDlgItemText(hwnd, IDC_STATIC_UNSAVED, ("There are unsaved changes to \""));
我刚开始尝试使用 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() returns1421,未找到控件 ID,但 ID (1004) 确实对应于我要更改的静态控件。我也尝试过使用控件名称 (IDC_STATIC_UNSAVED) 调用该函数,但没有成功。奇怪的是,如果我将函数调用移动到声明 dHandle 的位置(或者摆脱 dHandle 并只在函数内部调用 GetActiveWindow() ),文本会更改但会闪烁,因为每次消息都会调用该函数循环迭代。
是否有一个简单的原因导致我遗漏了这行不通的原因? 任何帮助将不胜感激。
编辑:这是资源符号的图像:Resource Symbols 这是对话框模板的图片:Dialog Template 请注意,所有其他控件都按预期工作。
对话框 window 在 hwnd
参数中传递给您的处理程序。无需调用 GetActiveWindow()
- 事实上,当对话框未处于活动状态 window.
HWND
所以,替换
HWND dHandle = GetActiveWindow();
SetDlgItemText(dHandle, 1004, ("There are unsaved changes to \""));
和
SetDlgItemText(hwnd, 1004, "There are unsaved changes to \"");
我同意 Sid S。
除了将 SetDlgItemText
的第一个参数从 dHandle
更改为 hwnd
,我还建议使用 IDC_STATIC_UNSAVED
而不是硬编码值 1004
。因此,SetDlgItemText()
调用变为:
SetDlgItemText(hwnd, IDC_STATIC_UNSAVED, ("There are unsaved changes to \""));