Что нового

Пнг-картинка на окно GUI, с ее выходом за пределы окна

radioamator16

Новичок
Сообщения
39
Репутация
0
Здравствуйте.
Нашел на форуме код добавления png-картинки на окно GUI.
Код:
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
#include <GUIConstants.au3>

$hGUI = GUICreate("PET", 0, 0, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW, $GUI_WS_EX_PARENTDRAG))
;GUISetBkColor(50)
_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\1.png")
$Width = _GDIPlus_ImageGetWidth($hImage)
$Height = _GDIPlus_ImageGetHeight($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
_Middle($hGUI, $Width, $Height)
$Pic = GUICtrlCreatePic("", 0, 0, $Width, $Height, -1, $GUI_WS_EX_PARENTDRAG)
_SetPNGIntoPicControl($Pic, @ScriptDir & "\1.png")
;$hLab_1 = GUICtrlCreateLabel("Text 1", 55, 20, 50, 20)
;$hLab_2 = GUICtrlCreateLabel("Text 2", 55, 53, 50, 20)
;$hLab_3 = GUICtrlCreateLabel("Text 3", 55, 86, 50, 20)
;$hLab_4 = GUICtrlCreateLabel("15.59 - 19/01/2014", 15, 110, 100, 20)

;GUICtrlSetFont($hLab_1, 10, 600, 0, "Tahoma")
;GUICtrlSetColor($hLab_1, 0xE1E100)
;GUICtrlSetBkColor($hLab_1, -2)
;GUICtrlSetFont($hLab_2, 10, 600, 0, "Tahoma")
;GUICtrlSetColor($hLab_2, 0xE1E100)
;GUICtrlSetBkColor($hLab_2, -2)
;GUICtrlSetFont($hLab_3, 10, 600, 0, "Tahoma")
;GUICtrlSetColor($hLab_3, 0xE1E100)
;GUICtrlSetBkColor($hLab_3, -2)
;GUICtrlSetFont($hLab_4, 7, 600, 0, "Tahoma")
;GUICtrlSetColor($hLab_4, 0xFFFFFF)
;GUICtrlSetBkColor($hLab_4, -2)
_WinAPI_SetLayeredWindowAttributes($hGUI, 50, 255)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch
WEnd
Func _Middle($win, $wd, $ht)
    Local $y = (@DesktopHeight / 2) - ($ht / 2)
    Local $x = (@DesktopWidth / 2) - ($wd / 2)
    WinMove($win, '', $x, $y, $wd, $ht)
EndFunc   ;==>_Middle

Func _SetPNGIntoPicControl($iPic, $sPNGFile)
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sPNGFile)
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _WinAPI_DeleteObject(GUICtrlSendMsg($iPic, 0x172, 0, $hBitmap))
    _WinAPI_DeleteObject($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
EndFunc   ;==>_SetPNGIntoPicControl

Как разместить так же - пнг-картинку на окно GUI, но чтобы пнг-картинка выходила за пределы окна на 20 пикселей (со всех сторон - сверху,снизу,справа,слева) ?
То есть картинка должна быть большего размера, чем само окно.
Можно такое сделать, или в autoit - в GUI можно что-то разместить лишь внутри окна ?
 

joiner

Модератор
Локальный модератор
Сообщения
3 338
Репутация
574
Только внутри, но можно создать второе окно. А зачем?
 
Автор
R

radioamator16

Новичок
Сообщения
39
Репутация
0
joiner сказал(а):
Только внутри, но можно создать второе окно. А зачем?
Чтобы красивее оформить окно. В VisualStudio такое можно делать, но там это довольно сложно.

Понятно.
А как тогда сделать комбинацию из двух окон (первое - основное, то которое есть сейчас. А второе - полностью невидимое, которое создается только для того чтобы вписать в него пнг) ?
Чтобы png - визуально выходила на 20 пикселей - за пределы основного окна)
 

joiner

Модератор
Локальный модератор
Сообщения
3 338
Репутация
574
смысл в чем? создаешь окно с картинкой нужных размеров. смысл во втором окне, которое полностью невидимо
 
Автор
R

radioamator16

Новичок
Сообщения
39
Репутация
0
joiner
Нужно чтобы было два окна - первое видимое.
А второе окно - должно быть вообще невидимо. И именно в этом невидимом окне размещается пнг-рисунок.

Проблема в том, что это второе невидимое окно Gui - должно быть больше основного окна на 20 пикселей (во все стороны).
Как это сделать ?
Чтобы одним скриптом - открывались сразу два окна, прикрепленных друг к другу и одно всегда невидимое и на 20 пикселей больше другого.
То есть сперва создается основное окно, а размеры второго - всегда высчитываются ориентируясь на размеры первого окна.
 

joiner

Модератор
Локальный модератор
Сообщения
3 338
Репутация
574
пример

Код:
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
#include <GUIConstants.au3>

$hGUI1 = GUICreate('Title', 250, 150 , -1, -1)
$pos = WinGetPos($hGUI1)
$hGUI = GUICreate("PET", 1 , 1 , -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW,$WS_EX_MDICHILD), $hGUI1)
GUISetBkColor(50)
$Pic = GUICtrlCreatePic("", 0, 0, $pos[2] + 40, $pos[3] + 40)
_SetPNGIntoPicControl($Pic, @ScriptDir & "\1.png")
WinMove($hGUI, '', $pos[0] -20, $pos[1] - 20, $pos[2] + 40, $pos[3] + 40)
_WinAPI_SetLayeredWindowAttributes($hGUI, 50, 255)
GUISetState(@SW_SHOW, $hGUI1)
GUISetState(@SW_SHOW, $hGUI)

While 1
    Switch GUIGetMsg()
        Case -3
            Exit
    EndSwitch
WEnd

Func _SetPNGIntoPicControl($iPic, $sPNGFile)
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sPNGFile)
    Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _WinAPI_DeleteObject(GUICtrlSendMsg($iPic, 0x172, 0, $hBitmap))
    _WinAPI_DeleteObject($hBitmap)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
EndFunc   ;==>_SetPNGIntoPicControl
 
Автор
R

radioamator16

Новичок
Сообщения
39
Репутация
0
joiner
Спасибо.

А как двигать мышкой это окно GUI ?
(В изначальном скрипте - можно было двигать окно.)
 

joiner

Модератор
Локальный модератор
Сообщения
3 338
Репутация
574
возможно так
вариант не идеален, но как пример :smile:
Код:
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
#include <GUIConstants.au3>

Global $hGUI1 = GUICreate('Title', 250, 150, -1, -1)
Local $pos = WinGetPos($hGUI1)
Global $hGUI = GUICreate("PET", 1, 1, -1, -1, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW, $WS_EX_MDICHILD), $hGUI1)
GUISetBkColor(50)
$Pic = GUICtrlCreatePic("", 0, 0, $pos[2] + 40, $pos[3] + 40, -1, $GUI_WS_EX_PARENTDRAG)
_SetPNGIntoPicControl($Pic, @ScriptDir & "\1.png")
WinMove($hGUI, '', $pos[0] - 20, $pos[1] - 20, $pos[2] + 40, $pos[3] + 40)
_WinAPI_SetLayeredWindowAttributes($hGUI, 50, 255)
GUISetState(@SW_SHOW, $hGUI1)
GUISetState(@SW_SHOW, $hGUI)
GUIRegisterMsg($WM_MOVING, "WM_MOVING")
While 1
	Switch GUIGetMsg()
		Case -3
			Exit
	EndSwitch
WEnd

Func WM_MOVING($hWnd, $Msg, $wParam, $lParam)
	; получает координаты сторон окна
	Local $sRect = DllStructCreate("Int[4]", $lParam)
	Local $left = DllStructGetData($sRect, 1, 1)
	Local $top = DllStructGetData($sRect, 1, 2)
;~ 	Local $Right = DllStructGetData($sRect, 1, 3)
;~ 	Local $bottom = DllStructGetData($sRect, 1, 4)
	If $hWnd = $hGUI Then
		Local $pos = WinGetPos($hGUI)
		WinMove($hGUI1, '', $pos[0] + 20, $pos[1] + 20)
	EndIf

	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVING

Func _SetPNGIntoPicControl($iPic, $sPNGFile)
	_GDIPlus_Startup()
	Local $hImage = _GDIPlus_ImageLoadFromFile($sPNGFile)
	Local $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	_WinAPI_DeleteObject(GUICtrlSendMsg($iPic, 0x172, 0, $hBitmap))
	_WinAPI_DeleteObject($hBitmap)
	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_Shutdown()
EndFunc   ;==>_SetPNGIntoPicControl
 
Автор
R

radioamator16

Новичок
Сообщения
39
Репутация
0
joiner
Понятно.
Но эти окна не единым целым создаются и это очень сильно проявляется при перетаскивании.

Какое-то странное моргание на окне появляется - когда его тащут.
Иногда если перетащить мышкой одно из окон - то оно вообще исчезает или начинает само по себе - летать по экрану (если перемещать окно, зажимая мышку).
А иногда эти окна сбиваются (как на рисунке).



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

Подскажите - как это можно поправить.
 

Вложения

Верх