[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