c – win32 SetDlgItemText无法在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()返回1421,找不到控件ID,但ID(1004)肯定对应于我试图改变的静态控件.我也尝试使用控件名称(IDC_STATIC_UNSAVED)调用该函数,但没有运气.奇怪的是,如果我将函数调用移动到声明dHandle的地方(或者除去dHandle并在函数内部调用GetActiveWindow())文本被更改但是它会闪烁,因为每次消息都会调用该函数循环迭代.

是否有一个简单的原因,这不应该工作,我错过了?
任何帮助将不胜感激.

编辑:这是资源符号的图像:Resource Symbols
      这是对话框模板的图像:Dialog Template
 请注意,所有其他控件都按预期工作.

解决方法:

对话框窗口将在hwnd参数中传递给您的处理程序.没有必要调用GetActiveWindow() – 事实上,当对话框不是活动窗口时,它将为您提供另一个窗口的HWND.

所以,替换

HWND dHandle = GetActiveWindow();
SetDlgItemText(dHandle, 1004, ("There are unsaved changes to \""));

SetDlgItemText(hwnd, 1004, "There are unsaved changes to \"");
上一篇:html5新增语义化标签


下一篇:如何在Java中管理复杂的流控制?