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 上的弹出窗口 - 如何关闭它?

win32 MSG 值

Win32 - 无法使用 RedrawWindow() 触发 WM_PAINT 消息

Win32 WM_CTLCOLORSTATIC 背景未完全填充