Что нового

GUICreate как сделать форму фиксированной в определенном месте

Tiberium6

Новичок
Сообщения
51
Репутация
0
С помощью чего сделать форму
Код:
GUICreate
фиксированным в правом верхнем углу?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Tiberium6
Если вы имели в виду оставлять окно в той же позиции (х=0,у=0) даже при перемещении то наверное так:
Код:
#include<WindowsConstants.au3>
$GUI=GUICreate("Имя окна",200,300,0,0)
GUIRegisterMsg($WM_WINDOWPOSCHANGED,"__WinMove")
GUISetState(@SW_SHOW,$GUI)
Do
	Sleep(20)
Until GUIGetMsg()=-3
Func __WinMove($hWnd,$Msg,$wPar,$lPar)
	Switch $hWnd
		Case $GUI
			Local $stRec=DllStructCreate("int[6]",$lPar), _
					$left=DllStructGetData($stRec,1,3),$top=DllStructGetData($stRec,1,4)
			If $left>0 Or $top>0 Then
				WinMove($GUI,'',0,0)
			EndIf
	EndSwitch
EndFunc

В принципе окно все же будет перемещаться(рывками) но оно останется там где требуется.
 
Автор
T

Tiberium6

Новичок
Сообщения
51
Репутация
0
MnM именно это имел ввиду, спасибо, а на прямую (стандартно) так нельзя сделать, не прибегая к принудительному перемещению?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Tiberium6
Ну я лично не знаю метод таких. Я какое смог, такое предложил :smile:
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Может, просто окно какого-нибудь стиля без заголовка? Его просто так не переместишь)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

#AutoIt3Wrapper_UseX64=n

$hGUI = GUICreate('Имя окна', 200, 300, 0, 0)

GUIRegisterMsg($WM_WINDOWPOSCHANGING, 'WM_WINDOWPOSCHANGING')
WinMove($hGUI, '', 0, 0)
GUISetState(@SW_SHOW, $hGUI)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_WINDOWPOSCHANGING($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hGUI
			Local Const $SPI_GETWORKAREA = 48
			
			Local $stWinPos = DllStructCreate('uint;uint;int;int;int;int;uint', $lParam)
			Local $stRECT = DllStructCreate('long;long;long;long')
			
			_WinAPI_SystemParametersInfo($SPI_GETWORKAREA, 0, DllStructGetPtr($stRECT))
			
			Local $iWA_Right = DllStructGetData($stRECT, 3)
			
			Local $aWinPos = WinGetPos($hGUI)
			Local $aWinCS = WinGetClientSize($hGUI)
			Local $iBorder = $aWinPos[2] - $aWinCS[0]
			
			DllStructSetData($stWinPos, 3, $iWA_Right - $aWinPos[2] - $iBorder)
			DllStructSetData($stWinPos, 4, $iBorder)
	EndSwitch
EndFunc
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
CreatoR
Просто так ради веселья свернул ваше окошко, и развернул = окно переместилось, после перемещения через название окна оно все же стало на место(Но у вас по лучше не мерцает, т.к. мое все же движется)
 

AZJIO

Меценат
Меценат
Сообщения
2,903
Репутация
1,200
http://autoit-script.ru/index.php/topic,6682.0.html
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,487
MnM [?]
Просто так ради веселья свернул ваше окошко, и развернул = окно переместилось, после перемещения через название окна оно все же стало на место
Да, есть такое. Вот так будет надёжнее:

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

Global $hGUI, $aGUI_Pos
Global $aSysMetrics = _GetSysMetrics()
Global $iWinBorder = _GetWinBorder()

$hGUI = GUICreate('Имя окна', 200, 300, $aSysMetrics[2] - 200 - ($iWinBorder * 2), $iWinBorder)
$aGUI_Pos = WinGetPos($hGUI)

GUIRegisterMsg($WM_WINDOWPOSCHANGING, 'WM_WINDOWPOSCHANGING')
GUISetState(@SW_SHOW, $hGUI)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func WM_WINDOWPOSCHANGING($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hGUI
			Local $stWinPos = DllStructCreate($tagWINDOWPOS, $lParam)
			
			DllStructSetData($stWinPos, 3, $aGUI_Pos[0])
			DllStructSetData($stWinPos, 4, $aGUI_Pos[1])
	EndSwitch
EndFunc

Func _GetSysMetrics()
	Local Const $SPI_GETWORKAREA = 48
	
	Local $stRECT = DllStructCreate($tagRECT)
	_WinAPI_SystemParametersInfo($SPI_GETWORKAREA, 0, DllStructGetPtr($stRECT))
	
	Local $aRet[4] = [DllStructGetData($stRECT, 1), DllStructGetData($stRECT, 2), DllStructGetData($stRECT, 3), DllStructGetData($stRECT, 4)]
	Return $aRet
EndFunc

Func _GetWinBorder()
	Local $hWin = GUICreate('')
	
	Local $aWCSize = WinGetClientSize($hWin)
	Local $aWPos = WinGetPos($hWin)
	
	Local $iBorder = $aWPos[2] - $aWCSize[1]
	
	GUIDelete($hWin)
	Return $iBorder
EndFunc


но на самом деле, вариант с удалением меню ещё лучше (последнее сообщение в теме по ссылке выше).
 
Верх