Что нового

Окна, Диалоги Как создавать вспомогательное окно с картинкой при наведении мыши на элемент

smsgeorge

Новичок
Сообщения
63
Репутация
0
Здравствуйте! Подскажите пожалуйста, как реализовать, появление окна с картинкой (как будто чисто картинка появляется) при наведении на элемент (программа понимает уже на какой элемент навожу мышку). При перемещении мышки, окно с картинкой тоже должно перемещаться. Как только увожу мышку с элемента, окно пропадает. Много чего попробовал, но не получается красиво реализовать. Пробовал метод Yashied. Pop-ups Но не понял, как перемещать окно если сдвигать мышку.
Функция проверки на какой элемент наведена мышка вызывается AdlibRegister('Proverka_navedenie_kartinki', 30)
Всё работает в режиме GUIOnEventMode
Снимок.JPG
Сообщение автоматически объединено:

Поясню, навожу мышкой на картинку и должна появится ее оригинальных размеров копия (увеличенная версия). Она должна появиться рядом с мышкой, если я перемещаю мышку в приделах картинки(элемента), она тоже двигается, как только увожу мышку с элемента, картинка пропадает
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
создаем окно popup с элементом pic. окно скрыто
в текущем цикле опрашиваем положение курсора через
Код:
GUIGetCursorInfo()

как только в данных функции появляется id нужного элемента, в скрытое окно вставляем нужную картинку, перемещаем его относительно нашего курсора и задаем видимое состояние. при движении курсора по элементу движется и окно с картинкой, так как координаты получаем автоматически из функции GUIGetCursorInfo, для перемещения используем WinMove
Все как обычно)
 
Автор
S

smsgeorge

Новичок
Сообщения
63
Репутация
0
создаем окно popup с элементом pic. окно скрыто
в текущем цикле опрашиваем положение курсора через
Код:
GUIGetCursorInfo()

как только в данных функции появляется id нужного элемента, в скрытое окно вставляем нужную картинку, перемещаем его относительно нашего курсора и задаем видимое состояние. при движении курсора по элементу движется и окно с картинкой, так как координаты получаем автоматически из функции GUIGetCursorInfo, для перемещения используем WinMove
Все как обычно)
Благодарю! В выходной день попробую, Как сделать, чтобы окно создавалось один раз? А не каждый раз, пока мышка на элементе? Но перемещалась всегда. То есть вот я его в функции(цикле) при наведении на элемент логически "покажу" , он же будет каждый раз применять команду "показать окно"
Сообщение автоматически объединено:

создаем окно popup с элементом pic. окно скрыто
в текущем цикле опрашиваем положение курсора через
Код:
GUIGetCursorInfo()

как только в данных функции появляется id нужного элемента, в скрытое окно вставляем нужную картинку, перемещаем его относительно нашего курсора и задаем видимое состояние. при движении курсора по элементу движется и окно с картинкой, так как координаты получаем автоматически из функции GUIGetCursorInfo, для перемещения используем WinMove
Все как обычно)
Не получается.
Код:
Func Proverka_navedenie_kartinki()
   global $schetschet
   if $Schet_kartinok_dobavleniya[$Vibrann_zakaz_kartinok]<>0 then

    for $k=1 to $Schet_kartinok_dobavleniya[$Vibrann_zakaz_kartinok]
    ;=========================================================ERROR
    $qInfo = GUIGetCursorInfo($Okno_vtoroe[$k])
    If not @error then
    Endif
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ; If not @error Then;=========================================================ERROR
        Switch $qInfo[4]

            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
            case  $Okno_label[$k]
                _GDIPlus_Startup ()
                
                $hhImage = _GDIPlus_ImageLoadFromFile($Path_kartinok&"\"&$Vibrann_zakaz_kartinok&"_"&$k& ".bmp")
                Global $shirina_kartinki=_GDIPlus_ImageGetWidth($hhImage)
                Global $visota_kartinki=_GDIPlus_ImageGetHeight($hhImage)

                $schetschet=$schetschet+1

                ConsoleWrite(@CR&$shirina_kartinki&"    hh     "&$visota_kartinki&"    hh     "& $qInfo[4]&"    hh  "&$Vibrann_zakaz_kartinok&"  hh   "&$k)
                $pologenie_mishki_kartinki=_WinAPI_GetCursorInfo()

                WinMove($Okno_prosmotr_kartinkami,"",$pologenie_mishki_kartinki[3],$pologenie_mishki_kartinki[4],$shirina_kartinki,$visota_kartinki)
                GUISetStyle ( $WS_POPUP, $WS_EX_TOPMOST, $Okno_prosmotr_kartinkami )
                GUICtrlSetPos ( $Kartinka_prosmotr_kartini, 0 , 0, $shirina_kartinki,$visota_kartinki )
                GUICtrlSetImage ( $Kartinka_prosmotr_kartini, $Path_kartinok&"\"&$Vibrann_zakaz_kartinok&"_"&$k& ".bmp" )
                GUISetState(@SW_SHOW,$Okno_prosmotr_kartinkami)

case else
 ; GUISetState(@SW_HIDE,$Okno_prosmotr_kartinkami)
 _GDIPlus_ShutDown ()

        EndSwitch
     next
     
Endif

EndFunc
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
приведу пример.
скопируй в папку со скриптом шесть картинок и переименуй их в : 3, 4, 5, 6, 7, 8
формат - .jpg
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
Opt('GUIOnEventMode', 1)
_GDIPlus_Startup()
Global $tmpID, $XWP, $YHP, $tmpXC, $tmpYC
Global $WD = @DesktopWidth / 2, $HD = @DesktopHeight / 2
Global $Form1 = GUICreate('Form1', 300, 150, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')
Global $Label1 = GUICtrlCreateLabel('Label3', 32, 40, 36, 17)
Global $Label2 = GUICtrlCreateLabel('Label4', 32, 88, 36, 17)
Global $Label3 = GUICtrlCreateLabel('Label5', 120, 40, 36, 17)
Global $Label4 = GUICtrlCreateLabel('Label6', 120, 88, 36, 17)
Global $Label5 = GUICtrlCreateLabel('Label7', 200, 40, 36, 17)
Global $Label6 = GUICtrlCreateLabel('Label8', 200, 88, 36, 17)
Global $Form2 = GUICreate('', 150, 150, 0, 0, BitOR($WS_BORDER, $WS_POPUP, $DS_SETFOREGROUND), BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST), $Form1)
Global $Pic = GUICtrlCreatePic('', 0, 0, 150, 150)
GUISetState(@SW_HIDE, $Form2)
GUISetState(@SW_SHOW, $Form1)

While Sleep(10)
    _SetPic()
WEnd

Func _Exit()
    Exit
EndFunc   ;==>_Exit

Func _WinMove($WX, $WY)
    Local $CHPM = MouseGetPos()
    If Not @error Then
        Local $XC = $CHPM[0], $YC = $CHPM[1]
        If $XC > $WD Then
            $XC = $XC - $WX - 5
        Else
            $XC = $XC + 5
        EndIf
        If $YC > $HD Then
            $YC = $YC - $WY - 5
        Else
            $YC = $YC + 5
        EndIf
        If $tmpXC <> $XC Or $tmpYC <> $YC Then
            WinMove($Form2, '', $XC, $YC, $WX, $WY)
            $tmpXC = $XC
            $tmpYC = $YC
            GUICtrlSetPos($Pic, 0, 0, $WX, $WY)
        EndIf
    EndIf
EndFunc   ;==>_WinMove

Func _SetPic()
    Local $CursorInfo = GUIGetCursorInfo($Form1)
    If @error Then Return GUISetState(@SW_HIDE, $Form2)
    If $CursorInfo[4] = $tmpID Then Return _WinMove($XWP, $YHP)
    If $CursorInfo[4] > 0 Then
        $tmpID = $CursorInfo[4]
        If FileExists($tmpID & '.jpg') Then
            Local $hI = _GDIPlus_ImageLoadFromFile($tmpID & '.jpg')
            $XWP = _GDIPlus_ImageGetWidth($hI)
            $YHP = _GDIPlus_ImageGetHeight($hI)
            _GDIPlus_BitmapDispose($hI)
            _WinMove($XWP, $YHP)
            GUICtrlSetImage($Pic, $tmpID & '.jpg')
            GUISetState(@SW_SHOW, $Form2)
        Else
            GUISetState(@SW_HIDE, $Form2)
        EndIf
    Else
        $tmpID = 0
        GUISetState(@SW_HIDE, $Form2)
    EndIf
EndFunc   ;==>_SetPic
 
Последнее редактирование:
Автор
S

smsgeorge

Новичок
Сообщения
63
Репутация
0
приведу пример.
скопируй в папку со скриптом шесть картинок и переименуй их в : 3, 4, 5, 6, 7, 8
формат - .jpg
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
Opt('GUIOnEventMode', 1)
_GDIPlus_Startup()
Global $tmpID, $XWP, $YHP, $tmpXC, $tmpYC
Global $WD = @DesktopWidth / 2, $HD = @DesktopHeight / 2
Global $Form1 = GUICreate('Form1', 300, 150, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')
Global $Label1 = GUICtrlCreateLabel('Label3', 32, 40, 36, 17)
Global $Label2 = GUICtrlCreateLabel('Label4', 32, 88, 36, 17)
Global $Label3 = GUICtrlCreateLabel('Label5', 120, 40, 36, 17)
Global $Label4 = GUICtrlCreateLabel('Label6', 120, 88, 36, 17)
Global $Label5 = GUICtrlCreateLabel('Label7', 200, 40, 36, 17)
Global $Label6 = GUICtrlCreateLabel('Label8', 200, 88, 36, 17)
Global $Form2 = GUICreate('', 150, 150, 0, 0, BitOR($WS_BORDER, $WS_POPUP, $DS_SETFOREGROUND), BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST), $Form1)
Global $Pic = GUICtrlCreatePic('', 0, 0, 150, 150)
GUISetState(@SW_HIDE, $Form2)
GUISetState(@SW_SHOW, $Form1)

While Sleep(10)
    _SetPic()
WEnd

Func _Exit()
    Exit
EndFunc   ;==>_Exit

Func _WinMove($WX, $WY)
    Local $CHPM = MouseGetPos()
    If Not @error Then
        Local $XC = $CHPM[0], $YC = $CHPM[1]
        If $XC > $WD Then
            $XC = $XC - $WX - 5
        Else
            $XC = $XC + 5
        EndIf
        If $YC > $HD Then
            $YC = $YC - $WY - 5
        Else
            $YC = $YC + 5
        EndIf
        If $tmpXC <> $XC Or $tmpYC <> $YC Then
            WinMove($Form2, '', $XC, $YC, $WX, $WY)
            $tmpXC = $XC
            $tmpYC = $YC
            GUICtrlSetPos($Pic, 0, 0, $WX, $WY)
        EndIf
    EndIf
EndFunc   ;==>_WinMove

Func _SetPic()
    Local $CursorInfo = GUIGetCursorInfo($Form1)
    If @error Then Return GUISetState(@SW_HIDE, $Form2)
    If $CursorInfo[4] = $tmpID Then Return _WinMove($XWP, $YHP)
    If $CursorInfo[4] > 0 Then
        $tmpID = $CursorInfo[4]
        If FileExists($tmpID & '.jpg') Then
            Local $hI = _GDIPlus_ImageLoadFromFile($tmpID & '.jpg')
            $XWP = _GDIPlus_ImageGetWidth($hI)
            $YHP = _GDIPlus_ImageGetHeight($hI)
            _GDIPlus_BitmapDispose($hI)
            _WinMove($XWP, $YHP)
            GUICtrlSetImage($Pic, $tmpID & '.jpg')
            GUISetState(@SW_SHOW, $Form2)
        Else
            GUISetState(@SW_HIDE, $Form2)
        EndIf
    Else
        $tmpID = 0
        GUISetState(@SW_HIDE, $Form2)
    EndIf
EndFunc   ;==>_SetPic
Попробовал сделать. Не совсем всё понял. Буду еще трудиться. Позже покажу код.
 
Верх