Ленивый кусок мяса
Сообщения: 1986
Благодарности: 723
|
Профиль
|
Сайт
|
Отправить PM
| Цитировать
Цитата MKN:
На кастомной странице есть созданное новое окно или область ListBox + разные элементы (чекбоксы, кнопки...).
Необходимо, при наведении указателя мыши или курсора на какой либо элемент(например на чекбокс) послать в это окно или ListBox(отобразить в нём) некую информацию (из переменной) на время "наведения" (если указатель перемещён с элемента, инфа исчезает).
Нечто по аналогии с выводом ToolTips, только не во всплывающем окне, а в имеющемся. »
|
Вообще, там надо вроде как всё ловить в OnNotify функции для конкретного элемента (nsDialogs), но, честно признаться, давно уже "не в теме" и отловить там у меня не получилось
Могу предложить вариант с помощью создания функции с таймером, в которй будем определять положение курсора и решать, что делать дальше, в зависимости от того, над каким элементом сейчас находится курсор
Цитата MKN:
ps Попутно вопрос - в ToolTip плагинах (ToolTips.dll или nsTips от kotkovets ) всплывающее сообщение через некоторое время закрывается-исчезает. Можно ли этого избежать ? (Т.е., пока курсор или указатель мыши находятся на элементе, сообщение "удерживается" на месте.) »
|
Насчет плагинов не скажу, но можно напрямую в NSIS запихнуть (один фиг ты будешь курсор отслеживать на элементах )
о, готовый код
Код:
!include "nsDialogs.nsh"
!include "MUI2.nsh"
!include "LogicLib.nsh"
!include "WinMessages.nsh"
Name nsDialogs
OutFile nsDialogs.exe
RequestExecutionLevel user
ShowInstDetails show
Var Dialog
Var hwnd_Text # хэндл текстового поля
var hwnd_Button # хэндл кнопки, над которой отслеживаем курсор
var onMouseOverFuncAddr # адрес функции, которая будет выполняться при отслеживании курсора
var ttip
Page custom pgPageCreate pgPageLeave
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
##########################################
# ToolTip
##########################################
!define WS_POPUP 0x80000000
!define TTF_SUBCLASS 0x010
!define /math TTM_ACTIVATE ${WM_USER} + 1
!define /math TTM_ADDTOOL ${WM_USER} + 4
!define /math TTM_SETTOOLINFO ${WM_USER} + 9
!define /math TTM_TRACKACTIVATE ${WM_USER} + 17
Function ShowToolTip
StrCpy $2 $ttip
System::Call 'USER32::IsWindowVisible(ir2)i.r0'
${If} $0 == 0
pop $1
StrCpy $2 ""
${If} $ttip = 0
System::Call 'USER32::CreateWindowEx(i${WS_EX_TOPMOST},t"tooltips_class32",i,i${WS_POPUP},i,i,i,i,i0,i,i,i)i.r2'
StrCpy $ttip $2
${EndIf}
FindWindow $3 "#32770" "" $HWNDPARENT
System::Call '*(i40,i${TTF_SUBCLASS},i$3,i0x408,i,i,i,i,i0,tr1)i.r1'
SendMessage $ttip ${TTM_ADDTOOL} 0 $1
SendMessage $ttip ${TTM_SETTOOLINFO} 0 $1
SendMessage $ttip ${TTM_ACTIVATE} 1 0
SendMessage $ttip ${TTM_TRACKACTIVATE} 1 $1
System::Free $1
${EndIf}
FunctionEnd
##########################################
# ToolTip
##########################################
Function my_onMouseOver # функция с выполнением по таймеру, здесь можно отслеживать курсор на всех элекемнтах диалога
; получаем координаты курсора
System::Alloc 16
Pop $0
System::Call USER32::GetCursorPos(ir0)
System::Call *$0(i.r1,i.r2)
System::Free $0
System::Call USER32::WindowFromPoint(ir1,ir2)i.r1
; в переменной $1 теперь хэндл элемента, над которым курсор
${If} $1 = $hwnd_Button
${NSD_SetText} $hwnd_Text "Курсор над кнопкой"
push "мой текст в tooltip"
call ShowToolTip
${Else}
${NSD_SetText} $hwnd_Text "Курсор вне кнопки"
SendMessage $ttip ${TTM_ACTIVATE} 0 0
${EndIf}
FunctionEnd
Function .onInit
GetFunctionAddress $onMouseOverFuncAddr my_onMouseOver ; получаем адрес функции, которая будет выполняться по таймеру для отслеживания курсора
FunctionEnd
Function pgPageCreate
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateText} 30% 10u 40% 15u "..."
Pop $hwnd_Text
${NSD_CreateButton} 30% 50u 40% 12u "Кнопочка"
Pop $hwnd_Button
nsDialogs::CreateTimer $onMouseOverFuncAddr 100 ; создаём таймер для отслеживания курсора
nsDialogs::Show
FunctionEnd
Function pgPageLeave
FunctionEnd
Section
SectionEnd
ps
Красоту и качество кода не гарантирую, уж простите, давно этим не занимался
|