Summary: | 1С77: Нет всплыввающих подсказок над свернутыми окнами | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Денис Баранов <baraka> |
Component: | Окна / фокус / перерисовка | Assignee: | Иван Дончевский <yv> |
Status: | CLOSED FIXED | QA Contact: | Денис Баранов <baraka> |
Severity: | minor | ||
Priority: | P4 | CC: | gorbuntsov, lav, shpigor |
Version: | unspecified | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | All | ||
Whiteboard: | |||
Заявки RT: | 11048 | Связано с: | |
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 3932 | ||
Attachments: | Похожая ошибка |
Description
Денис Баранов
2009-08-17 15:24:01 MSD
у меня подозрение, что они эту подсказку тоже в отдельном окне сделали, а если так, то она может не всплывать по причине неактивности главного окна, завтра проверю в офисе похоже, что причина какая-то другая. надо посмотреть на функции tab.c в данном случае не вызывается даже функция GetCursorPos для определения позиции курсора (выводить/не выводить подсказку), т.е. такое ощущение, как будто не обрабатывается событие WM_MOUSEMOVE, хотя с ним похоже все в порядке. пока ситуация мне непонятна. нужно попробовать ловить события, приходящие верхним иконкам при выводе подсказок (видимо есть что-то еще кроме mousemove) Проверил - сообщения приходят в обоих случаях одинаковые... разница в том, что у табов свой обработчик событий, в отличие от всех других элементов, использующих его из DefWnd.c GetCursorPos для определения места отрисовки подсказки вызывается уже после того, как программа определяет в каком окне находится курсор (при смещении координаты в X11DRV_send_mouse_input нужная иконка выделяется при смещенном наведении курсора, а подсказка не выводится, т.к. она уже вызывает GetCursorPos, который дает ей реальное положение курсора), нужно найти какой функцией она определяет наличие курсора внутри нужного окна, видимо в ней и происходит ошибка если в X11DRV_MotionNotify в вызове X11DRV_send_mouse_input изменить например параметр pt.y на (pt.y-50), то все нажатия и т.п. будут обрабатываться правильно, а вот выделение верхних иконок будет происходить при наведении курсора ниже самих иконок (при этом также будет вызываться GetCursorPos), видимо программа то ли берет аргументы из параметров WM_MOUSEMOVE, то ли еще откуда-то возможен другой вариант - подсказки выводит сам windows, а не программа 1с77, нужно проверить этот вариант и если это так, самому написать такое же для tab.c Created attachment 1299 [details]
Похожая ошибка
Тоже проблемы с выводом подсказок: в windows отображаются нормально, а под вайном рисуется не тот текст и выводится подсказка не в том месте.
посмотрел еще раз обработку WM_MOUSEMOVE в tab.c, оказалось, она перенаправляет нас в tooltips.c в функцию TOOLTIPS_RelayEvent, причем параметр был не WM_MOUSEMOVE, а какой-то другой (я его исправил, но багу это не разрешило). Далее в этой функции в tooltips вызывается TOOLTIPS_GetToolFromPoint, который уже возвращает неверное значение для табов. в функции TOOLTIPS_GetToolFromPoint берется значение nNumTools из infoPtr. В случае с табами оно почему-то равно 0, из-за этого возвращаемое значение всегда равно -1 и всплывающие окна никогда не рисуются судя по всему в tab.c в функции create при создании tooltip'а не посылаются некоторые сообщения (в отличие от табов, в тулбарах для этого отдельные несколько функций TOOLBAR_TooltipCreateControl, TOOLBAR_TooltipAddTool, TOOLBAR_TooltipSetRect), возможно нужно прописать что-то похожее для табов что выяснил - подсказки на самом деле tooltips, но создаются они и вызываются не обработчиками tab'a или toolbar'а (что странно) обработчики tab'a вызываются только в случае данного бага, возможно из-за каких-то специфических свойств этих табов. судя по тому, что показывает spy, подсказки принадлежат не отдельным табам и другим контролам, а основному окну программы (под вайном). Но обрабатываются они видимо как-то вайном, а не самим 1с-ом, т.к. в противном случае абсолютно непонятна причина бага, да и потом до вайна доходят сообщения mousemove и т.п. я почитал немного по tooltips - в том, что читал, выводом их на экран занимается сама программа, когда к ней приходит сообщение TTN_NEEDTEXT. Правда в вайне я вообще мало что нашел, связанного с этим сообщением. что нового: у табов в этой программе окно подсказок другое, не то, что у других контролов. Вызов подсказки происходит, когда она получает вначале сообщение AddToolA, а потом уже событие RelayEvent приводит к выбору нужного окна, для которого выводится подсказка. В случае с табами события AddToolA нет, поэтому подсказка думает, что у нее нет окон, для которых она должна вызываться. Для других контролов AddToolA приходит при попадании мышки на нужный контрол. как вариант пробую посылать сам AddToolA, нужно только подобрать нужные параметры и посылать его только при определенных условиях. Думаю, таким образом получится исправить. Точнее надеюсь. реализовал подсказки, сейчас проверю всегда ли правильно работают, но в 1с работают так же, как подсказки верхних кнопок отправил патч, хотя вообще тут еще есть над чем подумать дальше... Например, почему элемент iHotTracked остается всегда -1 (хотя должен принимать значение вкладки, на которую наведен курсор) WINE@Etersoft eter8.3/eter4 Принято. |