Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Problem GUI + $WS_POPUP + $WS_SIZEBOX


Rekomendowane odpowiedzi

Opublikowano

witam to chyba moj pierwszy post wiec sie przywitam. jestem alkoholikiem nie pije 4 lata... sorry skrypterem :P

próbuje narysować gui z wycietym srodkiem albo jakąkolwiek ramke. moze ktos ma sprawdzony sposob na to ?? moge sie podzielic z wami dotychczasowymi metodami ale ciagle mnie nie satysfakcionuja. mam 3 gotowe kody dwa ja napisalem a jeden znalazlem i przerobilem.

w kazdym jest cos nie tak.

Wymagania to: 1. pełen resizing i mozliwosc przenoszenia myszka.

                         2. mozliwosc pomalowania calej ramki na jeden kolor ($WS_POPUP) ??            + pkt.1 :P

                         
zaznaczam ze do odpalenia skryptow wymagana sa pewne include i ze metoda clickdrag odpada chyba ze podacie fajna opcje zeby podczas tego dragu ikony, okna i rozne pierdoly pod kursorem nie zostaly klikniete i gdzies przeniesione

#include <GUIConstants.au3>

	HotKeySet("{q}", "_quit")
	HotKeySet("{a}", "_boxplus")
	HotKeySet("{z}", "_boxminus")

$GUI = GUICreate("Clicker", 500, 400,0, 0, -1)
MsgBox(1,"info", " Press Q to Quit" & @LF & " Press A to size up"& @LF & " Press Z to size down")
$BoxTop = GUICreate('',2,2,0,0,$WS_POPUP,$WS_EX_TOPMOST);WHLT
GUISetBkColor(0x00ff00);Green
$BoxRight = GUICreate('',2,2,2,0,$WS_POPUP,$WS_EX_TOPMOST,$BoxTop)
GUISetBkColor(0x00ff00)
$BoxBottom = GUICreate('',2,2,2,2,$WS_POPUP,$WS_EX_TOPMOST,$BoxTop);WHLT
GUISetBkColor(0x00ff00)
$BoxLeft = GUICreate('',2,2,0,2,$WS_POPUP,$WS_EX_TOPMOST,$BoxTop);WHLT
GUISetBkColor(0x00ff00)

$box_range = 50

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
	EndSwitch
		$pos = MouseGetPos()
		GUISetState (@SW_SHOW,$BoxTop)
		GUISetState (@SW_SHOW,$BoxLeft)
		GUISetState (@SW_SHOW,$BoxBottom)
		GUISetState (@SW_SHOW,$BoxRight)
		WinMove($BoxTop,'',		MouseGetPos(0)-$box_range,MouseGetPos(1)-$box_range,$box_range*2,3)
		WinMove($BoxBottom,'',	MouseGetPos(0)-$box_range,MouseGetPos(1)+$box_range,$box_range*2,3)
		WinMove($BoxLeft,'',	MouseGetPos(0)+$box_range,MouseGetPos(1)-$box_range,3,$box_range*2)
		WinMove($BoxRight,'',	MouseGetPos(0)-$box_range,MouseGetPos(1)-$box_range,3,$box_range*2)
WEnd

Func _boxminus()
		$box_range = $box_range - 10
EndFunc

Func _boxplus()
		$box_range = $box_range + 10
EndFunc

Func _quit()
		Exit
	EndFunc



#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

 HotKeySet("q", "_Quit")
 HotKeySet("w", "_CutGui")

Global $GUI = GUICreate("Empty Window", 200, 200,500,100,$WS_SIZEBOX)
$cut_gui = GUICtrlCreateButton("Cut Inside Gui", 50, 100, 100)
GUISetState(@SW_SHOW)

Local $iMsg
While 1
	$iMsg = GUIGetMsg()
	Select
		Case $iMsg = $GUI_EVENT_CLOSE
			ExitLoop
		Case $iMsg = $cut_gui
			_CutGui()
	EndSelect
WEnd

Func _CutGui()
	Local $aPos = WinGetPos($GUI)
	$gui_full = _WinAPI_CreateRectRgn(0, 0, $aPos[2], $aPos[3])
	$gui_part = _WinAPI_CreateRectRgn(8, 30, $aPos[2]-8, $aPos[3]-8)
	$gui_RGN = _WinAPI_CreateRectRgn(0, 0, 0, 0)
	_WinAPI_CombineRgn($gui_RGN, $gui_full, $gui_part, $RGN_DIFF)
	_WinAPI_SetWindowRgn($GUI, $gui_RGN)
EndFunc   ;==>_GuiHole

 Func _Quit()
     Exit
 EndFunc
#include <GuiConstantsEx.au3>
#include <Windowsconstants.au3>
#include <SendMessage.au3>
#include <WinAPI.au3>
#include <GDIPlus.au3>


 Global Const $SC_DRAGMOVE = 0xF012

 HotKeySet("{ESC}", "_Quit")

 ; Set distance from edge of window where resizing is possible
 Global Const $iMargin = 10

 $hGUI = GUICreate("Y", 100, 100, -1, -1, $WS_POPUP,$WS_SIZEBOX)
 GUISetBkColor(0x00FF00)
 GUISetState()

 ; Register message handlers
 GUIRegisterMsg($WM_MOUSEMOVE, "_SetCursor")            ; For cursor type change
 GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN")     ; For resize/drag

 While 1

	 _GDIPlus_Startup()
	$aPos = WinGetPos($hGUI)
	$hPath = _GDIPlus_PathCreate() ;tworzenie ścieżki
	_GDIPlus_PathAddRectangle($hPath, 0, 0, $aPos[2], $aPos[3])
	$hReg = _GDIPlus_RegionCreateFromPath($hPath)
	$hReg2 = _GDIPlus_RegionCreateFromRect(20, 20, $aPos[2]-40, $aPos[3]-40)
	_GDIPlus_RegionCombineRegion($hReg, $hReg2, 3) ;łączenie regionów typu XOR
	$hRGN = _GDIPlus_RegionGetHRgn($hReg)
	_WinAPI_SetWindowRgn($hGUI, $hRGN)

	;zwolnienie zasobów
	_WinAPI_DeleteObject($hRGN)
	_GDIPlus_RegionDispose($hReg)
	_GDIPlus_RegionDispose($hReg2)
	_GDIPlus_PathDispose($hPath)
	_GDIPlus_Shutdown()

	Sleep(10)
 WEnd

 ; Set cursor to correct resizing form if mouse is over a border
 Func _SetCursor()
     Local $iCursorID
     Switch _Check_Border()
         Case 0
             $iCursorID = 2
         Case 1, 2
             $iCursorID = 13
         Case 3, 6
             $iCursorID = 11
         Case 5, 7
             $iCursorID = 10
         Case 4, 8
             $iCursorID = 12
     EndSwitch
     GUISetCursor($iCursorID, 1)
 EndFunc ;==>SetCursor

 ; Check cursor type and resize/drag window as required
 Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
     Local $iCursorType = _Check_Border()
     If $iCursorType > 0 Then ; Cursor is set to resizing style so send appropriate resize message
         $iResizeType = 0xF000 + $iCursorType
         _SendMessage($hGUI, $WM_SYSCOMMAND, $iResizeType, 0)
     Else
         Local $aCurInfo = GUIGetCursorInfo($hGUI)
         If $aCurInfo[4] = 0 Then ; Mouse not over a control
             _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
         EndIf
     EndIf
 EndFunc ;==>WM_LBUTTONDOWN

 ; Determines if mouse cursor over a border
 Func _Check_Border()
     Local $aCurInfo = GUIGetCursorInfo()
     If @ Then Return -1
     Local $aWinPos = WinGetPos($hGUI)
     Local $iSide = 0
     Local $iTopBot = 0
     If $aCurInfo[0] < $iMargin Then $iSide = 1
     If $aCurInfo[0] > $aWinPos[2] - $iMargin Then $iSide = 2
     If $aCurInfo[1] < $iMargin Then $iTopBot = 3
     If $aCurInfo[1] > $aWinPos[3] - $iMargin Then $iTopBot = 6
     Return $iSide + $iTopBot
 EndFunc ;==>_Check_Border



 Func _Quit()
     Exit
 EndFunc

dziekuje za uwage i chyba zostane na dluzej :P

Opublikowano

Zobacz coś takiego, z wykorzystaniem popełnionego przeze mnie UDF'a <_GUIMoveResizePopup.au3>.

Oto kod skryptu demonstracyjnego (UWAGA: nie działa na XP):

 #include <_GUIMoveResizePopup.au3>
 #include <WINAPI.au3>

Const $col_T = 0xABCDEF
Const $col_F = 0x0000FF

$hPen = _WinAPI_CreatePen($PS_SOLID, 5, $col_F)

$hGUI = _GUIMoveResizePopupCreate($MRP_MOVE_RESIZE, "", Default, 100, 0, 0, Default, $WS_EX_LAYERED)
$hDC = _WinAPI_GetWindowDC($hGUI)
_WinAPI_SetLayeredWindowAttributes($hGUI, $col_T, 255)
GUISetBkColor($col_T, $hGUI)
$obj = _WinAPI_SelectObject($hDC, $hPen)

GUISetState()

Do
   Rectangle()
   Sleep(5)
Until False



Func Rectangle()
   $h = _WinAPI_GetWindowHeight($hGUI)
   $w = _WinAPI_GetWindowWidth($hGUI)
   _WinAPI_DrawLine($hDC, 3, 3, $w-3, 3)
   _WinAPI_DrawLine($hDC, $w-3, 3, $w-3, $h-3)
   _WinAPI_DrawLine($hDC, 3, 3, 3, $h-3)
   _WinAPI_DrawLine($hDC,$w-3, $h-3, 3,$h-3)
EndFunc

A tudej wzmiankowany UDF:

#include-once

 #include <GuiConstantsEx.au3>
 #include <Windowsconstants.au3>

 Global $MRP_NONE        = 0
 Global $MRP_MOVE        = 1
 Global $MRP_RESIZE      = 2
 Global $MRP_MOVE_RESIZE = 3
;---------------------------------------------
;wasta(2016)
;---------------------------------------------
;_GUIMoveResizePopupCreate ( [ $iFlag=1 [, $sTitle="" [, $iH=100 [, $iV=100 [, $iX=Default [, $iY=Default [, $iStyle=$WS_POPUPWINDOW [, $iExStyle=Default ]]]]]]]] )
;---------------------------------------------
;$iFlag = $MRP_NONE        - none
;SiFlag = $MRP_MOVE        - move (Default)
;$iFlag = $MRP_RESIZE      - resize
;$iFlag = $MRP_MOVE_RESIZE - move & resize
;---------------------------------------------
;$sTitle - GUI title
;---------------------------------------------

Func _GUIMoveResizePopupCreate($iFlag=Default, $sTitle="", $iH=Default, $iV=Default, $iX=Default, $iY=Default, $iStyle=$WS_POPUPWINDOW, $iExStyle=Default)
   If $iStyle=Default Then $iStyle=$WS_POPUPWINDOW
   Switch $iFlag
	  Case $MRP_MOVE, Default
		GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN_0")
	  Case $MRP_RESIZE
		GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN_1")
		GUIRegisterMsg($WM_MOUSEMOVE, "SetCursor")
	  Case $MRP_MOVE_RESIZE
		GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN_2")
		GUIRegisterMsg($WM_MOUSEMOVE, "SetCursor")
   EndSwitch
   Return GUICreate($sTitle, $iH, $iV, $iX, $iY, $iStyle, $iExStyle)
EndFunc

#Region Funkcje pomocnicze
Func WM_LBUTTONDOWN_0($hGUI, $iMsg, $wParam, $lParam)
   Local $aCurInfo = GUIGetCursorInfo($hGUI)
   If $aCurInfo[4] = 0 Then
      DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                   		$WM_SYSCOMMAND, "wparam", 0xF012, "lparam", 0)
   EndIf
EndFunc

Func WM_LBUTTONDOWN_1($hGUI, $iMsg, $wParam, $lParam)
	Local $iCursorType = SetCursor($hGUI)
    If $iCursorType > 0 Then
        $iResizeType = 0xF000 + $iCursorType
	DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                   			$WM_SYSCOMMAND, "wparam", $iResizeType, "lparam", 0)
    EndIf
EndFunc

Func WM_LBUTTONDOWN_2($hGUI, $iMsg, $wParam, $lParam)
    Local $iCursorType = SetCursor($hGUI)
    If $iCursorType > 0 Then
       $iResizeType = 0xF000 + $iCursorType
       DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                 		$WM_SYSCOMMAND, "wparam", $iResizeType, "lparam", 0)
    Else
       Local $aCurInfo = GUIGetCursorInfo($hGUI)
       If $aCurInfo[4] = 0 Then
          DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
					$WM_SYSCOMMAND, "wparam", 0xF012, "lparam", 0)
       EndIf
    EndIf
EndFunc

Func SetCursor($hGUI)
	 Local $c = GUIGetCursorInfo(), $w = WinGetPos($hGUI), $m=5
	 Local $IsBorder = ($c[0]<$m) + ($c[0]>$w[2]-$m)*2 + ($c[1]<$m)*3 + ($c[1]>$w[3]-$m)*6
     Switch $IsBorder
         Case 0
             GUISetCursor(2, 1)
         Case 1, 2
             GUISetCursor(13, 1)
         Case 3, 6
             GUISetCursor(11, 1)
         Case 5, 7
             GUISetCursor(10, 1)
         Case 4, 8
             GUISetCursor(12, 1)
	 EndSwitch
	 Return $IsBorder
EndFunc
#EndRegion Funkcje pomocnicze
Opublikowano
no to 3 blady masz w include. bo kod sam skrypt raczej zatonie odpowiada
1. nastąpiło to po odpaleniu kodu i jakies chwili bezczynnosci
"C:\Program Files (x86)\AutoIt3\Include\_GUIMoveResizePopup.au3" (73) : ==> Subscript used on non-accessible variable.:
Local $IsBorder = ($c[0]<$m) + ($c[0]>$w[2]-$m)*2 + ($c[1]<$m)*3 + ($c[1]>$w[3]-$m)*6
Local $IsBorder = ($c^ ERROR
2. stalo sie to podczas zywklego rozciagania tego boxa
 
29z4j74.png
 
3. przy zmianie 2 parametru 5 na 20 $hPen = _WinAPI_CreatePen($PS_SOLID, 5, $col_F) ciezko jest rozciagnac boxa mimo to ze ikonka kursora do rosciagania sie pokazala to nie reaguje.

prosil bym o delikatny fix albo kolejne propozycje i oflagowanie tematu jako nie rozwiazany. 
a juz myslalem ze po problemie ehh
Opublikowano

UDF w zasadzie nie był przeznaczony do tych celów, więc nie był zoptymalizowany pod kątem wyświetlania ramek. Przerobiłem nieco kod, przesunąłem co się dało do UDF'a.

Poprawiłem to co ci przeszkadzało. Teraz chyba będzie dobrze.

Skrypt:

 #include <_GUIMoveResizePopup.au3>
 #include <WINAPI.au3>

Const $iCol_F = 0x0000FF

$hPen = _WinAPI_CreatePen($PS_INSIDEFRAME, 30, $iCol_F)  ;tworzenie pióra
$aGUI_DC = _GUIMoveResizeRectangleCreate($hPen, $MRP_MOVE_RESIZE) ;tworzenie ramki

GUISetState()

Do
   _Rectangle($aGUI_DC) ;funkcja wyświetlająca, przesuwająca i zmieniająca rozmiary ramki
Until False

UDF:

#include-once

 #include <GuiConstantsEx.au3>
 #include <Windowsconstants.au3>

 Global $MRP_NONE        = 0
 Global $MRP_MOVE        = 1
 Global $MRP_RESIZE      = 2
 Global $MRP_MOVE_RESIZE = 3
;---------------------------------------------
;wasta(2016)
;---------------------------------------------
;_GUIMoveResizePopupCreate ( [ $iFlag=1 [, $sTitle="" [, $iH=100 [, $iV=100 [, $iX=Default [, $iY=Default [, $iStyle=$WS_POPUPWINDOW [, $iExStyle=Default ]]]]]]]] )
;---------------------------------------------
;$iFlag = $MRP_NONE        - none
;SiFlag = $MRP_MOVE        - move (Default)
;$iFlag = $MRP_RESIZE      - resize
;$iFlag = $MRP_MOVE_RESIZE - move & resize
;---------------------------------------------
;$sTitle - GUI title
;---------------------------------------------
;Return - handle of popup
;---------------------------------------------
Func _GUIMoveResizePopupCreate($iFlag=Default, $sTitle="", $iH=Default, $iV=Default, $iX=Default, $iY=Default, $iStyle=$WS_POPUPWINDOW, $iExStyle=Default)
   If $iStyle=Default Then $iStyle=$WS_POPUPWINDOW
   Switch $iFlag
	  Case $MRP_MOVE, Default
		GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN_0")
	  Case $MRP_RESIZE
		GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN_1")
		GUIRegisterMsg($WM_MOUSEMOVE, "SetCursor")
	  Case $MRP_MOVE_RESIZE
		GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN_2")
		GUIRegisterMsg($WM_MOUSEMOVE, "SetCursor")
   EndSwitch
   Return GUICreate($sTitle, $iH, $iV, $iX, $iY, $iStyle, $iExStyle)
EndFunc

;---------------------------------------------
; _GUIMoveResizeRectangleCreate( $hPen [, $iFlag[, $iH=Default [, $iV=Default [, $iX=Default [, $iY=Default ]]]]])
;---------------------------------------------
;$hPen - pencil handle
;---------------------------------------------
;$iFlag = $MRP_NONE        - none
;SiFlag = $MRP_MOVE        - move (Default)
;$iFlag = $MRP_RESIZE      - resize
;$iFlag = $MRP_MOVE_RESIZE - move & resize
;---------------------------------------------
;Return - handle of rectangle
;---------------------------------------------
Func _GUIMoveResizeRectangleCreate($hPen, $iFlag, $iH=Default, $iV=Default, $iX=Default, $iY=Default)
   Local $aGUI_DC[2], $iCol_T=0xABCDEF
   $aGUI_DC[0]=_GUIMoveResizePopupCreate($iFlag, "", $iH, $iV, $iX, $iY, $WS_POPUPWINDOW, $WS_EX_LAYERED)
   $aGUI_DC[1]=_WinAPI_GetWindowDC($aGUI_DC[0])
   _WinAPI_SetLayeredWindowAttributes($aGUI_DC[0], $iCol_T, 255)
   GUISetBkColor($iCol_T, $aGUI_DC[0])
   _WinAPI_SelectObject($aGUI_DC[1], $hPen)
   Return $aGUI_DC
EndFunc

;---------------------------------------------
; _Rectangle($aGUI_DC)
;---------------------------------------------
;$aGUI_DC - array of handles
;$aGUI_DC[0] - handle of rectangle
;$aGUI_DC[1] - handle of DC
;---------------------------------------------
;Return - none
;---------------------------------------------
Func _Rectangle($aGUI_DC)
   Local $h = _WinAPI_GetWindowHeight($aGUI_DC[0])
   Local $w = _WinAPI_GetWindowWidth($aGUI_DC[0])
   _WinAPI_DrawLine($aGUI_DC[1], 0, 0, $w, 0)
   _WinAPI_DrawLine($aGUI_DC[1], $w, 0, $w, $h)
   _WinAPI_DrawLine($aGUI_DC[1], 0, 0, 0, $h)
   _WinAPI_DrawLine($aGUI_DC[1],$w, $h, 0,$h)
   Sleep(50)
EndFunc


;---------------------------------------------------------------------------------
#Region Funkcje pomocnicze
Func WM_LBUTTONDOWN_0($hGUI, $iMsg, $wParam, $lParam)
   Local $aCurInfo = GUIGetCursorInfo($hGUI)
   If $aCurInfo[4] = 0 Then ; Mouse not over a control
      DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                   			$WM_SYSCOMMAND, "wparam", 0xF012, "lparam", 0)
   EndIf
EndFunc

Func WM_LBUTTONDOWN_1($hGUI, $iMsg, $wParam, $lParam)
	Local $iCursorType = SetCursor($hGUI)
    If $iCursorType > 0 Then
        $iResizeType = 0xF000 + $iCursorType
		DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                   			$WM_SYSCOMMAND, "wparam", $iResizeType, "lparam", 0)
    EndIf
EndFunc

 Func WM_LBUTTONDOWN_2($hGUI, $iMsg, $wParam, $lParam)
     Local $iCursorType = SetCursor($hGUI)
     If $iCursorType > 0 Then
        $iResizeType = 0xF000 + $iCursorType
		DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                   			$WM_SYSCOMMAND, "wparam", $iResizeType, "lparam", 0)
	 Else
	   Local $aCurInfo = GUIGetCursorInfo($hGUI)
       If $aCurInfo[4] = 0 Then ; Mouse not over a control
			DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
									$WM_SYSCOMMAND, "wparam", 0xF012, "lparam", 0)
       EndIf
     EndIf
 EndFunc

Func SetCursor($hGUI)
	 Local $c = GUIGetCursorInfo(), $w = WinGetPos($hGUI), $m=12
	 Local $IsBorder = ($c[0]<$m) + ($c[0]>$w[2]-$m)*2 + ($c[1]<$m)*3 + ($c[1]>$w[3]-$m)*6
     Switch $IsBorder
         Case 0
             GUISetCursor(2, 1)
         Case 1, 2
             GUISetCursor(13, 1)
         Case 3, 6
             GUISetCursor(11, 1)
         Case 5, 7
             GUISetCursor(10, 1)
         Case 4, 8
             GUISetCursor(12, 1)
	 EndSwitch
	 Return $IsBorder
EndFunc
#EndRegion Funkcje pomocnicze
Opublikowano

w nawiasie mowiac ciesze sie ze mialem szczescie akurat natrafic na twórce  includa mi potrzebnego i jezeli to nie problem to potrzebowal bym jeszcze delikatnej kosmetyki bo jest 1 nurtujacy mnie problem. pozwolilem w include zmniejszyc sobie zmienna $m = 5 bo tos pokojnie wystarcza ale jest jeden szkopul.

nie da sie powiekszac ani zmiejszac tego boxa jezeli pozycja myszki znajduje sie dokladnie skraju boxa nie zaleznie od jego wielkosci czy tez wartości zmiennej $m

mam nadzieje zewiesz o co chodzi

staralem sie pokombinowac no ale nie idzie. caloś mi pasuje na 99%

z góry dziekuje

Opublikowano

Nie bardzo wiem o co ci chodzi. Próbowałem u mnie we wszystkich położeniach i wielkościach i zawsze działa bez problemu.

Opublikowano

dziala fakt zajebiasczo i bardzo dziekuje ale na 99% zrob sobie tego boxa i lewa sciane sproboj powiekszyc/przesunac w lewo z maxymalnie skrajnego pixela... nie lapie go 

kursor rozciagania sieowszem pokazuje ale na tym sie konczy. probowalem w udfie nazmiennych dadawac odejmowac 1 i nic. to jest blachostka niby no ale jednak
i taka mala uwaga bo jak odpalasz samego udefa to wystepuja bledy bo nie bylo dodanego <WINAPI.au3> w twoim udfie. dzialalo bo mialem dodanegow swoim calym skrypcie ale udf powinien byc sprawny nizaleznie :P
sory ze sie czepiam. troche w tym siedzialem kiedys teraz sobie dopiero przypominam (z trojkrotna szybkoscia :P)

Opublikowano

Z tym <WINAPI.au3> to masz oczywiście rację. Nie zauważyłem, bo wywołanie było także w skrypcie i wszystko działało.

Z tym rozciąganiem ramki to nawet nie zauważyłem tego efektu, bo to tylko na 1 pikselu. Ostry tester jesteś.

 

Oto poprawiony UDF:

#include-once

#include <GuiConstantsEx.au3>
#include <Windowsconstants.au3>
#include <WINAPI.au3>

Global $MRP_NONE        = 0
Global $MRP_MOVE        = 1
Global $MRP_RESIZE      = 2
Global $MRP_MOVE_RESIZE = 3
;---------------------------------------------
;wasta(2016)
;---------------------------------------------
;_GUIMoveResizePopupCreate ( [ $iFlag=1 [, $sTitle="" [, $iH=100 [, $iV=100 [, $iX=Default [, $iY=Default [, $iStyle=$WS_POPUPWINDOW [, $iExStyle=Default ]]]]]]]] )
;---------------------------------------------
;$iFlag = $MRP_NONE        - none
;SiFlag = $MRP_MOVE        - move (Default)
;$iFlag = $MRP_RESIZE      - resize
;$iFlag = $MRP_MOVE_RESIZE - move & resize
;---------------------------------------------
;$sTitle - GUI title
;---------------------------------------------
;Return - handle of popup
;---------------------------------------------
Func _GUIMoveResizePopupCreate($iFlag=Default, $sTitle="", $iH=Default, $iV=Default, $iX=Default, $iY=Default, $iStyle=$WS_POPUPWINDOW, $iExStyle=Default)
   If $iStyle=Default Then $iStyle=$WS_POPUPWINDOW
   Switch $iFlag
	  Case $MRP_MOVE, Default
		GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN_0")
	  Case $MRP_RESIZE
		GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN_1")
		GUIRegisterMsg($WM_MOUSEMOVE, "SetCursor")
	  Case $MRP_MOVE_RESIZE
		GUIRegisterMsg($WM_LBUTTONDOWN, "WM_LBUTTONDOWN_2")
		GUIRegisterMsg($WM_MOUSEMOVE, "SetCursor")
   EndSwitch
   Return GUICreate($sTitle, $iH, $iV, $iX, $iY, $iStyle, $iExStyle)
EndFunc

;---------------------------------------------
; _GUIMoveResizeRectangleCreate( $hPen [, $iFlag[, $iH=Default [, $iV=Default [, $iX=Default [, $iY=Default ]]]]])
;---------------------------------------------
;$hPen - pencil handle
;---------------------------------------------
;$iFlag = $MRP_NONE        - none
;SiFlag = $MRP_MOVE        - move (Default)
;$iFlag = $MRP_RESIZE      - resize
;$iFlag = $MRP_MOVE_RESIZE - move & resize
;---------------------------------------------
;Return - handle of rectangle
;---------------------------------------------
Func _GUIMoveResizeRectangleCreate($hPen, $iFlag, $iH=Default, $iV=Default, $iX=Default, $iY=Default)
   Local $aGUI_DC[2], $iCol_T=0xABCDEF
   $aGUI_DC[0]=_GUIMoveResizePopupCreate($iFlag, "", $iH, $iV, $iX, $iY, $WS_POPUPWINDOW, $WS_EX_LAYERED)
   $aGUI_DC[1]=_WinAPI_GetWindowDC($aGUI_DC[0])
   _WinAPI_SetLayeredWindowAttributes($aGUI_DC[0], $iCol_T, 255)
   GUISetBkColor($iCol_T, $aGUI_DC[0])
   _WinAPI_SelectObject($aGUI_DC[1], $hPen)
   Return $aGUI_DC
EndFunc

;---------------------------------------------
; _Rectangle($aGUI_DC)
;---------------------------------------------
;$aGUI_DC - array of handles
;$aGUI_DC[0] - handle of rectangle
;$aGUI_DC[1] - handle of DC
;---------------------------------------------
;Return - none
;---------------------------------------------
Func _Rectangle($aGUI_DC)
   Local $h = _WinAPI_GetWindowHeight($aGUI_DC[0])
   Local $w = _WinAPI_GetWindowWidth($aGUI_DC[0])
   _WinAPI_DrawLine($aGUI_DC[1], 0, 0, $w, 0)
   _WinAPI_DrawLine($aGUI_DC[1], $w, 0, $w, $h)
   _WinAPI_DrawLine($aGUI_DC[1], 0, 0, 0, $h)
   _WinAPI_DrawLine($aGUI_DC[1],$w, $h, 0,$h)
   Sleep(50)
EndFunc


;---------------------------------------------------------------------------------
#Region Funkcje pomocnicze
Func WM_LBUTTONDOWN_0($hGUI, $iMsg, $wParam, $lParam)
   Local $aCurInfo = GUIGetCursorInfo($hGUI)
   If $aCurInfo[4] = 0 Then ; Mouse not over a control
      DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                   			$WM_SYSCOMMAND, "wparam", 0xF012, "lparam", 0)
   EndIf
EndFunc

Func WM_LBUTTONDOWN_1($hGUI, $iMsg, $wParam, $lParam)
	Local $iCursorType = SetCursor($hGUI)
    If $iCursorType > 0 Then
        $iResizeType = 0xF000 + $iCursorType
	DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                   			$WM_SYSCOMMAND, "wparam", $iResizeType, "lparam", 0)
    EndIf
EndFunc

Func WM_LBUTTONDOWN_2($hGUI, $iMsg, $wParam, $lParam)
    Local $iCursorType = SetCursor($hGUI)
    If $iCursorType > 0 Then
       $iResizeType = 0xF000 + $iCursorType
       DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
               			$WM_SYSCOMMAND, "wparam", $iResizeType, "lparam", 0)
    Else
       Local $aCurInfo = GUIGetCursorInfo($hGUI)
       If $aCurInfo[4] = 0 Then ; Mouse not over a control
	  DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
					$WM_SYSCOMMAND, "wparam", 0xF012, "lparam", 0)
       EndIf
    EndIf
EndFunc

Func SetCursor($hGUI)
     Local $c = GUIGetCursorInfo(), $w = WinGetPos($hGUI), $m=6
     Local $IsBorder = ($c[0]<$m And $c[0]>0) + ($c[0]>$w[2]-$m And $c[0]<$w[2])*2 + ($c[1]<$m And $c[1]>0)*3 + ($c[1]>$w[3]-$m And $c[1]<$w[3])*6
     Switch $IsBorder
         Case 0
             GUISetCursor(2, 1)
         Case 1, 2
             GUISetCursor(13, 1)
         Case 3, 6
             GUISetCursor(11, 1)
         Case 5, 7
             GUISetCursor(10, 1)
         Case 4, 8
             GUISetCursor(12, 1)
	 EndSwitch
	 Return $IsBorder
EndFunc
#EndRegion Funkcje pomocnicze
Opublikowano

no sorry taki juz jestem :P
patrz co sie dzieje

"C:\Program Files (x86)\AutoIt3\Include\_GUIMoveResizePopup.au3" (118) : ==> Subscript used on non-accessible variable.:
Local $IsBorder = ($c[0]<$m And $c[0]>0) + ($c[0]>$w[2]-$m And $c[0]<$w[2])*2 + ($c[1]<$m And $c[1]>0)*3 + ($c[1]>$w[3]-$m And $c[1]<$w[3])*6
Local $IsBorder = ($c^ ERROR
 
czemu to nastepuje po urzyciu funkcji na pokazanie coordow
Func _showcoords()
    Local $aPos = WinGetPos("[ACTIVE]")
    MsgBox($MB_SYSTEMMODAL, "", "X-Pos: " & $aPos[0] & @CRLF & _
            "Y-Pos: " & $aPos[1] & @CRLF & _
            "Width: " & $aPos[2] & @CRLF & _
            "Height: " & $aPos[3])
EndFunc   ;==>Example

jak inaczej mam sprawdzic coordy jak wszystko teraz w include siedzi ??
jedynie co moge zrobic to 

GUIDelete ($aGUI_DC)

to caly kodzik i tu odrazu podpowiedz dla ciebie bo cos jest nie tak
mianowicie dodalem funkcje ktora przesuwa mysz na lewy gorny rog ostatniego aktywnego okna. na kazdym mozliwym oknie tj. notatnik, folder, chrome (oczywiscie okno nie jest na pelnym ekranie) kursor leci w ten rog i zawsze sie pojawi kursor rozciagania skosnego. ten RED BOX jest wyjątkiem... :(((

caly kodzik dam to szybciej pojdzie. GL

 #include <_GUIMoveResizePopup.au3>
 #include <WINAPI.au3>

HotKeySet("q", "_quit")
HotKeySet("w", "_delbox")
HotKeySet("e", "_showcoords")
HotKeySet("r", "_mouse")

Const $iCol_F = 0x0000FF

$hPen = _WinAPI_CreatePen($PS_INSIDEFRAME, 30, $iCol_F)  ;tworzenie pióra
$aGUI_DC = _GUIMoveResizeRectangleCreate($hPen, $MRP_MOVE_RESIZE) ;tworzenie ramki

GUISetState()
While 1
   _Rectangle($aGUI_DC) ;funkcja wyświetlająca, przesuwająca i zmieniająca rozmiary ramki
WEnd

Func _showcoords()
    Local $aPos = WinGetPos("[ACTIVE]")
    MsgBox($MB_SYSTEMMODAL, "", "X-Pos: " & $aPos[0] & @CRLF & _
            "Y-Pos: " & $aPos[1] & @CRLF & _
            "Width: " & $aPos[2] & @CRLF & _
            "Height: " & $aPos[3])
EndFunc   ;==>Example

Func _mouse()
	Local $aPos = WinGetPos("[ACTIVE]")
	MouseMove ($aPos[0],$aPos[1])
EndFunc   ;==>_quit

Func _delbox()
	GUIDelete ($aGUI_DC)
EndFunc   ;==>_quit

Func _quit()
	Exit
EndFunc   ;==>_quit
Opublikowano

moze to wynik tego ze w zadnym miejscu nie umiesciles 

    _WinAPI_SelectObject($hDC, $o_Orig)
    _WinAPI_DeleteObject($hPen)
    _WinAPI_ReleaseDC(0, $hDC)

wyczyszczenie zasobow. moze przez to ze to jest nonstop odpalone, program jest przeciazony i nie nadaza sam nad soba ?? taka sugestia

Opublikowano

To nie było powodem. Po naciśnięciu OK funkcja  GUIGetCursorInfo() nie zwraca tablicy i błąd powstawał w UDF'ie, w funkcji SetCursor. Wprowadziłem kontrolę czy GUIGetCursorInfo() jest tablicą i teraz się nie wywala.

Dodałem tez do UDF'a usuwania GUI i zwalnianie zasobów żeby była taka możliwość. Dodałem też do nazw funkcji pomocniczych prefiks __ aby zmniejszyć możliwość konfliktu nazw.

Uzupełniony skrypt:

#include <_GUIMoveResizePopup.au3>
#include <WINAPI.au3>

HotKeySet("q", "_quit")
HotKeySet("w", "_delbox")
HotKeySet("e", "_showcoords")
HotKeySet("r", "_mouse")

Const $iCol_F = 0x0000FF

Global $hPen = _WinAPI_CreatePen($PS_INSIDEFRAME, 30, $iCol_F)  ;tworzenie pióra
Global $aGUI_DC = _GUIMoveResizeRectangleCreate($hPen, $MRP_MOVE_RESIZE) ;tworzenie ramki

GUISetState()
While 1
   _Rectangle($aGUI_DC) ;funkcja wyświetlająca, przesuwająca i zmieniająca rozmiary ramki
WEnd



Func _showcoords()
    Local $aPos = WinGetPos($aGUI_DC[0])
    MsgBox($MB_SYSTEMMODAL, "", "X-Pos: " & $aPos[0] & @CRLF & _
            "Y-Pos: " & $aPos[1] & @CRLF & _
            "Width: " & $aPos[2] & @CRLF & _
            "Height: " & $aPos[3])
EndFunc   ;==>Example

Func _mouse()
   Local $aPos = WinGetPos($aGUI_DC[0])
   MouseMove ($aPos[0],$aPos[1])
EndFunc   ;==>_quit

Func _delbox()
   _GUIMoveResizeDelete($aGUI_DC)
EndFunc   ;==>_quit

Func _quit()
   _WinAPI_DeleteObject($hPen)
   _GUIMoveResizeDelete($aGUI_DC)
    Exit
EndFunc   ;==>_quit

Poprawiony UDF:

#include-once

#include <GuiConstantsEx.au3>
#include <Windowsconstants.au3>
#include <WINAPI.au3>

Global $MRP_NONE        = 0
Global $MRP_MOVE        = 1
Global $MRP_RESIZE      = 2
Global $MRP_MOVE_RESIZE = 3
;---------------------------------------------
;wasta(2016)
;---------------------------------------------
;_GUIMoveResizePopupCreate ( [ $iFlag=1 [, $sTitle="" [, $iH=100 [, $iV=100 [, $iX=Default [, $iY=Default [, $iStyle=$WS_POPUPWINDOW [, $iExStyle=Default ]]]]]]]] )
;---------------------------------------------
;$iFlag = $MRP_NONE        - none
;SiFlag = $MRP_MOVE        - move (Default)
;$iFlag = $MRP_RESIZE      - resize
;$iFlag = $MRP_MOVE_RESIZE - move & resize
;---------------------------------------------
;$sTitle - GUI title
;---------------------------------------------
;Return - handle of popup
;---------------------------------------------
Func _GUIMoveResizePopupCreate($iFlag=Default, $sTitle="", $iH=Default, $iV=Default, $iX=Default, $iY=Default, $iStyle=$WS_POPUPWINDOW, $iExStyle=Default)
   If $iStyle=Default Then $iStyle=$WS_POPUPWINDOW
   Switch $iFlag
      Case $MRP_MOVE, Default
        GUIRegisterMsg($WM_LBUTTONDOWN, "__WM_LBUTTONDOWN_0")
      Case $MRP_RESIZE
        GUIRegisterMsg($WM_LBUTTONDOWN, "__WM_LBUTTONDOWN_1")
        GUIRegisterMsg($WM_MOUSEMOVE, "__SetCursor")
      Case $MRP_MOVE_RESIZE
        GUIRegisterMsg($WM_LBUTTONDOWN, "__WM_LBUTTONDOWN_2")
        GUIRegisterMsg($WM_MOUSEMOVE, "__SetCursor")
   EndSwitch
   Return GUICreate($sTitle, $iH, $iV, $iX, $iY, $iStyle, $iExStyle)
EndFunc

;---------------------------------------------
; _GUIMoveResizeRectangleCreate( $hPen [, $iFlag[, $iH=Default [, $iV=Default [, $iX=Default [, $iY=Default ]]]]])
;---------------------------------------------
;$hPen - pencil handle
;---------------------------------------------
;$iFlag = $MRP_NONE        - none
;SiFlag = $MRP_MOVE        - move (Default)
;$iFlag = $MRP_RESIZE      - resize
;$iFlag = $MRP_MOVE_RESIZE - move & resize
;---------------------------------------------
;Return - handle of rectangle
;---------------------------------------------
Func _GUIMoveResizeRectangleCreate($hPen, $iFlag, $iH=Default, $iV=Default, $iX=Default, $iY=Default)
   Local $aGUI_DC[2], $iCol_T=0xABCDEF
   $aGUI_DC[0]=_GUIMoveResizePopupCreate($iFlag, "", $iH, $iV, $iX, $iY, $WS_POPUPWINDOW, $WS_EX_LAYERED)
   $aGUI_DC[1]=_WinAPI_GetWindowDC($aGUI_DC[0])
   _WinAPI_SetLayeredWindowAttributes($aGUI_DC[0], $iCol_T, 255)
   GUISetBkColor($iCol_T, $aGUI_DC[0])
   _WinAPI_SelectObject($aGUI_DC[1], $hPen)
   Return $aGUI_DC
EndFunc

;---------------------------------------------
; _Rectangle($aGUI_DC)
;---------------------------------------------
;$aGUI_DC - array of handles
;$aGUI_DC[0] - handle of rectangle
;$aGUI_DC[1] - handle of DC
;---------------------------------------------
;Return - none
;---------------------------------------------
Func _Rectangle($aGUI_DC)
   Local $h = _WinAPI_GetWindowHeight($aGUI_DC[0])
   Local $w = _WinAPI_GetWindowWidth($aGUI_DC[0])
   _WinAPI_DrawLine($aGUI_DC[1], 0, 0, $w, 0)
   _WinAPI_DrawLine($aGUI_DC[1], $w, 0, $w, $h)
   _WinAPI_DrawLine($aGUI_DC[1], 0, 0, 0, $h)
   _WinAPI_DrawLine($aGUI_DC[1],$w, $h, 0,$h)
   Sleep(50)
EndFunc

;---------------------------------------------
; _GUIMoveResizeDelete($aGUI_DC)
;---------------------------------------------
;$aGUI_DC - array of handles
;$aGUI_DC[0] - handle of rectangle
;$aGUI_DC[1] - handle of DC
;---------------------------------------------
;Return - none
;---------------------------------------------
Func _GUIMoveResizeDelete($aGUI_DC)
    GUIRegisterMsg($WM_LBUTTONDOWN, "")
    GUIRegisterMsg($WM_MOUSEMOVE, "")
    _WinAPI_ReleaseDC($aGUI_DC[0], $aGUI_DC[1])
    GUIDelete($aGUI_DC[0])
EndFunc

;---------------------------------------------------------------------------------
#Region Funkcje pomocnicze
Func __WM_LBUTTONDOWN_0($hGUI, $iMsg, $wParam, $lParam)
   Local $aCurInfo = GUIGetCursorInfo($hGUI)
   If $aCurInfo[4] = 0 Then ; Mouse not over a control
      DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                               $WM_SYSCOMMAND, "wparam", 0xF012, "lparam", 0)
   EndIf
EndFunc

Func __WM_LBUTTONDOWN_1($hGUI, $iMsg, $wParam, $lParam)
    Local $iCursorType = __SetCursor($hGUI)
    If $iCursorType > 0 Then
        $iResizeType = 0xF000 + $iCursorType
    DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                               $WM_SYSCOMMAND, "wparam", $iResizeType, "lparam", 0)
    EndIf
EndFunc

Func __WM_LBUTTONDOWN_2($hGUI, $iMsg, $wParam, $lParam)
    Local $iCursorType = __SetCursor($hGUI)
    If $iCursorType > 0 Then
       $iResizeType = 0xF000 + $iCursorType
       DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                           $WM_SYSCOMMAND, "wparam", $iResizeType, "lparam", 0)
    Else
       Local $aCurInfo = GUIGetCursorInfo($hGUI)
       If $aCurInfo[4] = 0 Then ; Mouse not over a control
      DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $hGUI, "uint", _
                    $WM_SYSCOMMAND, "wparam", 0xF012, "lparam", 0)
       EndIf
    EndIf
EndFunc

Func __SetCursor($hGUI)
     Local $c[2], $w = WinGetPos($hGUI), $m=6
     If IsArray(GUIGetCursorInfo()) Then $c=GUIGetCursorInfo()
     Local $IsBorder = ($c[0]<$m And $c[0]>0) + ($c[0]>$w[2]-$m And $c[0]<$w[2])*2 + ($c[1]<$m And $c[1]>0)*3 + ($c[1]>$w[3]-$m And $c[1]<$w[3])*6
     Switch $IsBorder
         Case 0
             GUISetCursor(2, 1)
         Case 1, 2
             GUISetCursor(13, 1)
         Case 3, 6
             GUISetCursor(11, 1)
         Case 5, 7
             GUISetCursor(10, 1)
         Case 4, 8
             GUISetCursor(12, 1)
     EndSwitch
     Return $IsBorder
EndFunc
#EndRegion Funkcje pomocnicze

Razem to jakoś doszlifujemy. A może już teraz jest OK.

Opublikowano

zaskocze cie bo juz tego handla w nocy dodalem identycznie jak ty i nie pomoglo. najdziwniejsze jest to ze program wywalalo losowo. mysle ze to mialo zwiazek i z handlem i z zasobami ktore czerpaly sie w niskonczonosc :] potestuje i dam znac. ogolnie wprowadziles fajne poprawki umozliwiajace troche lepsz sterowanie caloscia.

C.D.N. :P

Oby nie haha ^_^

Opublikowano

Wywalało się po naciśnięciu OK, wtedy gdy MsgBox był wewnątrz ramki. Gdy był na zewnątrz to normalnie można było zamknąć za pomocą OK. Nie wywalało się także przy zamknięciu krzyżykiem.

Z jakiś powodów gdy MsgBox jest wewnątrz ramki po naciśnięciu OK, GUIGetCursorInfo() generuje błąd i zamiast tablicy zwraca 0.

Nie mam pojęcia co jest przyczyną, może po prostu AutoIt tak się zachowuje, i trzeba to polubić.

Jakby jeszcze coś to pisz, postaram się pomóc.

 

Pozdrawiam

Opublikowano

jak juz sie zabralem za ten kod to pomyslalem ze go troche podrasuje aby moze komus byl on użyteczny

 
#include <_GUIMoveResizePopup.au3>
#include <WINAPI.au3>
#include <MsgBoxConstants.au3>

HotKeySet("q", "_quit")
HotKeySet("w", "_set_area")
HotKeySet("x", "_msgdynamic")
HotKeySet("z", "_msgstatic")

Local $pos_areax0, $pos_areay0, $pos_areax1, $pos_areay1
Local $box

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

;; ////////////////////////////////////////////////////////////////////////////////////////////////////////
;;  główna funkcja

Func _set_area(); HOTKEY W
$box = $box + 1
If $box = 1 Then  ;zapomiegam stworzenie 2 boxow
$box = $box + 1
Const $iCol_F = 0x0000FF ; kolorek
Global $hPen = _WinAPI_CreatePen($PS_INSIDEFRAME, 30, $iCol_F)  ;tworzenie pióra
Global $aGUI_DC = _GUIMoveResizeRectangleCreate($hPen, $MRP_MOVE_RESIZE,100,100, 300, 300) ;tworzenie ramki
GUISetState() ;wyświetlenie
EndIf
While $box = 2
HotKeySet("{ENTER}", "_getarea")   ;ustawienie nowych hotkeyow
HotKeySet("{ESC}", "_getareaexit") ;enter = akceptujemy boxa // esc = anulujemy
_Rectangle($aGUI_DC) ;funkcja odpowiadajaca za plynne przemieszczanie i resizing boxa
WEnd ;wymagany UDF   <_GUIMoveResizePopup.au3>   made by wasta

If $box = 3 Then
$box = $box - 1
MsgBox(0,"ERROR", "Cant crate two boxes at ones")
EndIf
EndFunc

Func _getarea()  ; HOTKEY ENTER
$box = 0
HotKeySet("{ESC}") ;przywrocenie orginalnych
HotKeySet("{ENTER}") ;hotkeyow
$pos_area = WinGetPos($aGUI_DC[0]) ;pobierz pozycje boxa
$pos_areax0 = $pos_area[0]
$pos_areay0 = $pos_area[1]
$pos_areax1 = $pos_area[0]+$pos_area[2]
$pos_areay1 = $pos_area[1]+$pos_area[3]
_WinAPI_DeleteObject($hPen) ;czyszczenie zasobów
_GUIMoveResizeDelete($aGUI_DC) ;czyszczenie zasobów
EndFunc ; Get koords BOX

Func _getareaexit() ; HOTKEY ESC
$box = 0
HotKeySet("{ESC}")
HotKeySet("{ENTER}")
   _WinAPI_DeleteObject($hPen)
   _GUIMoveResizeDelete($aGUI_DC)
$pos_areax0 = 0 ;po anulowaniu boxa ustalamy jego wielkosc
$pos_areay0 = 0 ;na cały ekran
$pos_areax1 = @DesktopHeight 
$pos_areay1 = @DesktopWidth 
EndFunc ; Cancel BOX

;; ////////////////////////////////////////////////////////////////////////////////////////////////////////

Func _msgdynamic() ; HOTKEY X
If $box > 0 Then
Local $pos_area = WinGetPos($aGUI_DC[0])
$pos_areax0 = $pos_area[0]
$pos_areay0 = $pos_area[1]
$pos_areax1 = $pos_area[0]+$pos_area[2]
$pos_areay1 = $pos_area[1]+$pos_area[3]
MsgBox(0,"Actual Box Position", $pos_areax0&"  " &$pos_areay0& @CRLF & $pos_areax1&"  " &$pos_areay1)
Else
MsgBox(0,"ERROR", "Box dont even exist")
EndIf
EndFunc   ; pokazuje koordy boxa w czasie rzeczywistym (jesli istnieje)

Func _msgstatic() ; HOTKEY Z
MsgBox(0,"Zapisana pozycja boxa", $pos_areax0&"  " &$pos_areay0& @CRLF & $pos_areax1&"  " &$pos_areay1)
EndFunc   ; pokazuje koordy boxa po wybrani funkcj _getarea()

Func _quit() ; HOTKEY Q
   _WinAPI_DeleteObject($hPen)
   _GUIMoveResizeDelete($aGUI_DC)
    Exit
EndFunc ; bye bye

no ale jest jeszcze cos. ciagle powraca problem z pierwszego postu gdzie pojawia sie kursor rozciagania a mimo to nie reaguje.
o tyle lepiej ze ŹLE dziala TYLKO prawa strona i dół.

i zwroc jeszcze uwage ze mimo ze box jest ustawiony na 100x100 to caly box jest powiekszony o 2 pixele byc moze dla tego prawa dolna strona nie dziala prawidlowo jezeli chodzi o rozciaganie

zobacz odpalajac skrpt i wcisnij W potem X.

 

 

troche przesadzam ??
PZDR

Opublikowano

Co do pierwszego problemu to nie potrafię go rozwiązać. Wydaje mi się, że wyświetlanie kursora i rozciąganie okna jest przesunięte o 1 piksel i z poziomu AutoIt'a nie można tego zmienić.

Musisz to polubi, przyjmując, że to cecha, a nie wada. Ja nie mam żadnego pomysłu jak temu zaradzić, ale nie jestem wszechwiedzący.

 

Drugi problem, to w zasadzie nie problem, ale cecha działania systemu. Funkcja GUICreate tworzy okno o zadeklarowanej wielkości przestrzeni roboczej (czyli bez ramki), natomiast WinGetPos podaje całą wielkość okna (czyli z ramką).

Ponieważ nasze okno ma 1-pikselową ramkę, stąd rozbieżność wymiarów o 2 piksele. Jeżeli jest to problem, to można temu zaradzić odpowiednio przeliczając współrzędne.

Opublikowano

z tego co zdążyłem zauważyc to mimo ze coś sie wydaje nie mozliwe tonie znaczy ze sie nie da tego tak zmodyfikowac zeby jednak działało poprawnie 

WELL DONE ^_^

#include <GuiConstantsEx.au3>
 #include <Windowsconstants.au3>
 #include <SendMessage.au3>
 #include <WinAPI.au3>

 HotKeySet("{ESC}", "On_Exit")

 Global Const $SC_DRAGMOVE = 0xF012

 ; Set distance from edge of window where resizing is possible
 Global Const $iMargin = 4

 ; Create GUI
 $hGUI = GUICreate("Y", 120, 120, -1, -1, $WS_POPUP, BitOr($WS_EX_LAYERED, $WS_EX_COMPOSITED, $WS_EX_TOPMOST))
 GUISetBkColor(0x00FF00)
GuiCtrlCreateLabel("", 10, 10, 100, 100)
GUICtrlSetBkColor(-1, 0xABCDEF)
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
 GUISetState()
_WinAPI_SetLayeredWindowAttributes($hGui, 0xABCDEF)

 ; Register message handlers
 GUIRegisterMsg($WM_MOUSEMOVE, "_SetCursor")            ; For cursor type change
 GUIRegisterMsg($WM_LBUTTONDOWN, "_WM_LBUTTONDOWN")     ; For resize/drag

While 1
	Sleep(500)
WEnd

 ; Set cursor to correct resizing form if mouse is over a border
 Func _SetCursor()
     Local $iCursorID
     Switch _Check_Border()
         Case 0
             $iCursorID = 2
         Case 1, 2
             $iCursorID = 13
         Case 3, 6
             $iCursorID = 11
         Case 5, 7
             $iCursorID = 10
         Case 4, 8
             $iCursorID = 12
     EndSwitch
     GUISetCursor($iCursorID, 1)
 EndFunc ;==>SetCursor

 ; Check cursor type and resize/drag window as required
 Func _WM_LBUTTONDOWN($hWnd, $iMsg, $wParam, $lParam)
     Local $iCursorType = _Check_Border()
     If $iCursorType > 0 Then ; Cursor is set to resizing style so send appropriate resize message
         $iResizeType = 0xF000 + $iCursorType
         _SendMessage($hGUI, $WM_SYSCOMMAND, $iResizeType, 0)
     Else
         Local $aCurInfo = GUIGetCursorInfo($hGUI)
         If $aCurInfo[4] = 0 Then ; Mouse not over a control
             _SendMessage($hGUI, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)
         EndIf
     EndIf
 EndFunc ;==>WM_LBUTTONDOWN

 ; Determines if mouse cursor over a border
 Func _Check_Border()
     Local $aCurInfo = GUIGetCursorInfo()
     If @ Then Return -1
     Local $aWinPos = WinGetPos($hGUI)
     Local $iSide = 0
     Local $iTopBot = 0
     If $aCurInfo[0] < $iMargin Then $iSide = 1
     If $aCurInfo[0] > $aWinPos[2] - $iMargin Then $iSide = 2
     If $aCurInfo[1] < $iMargin Then $iTopBot = 3
     If $aCurInfo[1] > $aWinPos[3] - $iMargin Then $iTopBot = 6
     Return $iSide + $iTopBot
 EndFunc ;==>_Check_Border

 Func On_Exit()
     Exit
 EndFunc

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...