Что нового

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

sterro_sasha

Новичок
Сообщения
28
Репутация
0
Доброго времени! Есть пример, при котором окно можно перетянуть за любую точку. Но как сделать так, чтобы это относилось не только к окну, но и к контроллу, например 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

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

Код:
#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 036
Репутация
504
$GUI_WS_EX_PARENTDRAG 0x00100000 Применив этот стиль к элементам Label или Pic позволяет перетаскивать окно за этот элемент как за заголовок окна.
$WS_EX_CONTROLPARENT 0x10000 Разрешает перетаскивание окна за клиентскую область
если перетаскивать за кнопку, то тут нужно писать свой код
 
Автор
S

sterro_sasha

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

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

joiner

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