Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для K.A.V.

Ленивый кусок мяса


Contributor


Сообщения: 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
Красоту и качество кода не гарантирую, уж простите, давно этим не занимался

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:34, 06-02-2021 | #2567