Что нового

_WinAPI_UpdateLayeredWindowEx с поддержкой изменения размера

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Можно ли разрезать png картинку на 9 частей и разместить на окне с помощью _WinAPI_UpdateLayeredWindowEx() и подстраивать размеры под окно, наверное нет, тогда как такое можно сделать? не хочется создавать 9 WinAPI (Обычных) окон и на каждом размещать по картинке, всё равно же как то можно сделать, есть же программы окна которых прозрачны, взять тот же самый SkinCrafter, как такое сделать с минимумом создаваемых окон и с изменением размера окна?

Код:
#Include <GUIConstantsEx.au3>
#Include <WindowsConstants.au3>
#Include <WinAPIEx.au3>
#Include <GDIPlus.au3>
#Include <Misc.au3>

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\windows.png")
$hForm = GUICreate("", 580, 531, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
_WinAPI_UpdateLayeredWindowEx($hForm, -1, -1, _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage), 255)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
GUISetState()

$hParent = GUICreate("", 538, 470, 18, 40, $WS_POPUP, BitOR($WS_EX_CLIENTEDGE, $WS_EX_MDICHILD), $hForm)
GUISetBkColor(0xF7F7F7)
GUISetState(@SW_SHOW, $hParent)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $GUI_EVENT_PRIMARYDOWN
            $tMouse = MouseGetPos()
            $tWindow = WinGetPos($hForm)
            while _IsPressed(1)
                $pMouse = MouseGetPos()
                winmove($hForm, "", (($tWindow[0] + $pMouse[0]) - $tMouse[0]), (($tWindow[1] + $pMouse[1]) - $tMouse[1]))
            WEnd	
	EndSwitch
WEnd


 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Вы можете разместить в окне только один битмап. Как быть? Компануете в памяти битмап необходимых размеров и обновляете окно. Не вижу особых проблем. Изменение размера окна можете отлавливать с помощью WM_SIZE.
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Это всю картинку нужно изменять отловом WM_SIZE? у меня картинка порезана на 9 частей, то есть нужно отловить изменение размера окна, изменить размер каждой картинки и собрать в один Bitmap, а далее вставить на форму? как такое можно сделать? отловить размер окна знаю как, изменить размер каждой картинки тоже знаю как, а как потом собрать в одну?
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Это делается через _WinAPI_DrawBitmap() ?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Viktor1703 сказал(а):
Это делается через _WinAPI_DrawBitmap()?
Если картинка имеет прозрачность, то лучше компоновать с помощью GDI+. Покажите мне ваши 9 частей картинки.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Код:
#Include <APIConstants.au3>
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>

Global $hPart[9]

_GDIPlus_Startup()
For $i = 0 To 8
	$hPart[$i] = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\' & ($i + 1) & '.png')
Next

$hForm = GUICreate('', 400, 400, -1, -1, BitOR($WS_POPUP, $WS_SIZEBOX), $WS_EX_LAYERED)
_WinAPI_UpdateLayeredWindowEx($hForm, -1, -1, _ComposeBitmap(400, 400), 255, 1)
GUIRegisterMsg($WM_GETMINMAXINFO, 'WM_GETMINMAXINFO')
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUIRegisterMsg($WM_SIZING, 'WM_SIZING')
GUISetState()

Do
Until GUIGetMsg() = -3

Func _ComposeBitmap($iWidth, $iHeight)

	Local $hGraphic, $hImage, $hThumb, $hBitmap

	$hImage = _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight)
	$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hPart[0], 0, 0, 20, 20)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hPart[2], $iWidth - 20, 0, 20, 20)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hPart[8], $iWidth - 20, $iHeight - 20, 20, 20)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hPart[6], 0, $iHeight - 20, 20, 20)
	$hThumb = _GDIPlus_GetImageThumbnail($hPart[1], $iWidth - 40, 20)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hThumb, 20, 0, $iWidth - 40, 20)
	_GDIPlus_ImageDispose($hThumb)
	$hThumb = _GDIPlus_GetImageThumbnail($hPart[5], 20, $iHeight - 40)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hThumb, $iWidth - 20, 20, 20, $iHeight - 40)
	_GDIPlus_ImageDispose($hThumb)
	$hThumb = _GDIPlus_GetImageThumbnail($hPart[7], $iWidth - 40, 20)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hThumb, 20, $iHeight - 20, $iWidth - 40, 20)
	_GDIPlus_ImageDispose($hThumb)
	$hThumb = _GDIPlus_GetImageThumbnail($hPart[3], 20, $iHeight - 40)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hThumb, 0, 20, 20, $iHeight - 40)
	_GDIPlus_ImageDispose($hThumb)
	$hThumb = _GDIPlus_GetImageThumbnail($hPart[4], $iWidth - 40, $iHeight - 40)
	_GDIPlus_GraphicsDrawImageRect($hGraphic, $hThumb, 20, 20, $iWidth - 40, $iHeight - 40)
	_GDIPlus_ImageDispose($hThumb)
	$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_ImageDispose($hImage)
	Return $hBitmap
EndFunc   ;==>_ComposeBitmap

Func _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)

	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromScan0', 'int', $iWidth, 'int', $iHeight, 'int', $iStride, 'int', $iPixelFormat, 'ptr', $pScan0, 'ptr*', 0)

	If (@error) Or ($Ret[0]) Then
		Return SetError(@error, @extended, 0)
	EndIf
	Return $Ret[6]
EndFunc   ;==>_GDIPlus_CreateBitmapFromScan0

Func _GDIPlus_GetImageThumbnail($hImage, $iWidth, $iHeight)

	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageThumbnail', 'ptr', $hImage, 'uint', $iWidth, 'uint', $iHeight, 'ptr*', 0, 'ptr', 0, 'ptr', 0)

	If (@error) Or ($Ret[0]) Then
		Return SetError(@error, @extended, 0)
	EndIf
	Return $Ret[4]
EndFunc   ;==>_GDIPlus_GetImageThumbnail

Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm

			Local $tMMI = DllStructCreate('long Reserved[2];long MaxSize[2];long MaxPosition[2];long MinTrackSize[2];long MaxTrackSize[2]', $lParam)

			DllStructSetData($tMMI, 'MinTrackSize', 40, 1)
			DllStructSetData($tMMI, 'MinTrackSize', 40, 2)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_GETMINMAXINFO

Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Switch _WinAPI_DefWindowProc($hWnd, $iMsg, $wParam, $lParam)
				Case $HTCLIENT
					Return $HTCAPTION
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST

Func WM_SIZING($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm

			Local $Pos = _WinAPI_GetPosFromRect(DllStructCreate($tagRECT, $lParam))

			_WinAPI_UpdateLayeredWindowEx($hForm, -1, -1, _ComposeBitmap($Pos[2], $Pos[3]), 255, 1)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZING


Aero.zip
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
:shok: просто в шоке....спасибо огромное!!! :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Надеюсь вы в этом примере нашли ответы и на другие вопросы.
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Да, нашёл, и даже то о чём не догадывался, я пытался такое сам соорудить, но у меня кода выходило строк на 400, без профессионалов не обойтись, теперь буду и этот пример знать, очень полезный .... :smile:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Мне нравится, что вы всегда выкладываете ваши окончательные варианты. Но почему вы отказались от WM_NCHITTEST?

Несколько советов по поводу последнего:

  • Старайтесь называть переменные в соответствии с общепринятыми правилами или без префикса. Кроме того, все пользовательские функции принято называть с префикса "_".

    $a - массив
    $b - двойчные данные
    $f - логический тип
    $h - дескриптор
    $i - целочисленный тип
    $n - вещественный тип
    $p - указатель
    $s - строка
    $t - структура
    $v - переменный тип (Variant)
  • Если уж вы берете функцию из UDF, то уберите из нее "глупые" фрагменты.

    Код:
    Func IsPressed($iKey)
    	Local $Ret = DllCall('user32.dll', 'short', 'GetAsyncKeyState', 'int', $iKey)
    	If (@error) Or (Not $Ret[0]) Then Return SetError(1, 0, False)
    	Return BitAND($Ret[0], 0x8000) <> 0
    EndFunc   ;==>IsPressed


  • В этом цикле нужно вызывать WinMove(), только в том случае, если мышь была перемещена относительно своего предыдущего положения, а не постоянно. Кроме того, BitAND() здесь совершенно не в тему.

    Код:
    While IsPressed(1)
    	$pMouse = MouseGetPos()
    	$Location = BitAND($tMouse[1] > $tWindow[1], $tMouse[1] < ($tWindow[1] + 25))
    	If $Location Then
    		WinMove($hForm, "", (($tWindow[0] + $pMouse[0]) - $tMouse[0]), (($tWindow[1] + $pMouse[1]) - $tMouse[1]))
    	EndIf
    WEnd


  • К предыдущему. Перед входом в цикл лучше переключиться в режим "OnEvent" и обратно при выходе. Дело в том, что сообщения от GUI нужно утилизировать - GUIGetMsg(), иначе могут появиться разные глюки и тормоза. Видимо это связано с реализацией очереди сообщений в режиме "Loop" (переполнение).
  • Здесь бессмысленно проверять $iMsg, это и так очевидно. Проверять нужно $hWnd.

    Код:
    Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
    	Switch $iMsg
    		Case $WM_MOVE
    			...
    	EndSwitch
    	Return $GUI_RUNDEFMSG
    EndFunc   ;==>WM_MOVE


 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Спасибо большое, учту, WM_NCHITTEST - перемещает окно если кликнули и тащат в любой части окна, а нужно сделать за заголовок то есть от Top окна и + 25, пока что есть наработки разные, когда полностью будет готова, выложу на данный форум :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Viktor1703 [?]
а нужно сделать за заголовок то есть от Top окна и + 25
Есть же доп. стиль $GUI_WS_EX_PARENTDRAG
Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

GUICreate('test', 300, 200, -1, -1, $WS_POPUP)
$nLabel = GUICtrlCreateLabel('За Label можно таскать окно, как за заголовок', _
		0, 0, 300, 20, BitOR($SS_CENTERIMAGE, $SS_CENTER), $GUI_WS_EX_PARENTDRAG)
GUICtrlSetBkColor(-1, 0x000000)
$nButton = GUICtrlCreateButton('Exit', 100, 100, 100, 30)
GUISetState()
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE, $nButton
			Exit
	EndSwitch
WEnd
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Да но с созданием нового контрола не хочется возится, а потом контролировать его размеры, скрипт и так под тормаживает при изминении размера окна, ещё и это под контроль ставить...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Viktor1703,
А Вы считаете, что отслеживать верхнюю область (+25) окна для перетаскивания будет легче? Я готов ошибиться, но, думаю, что вряд ли.
 
Автор
Viktor1703

Viktor1703

AutoIT Гуру
Сообщения
1 535
Репутация
411
Ладно, по ходу сбора скрипта посмотрю что будет лучше :smile:

Yashied, а вы не помните какие значения и из каких картинок Вы ставили в функции _ComposeBitmap($iWidth, $iHeight), просто есть идея сделать её более автономной, то есть, написать в скрипте так:

Код:
Global $hPart[9][3]

$hFolder = FileSelectFolder("Выберите скин", @ScriptDir, 7)

For $i = 0 To 8
	$hPart[$i][0] = _GDIPlus_ImageLoadFromFile($hFolder & "\" & ($i + 1) & '.png')
	$hPart[$i][1] = _GDIPlus_ImageGetWidth($hPart[$i][0])
	$hPart[$i][2] = _GDIPlus_ImageGetHeight($hPart[$i][0])
Next

_ArrayDisplay($hPart)


То есть в массив будет записыватся hHandle изображения, высота и ширина
а в функции _ComposeBitmap($iWidth, $iHeight) подставить нужные строки, чтоб функция сома вычисляла сколько чего нужно прибавить, отнять и по каким координатам подставить, просто бывает что скин какой мы хотим поставить, предварительно при резке на куски может не дать того результата которого мы ожидаем, не все 9 кусков могут быть одного размера...сам попробывал но после завершения редактирования скрипта, созданная картинка выглядет не так как нужно, запутался сильно с вычислениями - что и куда...



Добавлено:
Сообщение автоматически объединено:

Всё, вроде сделал, по крайней мере нормально ставятся на свои места: Aero

Код:
#Include <APIConstants.au3>
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>
#Include <Array.au3>

Global $hPart[9][3]

;$hFolder = FileSelectFolder("Выберите скин", @ScriptDir, 7)

_GDIPlus_Startup()
For $i = 0 To 8
	$hPart[$i][0] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Vista Aero\" & ($i + 1) & '.png')
	$hPart[$i][1] = _GDIPlus_ImageGetWidth($hPart[$i][0])
	$hPart[$i][2] = _GDIPlus_ImageGetHeight($hPart[$i][0])
Next

_ArrayDisplay($hPart)

$hForm = GUICreate('', 400, 400, -1, -1, BitOR($WS_POPUP, $WS_SIZEBOX), $WS_EX_LAYERED)
_WinAPI_UpdateLayeredWindowEx($hForm, -1, -1, ComposeBitmap(400, 400, $hPart), 255, 1)

$iPos = WinGetPos($hForm)
$hGui = GUICreate('', 382, 363, $iPos[0] + 8, $iPos[1] + 28, BitOR($WS_CLIPCHILDREN, $WS_POPUP), -1, $hForm)
GUISetBkColor(0xEFEFEF)
$hExit = GUICtrlCreateButton("Exit", 20, 20, 50, 20)

GUIRegisterMsg($WM_GETMINMAXINFO, 'WM_GETMINMAXINFO')
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUIRegisterMsg($WM_SIZING, 'WM_SIZING')
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
GUISetState(@SW_SHOW, $hGui)
GUISetState(@SW_SHOW, $hForm)

While True
    Switch GUIGetMsg()
		Case -3, $hExit
			Exit
	EndSwitch
WEnd

Func ComposeBitmap($iWidth, $iHeight, ByRef $hPart)

	Local $hGraphic, $hImage, $hThumb, $hBitmap

    If IsArray($hPart) Then
	    $hImage = _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight)
	    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)
	    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hPart[0][0], 0, 0, $hPart[0][1], $hPart[0][2])
	    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hPart[2][0], $iWidth - $hPart[2][1], 0, $hPart[2][1], $hPart[2][2])
	    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hPart[8][0], $iWidth - $hPart[8][1], $iHeight - $hPart[8][2], $hPart[8][1], $hPart[8][2])
	    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hPart[6][0], 0, $iHeight - $hPart[6][2], $hPart[6][1], $hPart[6][2])
	    $hThumb = _GDIPlus_GetImageThumbnail($hPart[1][0], $iWidth - ($hPart[0][1] + $hPart[2][1]), $hPart[1][2])
	    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hThumb, $hPart[0][1], 0, $iWidth - ($hPart[0][1] + $hPart[2][1]), $hPart[1][2])
	    _GDIPlus_ImageDispose($hThumb)
	    $hThumb = _GDIPlus_GetImageThumbnail($hPart[5][0], $hPart[5][1], $iHeight - ($hPart[2][2] + $hPart[6][2]))
	    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hThumb, $iWidth - $hPart[5][1], $hPart[2][2], $hPart[5][1], $iHeight - ($hPart[2][2] + $hPart[6][2]))
	    _GDIPlus_ImageDispose($hThumb)
	    $hThumb = _GDIPlus_GetImageThumbnail($hPart[7][0], $iWidth - ($hPart[6][1] + $hPart[8][1]), $hPart[7][2])
	    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hThumb, $hPart[6][1], $iHeight - $hPart[7][2], $iWidth - ($hPart[6][1] + $hPart[8][1]), $hPart[7][2])
	    _GDIPlus_ImageDispose($hThumb)
	    $hThumb = _GDIPlus_GetImageThumbnail($hPart[3][0], $hPart[3][1], $iHeight - ($hPart[0][2] + $hPart[6][2]))
	    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hThumb, 0, $hPart[0][2], $hPart[3][1], $iHeight - ($hPart[0][2] + $hPart[6][2]))
	    _GDIPlus_ImageDispose($hThumb)
	    $hThumb = _GDIPlus_GetImageThumbnail($hPart[4][0], $iWidth - ($hPart[3][1] + $hPart[5][1]), $iHeight - ($hPart[0][2] + $hPart[6][2]))
	    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hThumb, $hPart[3][1], $hPart[0][2], $iWidth - ($hPart[3][1] + $hPart[5][1]), $iHeight - ($hPart[0][2] + $hPart[6][2]))
	    _GDIPlus_ImageDispose($hThumb)
	    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	    _GDIPlus_GraphicsDispose($hGraphic)
	    _GDIPlus_ImageDispose($hImage)
	Else
        Return SetError(@error, @extended, 0)
    EndIf

	Return $hBitmap
EndFunc

Func _GDIPlus_CreateBitmapFromScan0($iWidth, $iHeight, $iStride = 0, $iPixelFormat = 0x0026200A, $pScan0 = 0)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipCreateBitmapFromScan0', 'int', $iWidth, 'int', $iHeight, 'int', $iStride, 'int', $iPixelFormat, 'ptr', $pScan0, 'ptr*', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(@error, @extended, 0)
	EndIf
	Return $Ret[6]
EndFunc

Func _GDIPlus_GetImageThumbnail($hImage, $iWidth, $iHeight)
	Local $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageThumbnail', 'ptr', $hImage, 'uint', $iWidth, 'uint', $iHeight, 'ptr*', 0, 'ptr', 0, 'ptr', 0)
	If (@error) Or ($Ret[0]) Then
		Return SetError(@error, @extended, 0)
	EndIf
	Return $Ret[4]
EndFunc

Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Local $tMMI = DllStructCreate('long Reserved[2];long MaxSize[2];long MaxPosition[2];long MinTrackSize[2];long MaxTrackSize[2]', $lParam)
			DllStructSetData($tMMI, 'MinTrackSize', 40, 1)
			DllStructSetData($tMMI, 'MinTrackSize', 40, 2)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc

Func WM_SIZING($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Local $Pos = _WinAPI_GetPosFromRect(DllStructCreate($tagRECT, $lParam))
			_WinAPI_UpdateLayeredWindowEx($hWnd, -1, -1, ComposeBitmap($Pos[2], $Pos[3], $hPart), 255, 1)
			WinMove($hWnd, "", $Pos[0], $Pos[1], $Pos[2], $Pos[3])
			WinMove($hGui, "", $Pos[0] + 8, $Pos[1] + 28, $Pos[2] - 17, $Pos[3] - 37)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc

Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hForm
            Switch _WinAPI_DefWindowProc($hWnd, $iMsg, $wParam, $lParam)
                Case $HTCLIENT
                    Return $HTCAPTION
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
	Switch $iMsg
		Case $WM_MOVE
			Local $tRECT = _WinAPI_GetWindowRect($hWnd)
			$X = DllStructGetData($tRECT, "Left")
            $Y = DllStructGetData($tRECT, "Top")
			$W = DllStructGetData($tRECT, "Right") - DllStructGetData($tRECT, "Left")
            $H = DllStructGetData($tRECT, "Bottom") - DllStructGetData($tRECT, "Top")
			WinMove($hGui, "", $X + 8, $Y + 28, $W - 17, $H - 37)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc


Только тут есть один ньюанс, как все знают с помощью стиля $WS_SIZEBOX можно менять размер окна:

1. Чем больше тащить за край окна и увеличивать GUI в размерах, тем больше тупит скрипт
2. Если потянуть за левый - верхний край окна, то наблюдается не приятная картина около правого - нижнего края окна.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Viktor1703 сказал(а):
WM_NCHITTEST - перемещает окно если кликнули и тащат в любой части окна, а нужно сделать за заголовок то есть от Top окна и + 25...
Код:
Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Switch _WinAPI_DefWindowProc($hWnd, $iMsg, $wParam, $lParam)
				Case $HTCLIENT
					Local $Info = GUIGetCursorInfo($hForm)
					If (Not @error) And ($Info[1] < 25) Then
						Return $HTCAPTION
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST


Viktor1703 сказал(а):
Если потянуть за левый - верхний край окна, то наблюдается не приятная картина около правого - нижнего края окна.
Код:
Func WM_SIZING($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Local $Pos = _WinAPI_GetPosFromRect(DllStructCreate($tagRECT, $lParam))
			_WinAPI_UpdateLayeredWindowEx($hForm, $Pos[0], $Pos[1], _ComposeBitmap($Pos[2], $Pos[3]), 255, 1)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_SIZING
 
Верх