Здравствуйте, 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 используется эпизодически как диалог настройки например? Не внесет ли это лишние "тормоза"? Как вариант ставить фильтр при открытии окна и снимать при закрытии, но тогда придется отслеживать все открытые окна, вводить счетчик. Это все конечно дело техники , т.к. Вам виднее.