Что нового

Нажатие через GUIRegisterMsg по всей плоскости Label, в дочернем окне.

saraconor

Новичок
Сообщения
404
Репутация
3
Код:
#AutoIt3Wrapper_Res_File_Add=1.gif, rt_rcdata, G2
#include "resources.au3"
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include "GIFAnimation.au3"
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <WinAPI.au3>

$hGui = GUICreate("GIF Animation", 411, 144, -1, -1)

$hGIF = _GUICtrlCreateGIF(@ScriptDir & "\1.gif", "", 10, 10, 273, 38)
If @Compiled Then $hGIF = _GUICtrlCreateGIF(@ScriptFullPath, "10;G2", 61, 10)

$B1 = GUICtrlCreateButton('STOP', 12, 71, 131, 41)
$B2 = GUICtrlCreateButton('START', 151, 71, 131, 41)

Local $hChild = GUICreate('', 273, 38, 10, 10, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGui)
GUISetBkColor(0x787877, $hChild)

$VS = GUICtrlCreateLabel("TEST TEST TEST", 0, 0, 273, 38, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetColor(-1, 0x787878)
GUICtrlSetFont(-1, 16, 800, 0)
_WinAPI_SetLayeredWindowAttributes($hChild, 0x787877, 255)
GUIRegisterMsg($WM_SETCURSOR, 'WM_SETCURSOR')

GUISetState(@SW_SHOW, $hChild)
GUISetState(@SW_SHOW, $hGui)

While 1
$msg = GUIGetMsg()
    Switch $msg
        Case -3
            exit
        case $B1
        _GIF_PauseAnimation($hGIF)
        case $B2
        _GIF_ResumeAnimation($hGIF)
    EndSwitch
wend

Func WM_SETCURSOR($hWnd, $Msg, $wParam, $lParam)
Switch _WinAPI_HiWord($lParam)
Case 514
Switch _WinAPI_GetDlgCtrlID($wParam)

    Case 6
    ToolTip("нажато")
    sleep(500)
    ToolTip("")

EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc

Регистрация нажатия в этом случае происходит только тогда, когда нажато прямо в букву слова, а как сделать чтобы нажатие было по всей плоскости Label, которая растянута по размеру кнопки?
 

Вложения

  • окно+дочернее.zip
    141.9 КБ · Просмотры: 7

InnI

AutoIT Гуру
Сообщения
4,911
Репутация
1,427
Думаю, WM_SETCURSOR здесь не поможет, т.к. прозрачная область "пропускает" не только цвета, но и клики. Пробуйте так
Код:
While 1
  Switch GUIGetMsg()
    Case -3
      exit
    Case $B1
      _GIF_PauseAnimation($hGIF)
    Case $B2
      _GIF_ResumeAnimation($hGIF)
  EndSwitch
  ; ---------------------------------
  $info = GUIGetCursorInfo($hChild)
  If $info[2] And $info[4] = $VS Then
    ToolTip("нажато")
    Sleep(500)
    ToolTip("")
  EndIf
  ; ---------------------------------
WEnd
 
Автор
S

saraconor

Новичок
Сообщения
404
Репутация
3
Я вот думаю, это ведь может сработать елси сделать фон label не полностью прозрачным...
Ну да видимо уже не важно, ваш пример как всегда -то что нужно.
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,911
Репутация
1,427
Кстати, можно ещё проще
Код:
While 1
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $B1
      _GIF_PauseAnimation($hGIF)
    Case $B2
      _GIF_ResumeAnimation($hGIF)
    Case $VS, $hGIF
      ToolTip("нажато")
      Sleep(500)
      ToolTip("")
  EndSwitch
WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
можно так
Код:
Global $dw
;.....................................................
; проверка, что нажатие и отпуск кнопки произошел именно над нужным элементом
Func WM_SETCURSOR($hWnd, $Msg, $wParam, $lParam)
    Switch _WinAPI_HiWord($lParam)
        Case 513
            If (GUIGetCursorInfo($hChild)[4]) = $VS Then $dw = 1                                   
        Case 514
            If $dw Then
                If (GUIGetCursorInfo($hChild)[4]) = $VS Then ConsoleWrite('клик по строке' & @LF)
            EndIf
            $dw = 0
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SETCURSOR


этот вариант подходит и для GuiGetMsg и для GuiOnEventMod
 
Последнее редактирование:
Верх