【问题标题】:qt5.12 create dialog with winapiqt5.12用winapi创建对话框
【发布时间】:2021-06-06 22:20:51
【问题描述】:

我想在窗口上创建对话框,该对话框将显示在任务管理器之类的顶层(甚至是游戏窗口)上。我写了下一段代码:

    static const wchar_t* className = L"GraphDialog";
    WNDCLASSEX wx = {};
    wx.cbSize = sizeof(WNDCLASSEX);
    wx.hInstance = GetModuleHandle(NULL);
    wx.lpszClassName = className;
    if ( RegisterClassEx(&wx) )
    {
        HWND h = CreateWindowEx(WS_EX_TOPMOST, (LPCWSTR)className, NULL, WS_POPUP,
                                CW_USEDEFAULT, CW_USEDEFAULT,
                                CW_USEDEFAULT, CW_USEDEFAULT,
                                NULL, NULL, NULL, NULL);
        QWindow *qw = QWindow::fromWinId((WId)h);
        if (qw)
        {
            GraphDialog* dialog = qobject_cast<GraphDialog*>(createWindowContainer(qw));
            if (dialog)
            {
                dialog->init(...);
                dialog->exec();
            }
        }
    }

GraphDialog 是 QDialog。 不幸的是,当调用函数 CreateWindowEx 时,我有错误 SIGSEGV。

【问题讨论】:

标签: winapi qt5


【解决方案1】:

您注册的班级没有设置导致SIGSEGVlpfnWndProc成员。

【讨论】:

    【解决方案2】:

    您将NULL 传递给lpWindowName

    HWND h = CreateWindowEx(WS_EX_TOPMOST, (LPCWSTR)className, NULL /*<------ lpWindowName*/, WS_POPUP,
             CW_USEDEFAULT, CW_USEDEFAULT,
             CW_USEDEFAULT, CW_USEDEFAULT,
             NULL, NULL, NULL /* <---- hInstance */, NULL);
    

    我在the documentation 中没有看到任何迹象表明这是允许的。如果是这样,我还希望看到将NULL 传递给SetWindowText 的记录,但它明显不存在。

    也不清楚是否允许您将NULL 传递给hInstance 参数。

    lpWindowName 传递一些文本,并查看为hInstance 传递一个句柄。

    【讨论】:

      【解决方案3】:

      我尝试重写我的代码。

      LRESULT CALLBACK windProc(HWND , UINT , WPARAM , LPARAM )
      {
          return 1;
      }
      
      void FmGeneralInfo::showOnlyGraph()
      {
          hide();
          static const wchar_t* className = L"GraphDialog";
          WNDCLASSEX wx = {};
          wx.cbSize = sizeof(WNDCLASSEX);
          wx.hInstance = GetModuleHandle(NULL);
          wx.lpszClassName = className;
          wx.lpfnWndProc = (WNDPROC)windProc;
          if (RegisterClassEx(&wx))
          {
              HWND h = CreateWindowEx(WS_EX_TOPMOST, (LPCWSTR)className, L"", WS_POPUP,
                                      CW_USEDEFAULT, CW_USEDEFAULT,
                                      CW_USEDEFAULT, CW_USEDEFAULT,
                                      NULL, NULL, GetModuleHandle(NULL), NULL);
              if (h)
              {
                  QWindow *qw = QWindow::fromWinId((WId)h);
                  if (qw)
                  {
                      GraphDialog* dialog = qobject_cast<GraphDialog*>(createWindowContainer(qw));
                      if (dialog)
                      {
                          dialog->init(m_logic, m_stateHolder);
                          dialog->exec();
                      }
                  }
              }
          }
          int err = GetLastError();
      
          show();
          m_logic->formResize(width(), height());
      }
      

      但我在变量对话框中有 nullptr。

      【讨论】:

      • 你应该根据Designing a Window Procedure修改你的windProc
      • 我重写了我的 windProc,但它没有帮助。我无法从 QWindow(由 HWND 获得)转换为 GraphDialog(即 QDialog 的子类)LRESULT CALLBACK windProc(HWND _hwnd, UINT _uMsg, WPARAM _wParam, LPARAM _lParam) { return DefWindowProc(_hwnd, _uMsg, _wParam, _lParam); }
      • 也许你应该使用CreateDialog
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      相关资源
      最近更新 更多