Что нового

Перемещение окна за любую точку, учитывая и контролл

sterro_sasha

Новичок
Сообщения
44
Репутация
1
Доброго времени! Есть пример, при котором окно можно перетянуть за любую точку. Но как сделать так, чтобы это относилось не только к окну, но и к контроллу, например label?

Пока выход нашел такой - при наведении мышки на контролл, проверяю не зажата ли кнопка при помощи _IsPressed, далее определяю координаты и перемещаю окно в след за мышкой... Примерно как-то так. Все работает, но решение все равно не самое лучшее, хотелось бы именно как-то.. как вроде хука или как это называется.

Может есть у кого какие-то идеи? Хотя бы мысли..

Если кому-то интересно, вот приведены способы перемещения окна:

https://www.autoitscript.com/wiki/Moving_and_Resizing_PopUp_GUIs

OffTopic:
Ссылки странно вставляются.


Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <MenuConstants.au3>
#include <ColorConstantS.au3>
#include <GUIConstantsEx.au3>



Global $bMouseJumpToCaption = False

$hGUI = GUICreate("DRAG GUI", 240, 180, -1, -1)
$iLabel = GUICtrlCreateLabel('Но как учитывать и контролл?', 0, 0, 200, 40)
GUISetBkColor($COLOR_RED, $hGUI)
GUICtrlSetBkColor($iLabel,$COLOR_WHITE)
GUICtrlSetFont($iLabel, 12, Default, Default, 'Tahoma')
GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN")

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
	If BitAND(WinGetState($hWnd), 32) Then
		Return $GUI_RUNDEFMSG
	EndIf

	;DllCall("user32.dll", "int", "ReleaseCapture")
	;DllCall("user32.dll", "int", "SendMessage", "hWnd", $hWnd, "int", 0xA1, "int", 2, "int", 0)

	DllCall("user32.dll", "long", "SendMessage", "hwnd", $hWnd, "int", $WM_SYSCOMMAND, "int", ($bMouseJumpToCaption ? $SC_MOVE : 0xF009), "int", 0)
EndFunc   ;==>WM_LBUTTONDOWN
 
Автор
S

sterro_sasha

Новичок
Сообщения
44
Репутация
1
Вот простой пример еще - но не могу понять, как... почему на кнопку не действует?

Код:
#include <GuiconstantsEx.au3>
#include <WindowsConstants.au3>
#include <SendMessage.au3>
#include <Misc.au3>
 Global Const $SC_DRAGMOVE = 0xF012
 $hGUI = GUICreate('Перемещение окна за любую точку', 200, 200)
 GUISetBkColor(0x00FF50, $hGUI)
 $hButton = GUICtrlCreateButton("Test", 10, 35, 80, 30)
 GUISetState()
 While 1
		;вот тут почему-то не работает это условие.
		;если мышка зажата - перемещаем окно неважно где оно и над чем мышка..
		 if _IsPressed('01') Then
			 ConsoleWrite('левая кнопка мыши зажата' & @CRLF)
             _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
		 EndIf

       Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop

        EndSwitch
 WEnd
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
$GUI_WS_EX_PARENTDRAG 0x00100000 Применив этот стиль к элементам Label или Pic позволяет перетаскивать окно за этот элемент как за заголовок окна.
$WS_EX_CONTROLPARENT 0x10000 Разрешает перетаскивание окна за клиентскую область
если перетаскивать за кнопку, то тут нужно писать свой код
 
Автор
S

sterro_sasha

Новичок
Сообщения
44
Репутация
1
joiner сказал(а):
если перетаскивать за кнопку, то тут нужно писать свой код


Я проверил. Да, все работает. Но.. скрипт блокирует свою работу на это время. И вот тут я так понимаю, что все.. упирается в тот способ который я указал в самом начале - сложный и кропотливый. Верно?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
это точно. чтобы перемещать за любой элемент, нужно выяснить, есть ли во время нажатия кнопки элемент под курсором. для этого есть GUIGetCursorInfo. Далее в цикле можно следить за тем, зажата ли левая кнопка мыши, если да, то рассчитывать координаты и перемещать окно. либо функцией WM_LBUTTONDOWN выкидывать флаг, что кнопка нажата, но опять же, придется считать координаты
при этом, лучше включать режим Opt("GUIOnEventMode", 1) , чтобы программа не откликалась на клик. потому, что при отпуске левой кнопки мыши произойдет регистрация действия GUIGetMsg() , а значит реакция окна или выполнение функции, потом включаем режим реакции окна на клик. если GUIOnEventMode включен по умолчанию, то тут опять все можно регулировать флагами.
ну...во всяком случае так я вижу это в своем бренном теле :smile:
 
Верх