[Qt-interest] native HWND in QWidget::create opens separate window

Christopher Lux christopherlux at gmail.com
Wed Sep 8 16:57:19 CEST 2010


Hi,
i found out that i have to set the parent of the native window myself
to the parent->winId() to get this working correctly.

Now i am unable to get double click events from this new widget. All
other mouse events come in as expected. Is there anything to be done
special here?

Regards
-chris

On Wed, Sep 8, 2010 at 2:27 PM, Christopher Lux
<christopherlux at gmail.com> wrote:
> Hi,
> i need to use a native window for some special rendering task (on
> Windows and Linux). Now on Windows, after i create the Window i call
> QWidget::create() using the just created HWND. It seems to work very
> well, i can receive events from this window in Qt and so on. But
> instead of being embedded instead of the original widget i now have a
> second window open.
>
> I want the created window to replace the widget and not open up as a
> new window. Is there anything i can do to achieve this?
>
> Here the code snippet to open the window:
>
> wnd_style    = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
> wnd_style_ex = 0;
>
> math::vec2i wnd_position = in_display->_impl->_info->_screen_origin +
> in_position;
> RECT        wnd_rect;
>
> ::SetRect(&wnd_rect, 0, 0, in_size.x, in_size.y);
>
> if (0 == ::AdjustWindowRectEx(&wnd_rect, wnd_style, false, wnd_style_ex)) {
>    ...
> }
>
> _window_handle = ::CreateWindowEx(wnd_style_ex,
> reinterpret_cast<LPCSTR>(in_display->_impl->_window_class),
>                                  in_title.c_str(),
>                                  wnd_style,
>                                  wnd_position.x, wnd_position.y,
>                                  wnd_rect.right - wnd_rect.left,
> wnd_rect.bottom - wnd_rect.top,
>                                  0, 0, in_display->_impl->_hinstance,
>                                  0);
>
> Now here is the initialization code of the custom Widget:
>
>
> viewer_widget::viewer_widget(QWidget* parent, // parent is not 0!
>                             const wm::context::attribute_desc&   ctx_attrib,
>                             const wm::surface::format_desc&      win_fmt)
>  : QWidget(parent, Qt::MSWindowsOwnDC)
> {
>    setMouseTracking(true);
>    setFocusPolicy(Qt::StrongFocus);
>
>    setAttribute(Qt::WA_NativeWindow, true);
>    setAttribute(Qt::WA_PaintOnScreen, true); // disables qt double
> buffering (seems X11 only since qt4.5, ...)
>    //setAttribute(Qt::WA_OpaquePaintEvent, true);
>    setAttribute(Qt::WA_NoSystemBackground, true);
>    //setAttribute(Qt::WA_ForceUpdatesDisabled, true);
>    //setAttribute(Qt::WA_PaintUnclipped, true);
>    setAutoFillBackground(false);
>
>    ... after creating the window....
>
>    this->create(_window_handle, true, true);
> }
>
> Now the window works as expected but comes up as a separate window
> instead of replacing the widgets window.
>
> Regards
> -chris
>




More information about the Qt-interest-old mailing list