我想在窗口上创建对话框,将显示在顶层(甚至游戏窗口),如任务管理器。我写了下一段代码:
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。
发布于 2021-06-07 09:45:57
您注册的类尚未设置导致SIGSEGV的成员。
发布于 2021-06-07 06:44:44
您正在传递lpWindowName的NULL
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的文档,但明显没有。
也不清楚是否允许在hInstance参数中传入NULL。
传入一些用于lpWindowName的文本,看看如何传入用于hInstance的句柄。
发布于 2021-06-15 04:57:12
我试着重写我的代码。
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。
https://stackoverflow.com/questions/67864143
复制相似问题