Здравствуйте, apin, Вы писали:
A>Подскажите пожалуйста, как встроить htmlayout в QWidget. A>В простейшем случае, я думаю, должно работать так:
A>
A>Layout::Layout(QWidget *parent, Qt::WFlags flags)
A> : QWidget(parent, flags)
A> //, htmlayout::event_handler(HANDLE_ALL)
A>{
A> setAutoFillBackground(false);
A> setMouseTracking(true);
A> BOOL bOk=::HTMLayoutLoadFile(winId(), L"e:\\htmlayout\\html_samples\\menu\\menu-bar.htm");
A> Q_ASSERT(bOk);
A>}
A>bool Layout::winEvent( MSG * message, long * result )
A>{
A> BOOL bHandled = FALSE;
A> LRESULT lr=HTMLayoutProcND(winId(),message->message,message->wParam,message->lParam, &bHandled);
A> if (bHandled) return lr;
A> return QWidget::winEvent(message,result);
A>}
A>
A>но bOk всегда FALSE.
A>Если кто уже сталкивался помогите пожалуйста, очень нужно.
1) Проверь что HTMLayoutProcND получает события WM_CREATE и WM_DESTROY — именно по ним
создается и уничтожается instance.
2) Все обращения к engine типа HTMLayoutLoadFile должны делаться после получеия WM_CREATE —
т.е. после того как instance of the engine создан для этого окна.
Здравствуйте, c-smile, Вы писали:
CS>1) Проверь что HTMLayoutProcND получает события WM_CREATE и WM_DESTROY — именно по ним CS>создается и уничтожается instance. CS>2) Все обращения к engine типа HTMLayoutLoadFile должны делаться после получеия WM_CREATE — CS>т.е. после того как instance of the engine создан для этого окна.
Спасибо, простого способа перехватить WM_CREATE нет, но вот такой вариант работает:
Здравствуйте, apin, Вы писали:
A>Здравствуйте, c-smile, Вы писали:
CS>>1) Проверь что HTMLayoutProcND получает события WM_CREATE и WM_DESTROY — именно по ним CS>>создается и уничтожается instance. CS>>2) Все обращения к engine типа HTMLayoutLoadFile должны делаться после получеия WM_CREATE — CS>>т.е. после того как instance of the engine создан для этого окна.
A>Спасибо, простого способа перехватить WM_CREATE нет, но вот такой вариант работает:
A>
A> BOOL bHandled;
A> HTMLayoutProcND(winId(),WM_CREATE,0,0, &bHandled);
A> Q_ASSERT(bHandled);
A> BOOL bOk=::HTMLayoutLoadFile(winId(), L"d:\\htmlayout\\html_samples\\menu\\menu-bar.htm");
A>
Ну или так. Только не забывай про WM_DESTROY, а то получишь утечку памяти.
Здравствуйте, apin, Вы писали:
A>Спасибо, простого способа перехватить WM_CREATE нет, но вот такой вариант работает:
A>
A> BOOL bHandled;
A> HTMLayoutProcND(winId(),WM_CREATE,0,0, &bHandled);
A> Q_ASSERT(bHandled);
A> BOOL bOk=::HTMLayoutLoadFile(winId(), L"d:\\htmlayout\\html_samples\\menu\\menu-bar.htm");
A>
B кстати если тебе popup нужны (menu-bar.htm) то не забудь про
HTMLayoutTranslateMessage() тоже.
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, apin, Вы писали:
A>>Спасибо, простого способа перехватить WM_CREATE нет, но вот такой вариант работает:
A>>
Здравствуйте, c-smile, Вы писали:
CS>B кстати если тебе popup нужны (menu-bar.htm) то не забудь про CS>HTMLayoutTranslateMessage() тоже.
Возникла еще одна проблема, которой не было со старой версией htmlayout (какой не могу сказать, но не менее года). Суть в следующем:
если компонент <select> открывать кнопкой, а не кликом в поле, то в выпадающем списке ничего нельзя выбрать.
Причем в browse.exe, это не проявляется, а вот во всех остальных демках (mfc и win32) проявляется. Проверить можно, например, в html_samples\forms\basiccontrols.htm.
A>// Main message loop:
A> while (GetMessage(&msg, NULL, 0, 0))
A> {
A> if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
A> {
A> if(!HTMLayoutTranslateMessage(&msg))
A> TranslateMessage(&msg);
A> DispatchMessage(&msg);
A> }
A> }
A>
A>это код из проекта win32. Что в нем не корректно?
Вот так оно будет правильно:
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
if(!HTMLayoutTranslateMessage(&msg))
TranslateMessage(&msg);
}
DispatchMessage(&msg);
}
A>bool Layout::winEvent( MSG * message, long * result )
A>{
A> HTMLayoutTranslateMessage(message);
A> BOOL bHandled = FALSE;
A> LRESULT lr=HTMLayoutProcND(winId(),message->message,message->wParam,message->lParam, &bHandled);
A> if (bHandled) return lr;
A> return QWidget::winEvent(message,result);
A>}
A>
Похоже, проблема в том, что QT транслирует событие раньше HTMLayout. У меня оно в Java в SWT почему-то так же себя ведёт, сегодня попробую отладить.
Здравствуйте, Cyberax, Вы писали:
C>Похоже, проблема в том, что QT транслирует событие раньше HTMLayout. У меня оно в Java в SWT почему-то так же себя ведёт, сегодня попробую отладить.
в QT вообще TranslateMessage не вызывается, из форума trolltech:
TranslateMessage translates keystrokes to hotkey commands. There is no
need for such a function in Qt. Use QAccel, or handle the QKeyEvent in
your own event handler.
Здравствуйте, apin, Вы писали:
A>Здравствуйте, Cyberax, Вы писали:
C>>Похоже, проблема в том, что QT транслирует событие раньше HTMLayout. У меня оно в Java в SWT почему-то так же себя ведёт, сегодня попробую отладить.
A>в QT вообще TranslateMessage не вызывается, из форума trolltech:
A>TranslateMessage translates keystrokes to hotkey commands. There is no A>need for such a function in Qt. Use QAccel, or handle the QKeyEvent in A>your own event handler.
Вот эти два метода:
class QCoreApplication
{
...
EventFilter setEventFilter ( EventFilter filter )
virtual bool winEventFilter ( MSG * msg, long * result )
...
}
представляются близкими к теме куда вставить HTMLayoutTranslateMessage.
CS>представляются близкими к теме куда вставить HTMLayoutTranslateMessage.
CS>По смыслу winEventFilter это оно.
CS>Если не получится то придется ставить hook. Посмотри вот этот топик: CS>http://rsdn.ru/forum/htmlayout/3536222.flat.aspx#3536222
CS>>представляются близкими к теме куда вставить HTMLayoutTranslateMessage.
CS>>По смыслу winEventFilter это оно.
CS>>Если не получится то придется ставить hook. Посмотри вот этот топик: CS>>http://rsdn.ru/forum/htmlayout/3536222.flat.aspx#3536222
если возвращать return HTMLayoutTranslateMessage((MSG*)message);
как написано в комментах, к HTMLayoutTranslateMessage
* if( !HTMLayoutTranslateMessage(&msg) )
* TranslateMessage(&msg);
то не работает.
вопрос к c-smile — Вы считаете разумным прогонять все события довольно большого приложения, через HTMLayoutTranslateMessage, даже если htmlayout используется эпизодически как диалог настройки например? Не внесет ли это лишние "тормоза"? Как вариант ставить фильтр при открытии окна и снимать при закрытии, но тогда придется отслеживать все открытые окна, вводить счетчик. Это все конечно дело техники , т.к. Вам виднее.
CS>>Вот в этот filterEvent(&msg) или что-то от него вызываемое и надо вставить мой вызов.
A>Уфф. Все оказалось не так очевидно, как кажется: A>в main()
A>
A> QApplication a(argc, argv);
A> QAbstractEventDispatcher::instance()->setEventFilter(myEventFilter);
A>
A>
A>bool myEventFilter(void *message)
A>{
A> HTMLayoutTranslateMessage((MSG*)message);
A> return false;
A>}
A>
A> если возвращать return HTMLayoutTranslateMessage((MSG*)message); A>как написано в комментах, к HTMLayoutTranslateMessage A>* if( !HTMLayoutTranslateMessage(&msg) ) A>* TranslateMessage(&msg); A>то не работает.
Круто. Круче (в смысле замороченней) чем в MFC (которая к слову тоже multiplatform framework).
A>вопрос к c-smile — Вы считаете разумным прогонять все события довольно большого приложения, через HTMLayoutTranslateMessage, даже если htmlayout используется эпизодически как диалог настройки например? Не внесет ли это лишние "тормоза"? Как вариант ставить фильтр при открытии окна и снимать при закрытии, но тогда придется отслеживать все открытые окна, вводить счетчик. Это все конечно дело техники , т.к. Вам виднее.
Что такое "довольно большого приложения"?
В любом случае количество окон в приложении как бы не увеличивает количество сообщений которые
постятся в input queue. Например при проносе мыши над окном ты получишь примерно одинаковое количество WM_MOUSEMOVE в случае отсутствия children или их наличия в количестве 10штук. Если я правильно понял вопрос.
При отсутствии popup или tool окон HTMLayoutTranslateMessage ничего не делает и так.
Здравствуйте, c-smile, Вы писали:
CS>Что такое "довольно большого приложения"? CS>В любом случае количество окон в приложении как бы не увеличивает количество сообщений которые CS>постятся в input queue. Например при проносе мыши над окном ты получишь примерно одинаковое количество WM_MOUSEMOVE в случае отсутствия children или их наличия в количестве 10штук. Если я правильно понял вопрос. CS>При отсутствии popup или tool окон HTMLayoutTranslateMessage ничего не делает и так.
У меня довольно много анимации, т.е WM_PAINT посылается часто. Я наверное буду, вставлять обработчик только если открыт htmlayout, так как то спокойнее .
Спасибо за помощь.
P.S. Вы все же поосторожнее, когда меняете поведение. У меня в behavior:grid перестали столбцы мышкой растягиваться.