1С77 если открыто несколько окон и внизу (на панели окон) навести курсором на любое, то должна появиться всплывающая подсказка, но ее нет. WINE@Etersoft 1.0.11 eter8/eter3
у меня подозрение, что они эту подсказку тоже в отдельном окне сделали, а если так, то она может не всплывать по причине неактивности главного окна, завтра проверю в офисе
похоже, что причина какая-то другая. надо посмотреть на функции 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 Принято.