qt5.12用winapi创建对话框
Posted
技术标签:
【中文标题】qt5.12用winapi创建对话框【英文标题】:qt5.12 create dialog with 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。
【问题讨论】:
What if two programs did this? 【参考方案1】:您注册的班级没有设置导致SIGSEGV的lpfnWndProc成员。
【讨论】:
【参考方案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
。以上是关于qt5.12用winapi创建对话框的主要内容,如果未能解决你的问题,请参考以下文章