crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Qt setParent (WinAPI)
Гость_Andrey_*
сообщение 24.11.2010, 1:09
Сообщение #1





Гости








    


Есть такая проблема. Внедрил main form qt приложения в vcl mdi форму сишного приложения средствами Win API. Все отлично внедрилось, отрисовка работает, клавиатурные события обрабатываются, но мышь...
Вобщем qt форма продолжает использовать глобальные координаты вместо локальных. При этом весьма странное дело, какие то виджеты используют локальные координаты и ведут себя нормально, а какие глобальные и гонят...
Че токо не пробовал со стороны сишного приложения чтобы исправить дело (средствами winapi), но ниче не помогает.
Видимо придется менять в qt части (код доступен), вот только с чего начать не знаю.
Какие будут предложения коллеги :)

Забегая вперед скажу что пенести все в одну среду пока не вариант. Каждая составляющая 10000яч строк кода и написана разными людьми, так что пока нет возможности собрать все в кучу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 24.11.2010, 21:09
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(sadhu @ 24.11.2010, 17:18) *
MFC никого не смущает, потому что, с любыми winApi приложениями оно дружит ни разу не меньше.

ибо это практически одно и то же ;) Только с классами



Цитата(Гость_Andrey_* @ 24.11.2010, 22:08) *
использовался чистый winapi уже в созданное окно с известным хендлом. делалось по нажатию на кнопку например. И встроилось все корректно и события qt работали корректно, единственное была проблма только с мышью....

в отладчике можно глянуть, как путешествует координата. В оконной процедуре для сообщений WM_*BUTTON*
Цитата
(http://msdn.microsoft.com/en-us/library/ms645607(VS.85).aspx)
lParam
The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.


и ты дальше перекидывал координаты без изменений? Вот и будет косяк. Примени MapWindowPoints
http://msdn.microsoft.com/en-us/library/dd145046(VS.85).aspx
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Andrey_*
сообщение 24.11.2010, 23:41
Сообщение #3





Гости








    


Цитата(Алексей1153 @ 24.11.2010, 21:09) *
Цитата(sadhu @ 24.11.2010, 17:18) *
MFC никого не смущает, потому что, с любыми winApi приложениями оно дружит ни разу не меньше.

ибо это практически одно и то же ;) Только с классами



Цитата(Гость_Andrey_* @ 24.11.2010, 22:08) *
использовался чистый winapi уже в созданное окно с известным хендлом. делалось по нажатию на кнопку например. И встроилось все корректно и события qt работали корректно, единственное была проблма только с мышью....

в отладчике можно глянуть, как путешествует координата. В оконной процедуре для сообщений WM_*BUTTON*
Цитата
(http://msdn.microsoft.com/en-us/library/ms645607(VS.85).aspx)
lParam
The low-order word specifies the x-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.
The high-order word specifies the y-coordinate of the cursor. The coordinate is relative to the upper-left corner of the client area.


и ты дальше перекидывал координаты без изменений? Вот и будет косяк. Примени MapWindowPoints
http://msdn.microsoft.com/en-us/library/dd145046(VS.85).aspx


да я их вообще не перекидывал :) все равно как только мышь над qt то mfc больше события эти не получит(если только хук не поставить). это нормально так и должно быть (нормальная виндовая схема). пусть qt живет своей жизнью, со своими событиями и сообщениями (как я буду взаимодействовать с qt на уровне данных это уже другой вопрос). Мне надо чтобы у qt формы было parent HWND не desktop а мое окно. Понятно что это визуальная фикция (тк потенциально qt и mfc могут быть даже в разных процессах, в лучшем случае в разных нитях). но мне именно это и нужно.

Видимо тут играет не последнюю роль кроссплатформенность... HWND используется тк по другому в виндах нельзя и главная форма или виджет будет лежать на подложке из HWND которую qt создает только из за "других вариантов нет", события из этого HWND транслируются qt и все бы ничего, но qt application знает что я не плагин а application поэтому создавая верхнее HWND всегда берет за основу координатную систему рабочего стола. если сделать winapi setparent реальный родитель меняется, но qt не отслеживает это, продолжая использовать координатную сетку рабочего стола (пересчет координат надо полагать не winapi опять кроссплатформеность). вот эту проблему решает qwinwidget.... после установки setparent средствами winapi он принудительно заставляет сменить координатную сетку на реального нового родителя, после чего мышь работает корректно.

Кто знает суть данного события
QEvent e(QEvent::EmbeddingControl);
QApplication::sendEvent(this, &e);

не могу найти толкового описания, как будет описание смогу точно сказать правда ли все вышенаписанное
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.12.2024, 0:47