【问题标题】:Win32 - Retrieving control of DialogBox using GetDlgItem failsWin32 - 使用 GetDlgItem 检索 DialogBox 的控制失败
【发布时间】:2010-12-24 15:59:52
【问题描述】:

在我的主窗口中,单击菜单项后,会出现一个对话框,要求用户输入。然后将检索该输入。

这里是对话框的资源文件:

//
// Dialog resources
//
IDD_PID DIALOG 0, 0, 158, 84
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP
FONT 8, "MS Sans Serif"
{
    PUSHBUTTON  "&Ok", ID_PID_RET, 14, 60, 58, 14
    PUSHBUTTON  "&Cancel", ID_PID_CANCEL, 86, 60, 52, 14
    CTEXT       "Enter the PID of the process", -1, 32, 16, 91, 15, SS_CENTER
    CONTROL     "", ID_PID_INPUT, RICHEDIT_CLASS, WS_TABSTOP | WS_BORDER | ES_AUTOHSCROLL, 47, 33, 59, 14, WS_EX_CLIENTEDGE
}

这是使用对话框的 WindowProc:

//
// Message handling for main window
//
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case ID_FILE_PID:
            int choice = DialogBox(thishInstance, MAKEINTRESOURCE(IDD_PID), hWnd, AboutDlgProc);
            if (choice == ID_PID_RET)
            {
                HWND temp = GetDlgItem(hWnd, ID_PID_INPUT);
                HRESULT HR = GetLastError();
                SendMessage(temp, WM_GETTEXT, sizeof(buff), (LPARAM)&buff);

                [...]
            }
            break;
        }
    }
}

如果我在资源文件中创建窗口,当我尝试获取HWND 时,我有点不确定它是如何工作的。这应该以某种方式起作用,对吗? hWnd是管理对话框,ID_PID_RET是用户输入的富编辑框的控件ID,所以不知道GetDlgItem为什么会失败。它返回“找不到控制 ID”,但它是在我的 resource.h 中定义的。有什么想法吗?

【问题讨论】:

  • nit:标准是使用“OK”而不是“Ok”,好吗?
  • Nit 2:因为 OK 和 Cancel 已经有加速键(Enter 和 Escape),所以不应将 O 和 C 设置为加速键。

标签: c++ winapi dialog


【解决方案1】:

DialogBox 仅在 EndDialog 被调用并且对话框被销毁后返回。调用 GetDlgItem 时对话框不再存在。在调用 EndDialog 之前,您可以使用 DialogBoxParam 并为对话框传入缓冲区/结构/类以填充 Rich Edit 字段的内容。

【讨论】:

  • 我明白了,所以 EndDialog 破坏了窗口及其控件。那么我想一个好方法是在调用 EndDialog 之前将一个指针传递给一个 char 缓冲区,该缓冲区填充了 Rich Edit 框中的文本?
  • 完全正确,或者是一个包含多个字段的结构,用于更复杂的对话框。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 1970-01-01
相关资源
最近更新 更多