首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qt5.12使用winapi创建对话框

qt5.12使用winapi创建对话框
EN

Stack Overflow用户
提问于 2021-06-07 06:20:52
回答 3查看 67关注 0票数 0

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

代码语言:javascript
复制
    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。

EN

回答 3

Stack Overflow用户

发布于 2021-06-07 09:45:57

您注册的类尚未设置导致SIGSEGV的成员。

票数 3
EN

Stack Overflow用户

发布于 2021-06-07 06:44:44

您正在传递lpWindowNameNULL

代码语言:javascript
复制
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的句柄。

票数 2
EN

Stack Overflow用户

发布于 2021-06-15 04:57:12

我试着重写我的代码。

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67864143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档