Что нового

Как добавить png картинки на форму, которая является дочерним к другому окну

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Здравствуйте! возникла проблема с добавлением картинок, на форму , которая является дочерним к главному окну 1, когда я добавляю $WS_CHILD, png картинки не отображаются. Такая ситуация, что картинки будут уползать за экран: я создал главное окно 1, к нему создал дочернее окно 2 , которое расположено чуть выше, главного окна 1, в итоге , когда были не png картинки, при изменении их позиции, они уползали вверх, но не поверх главного окна 1, а как бы в нем, из-за того, что картинки привязаны к окну 2 , которое является дочерним к окну 1. Когда я добавляю картинки png картинки на дочернее окно 2 , они не отображаются, помогите пожалуйста.....
Код:
#Include <ComboConstants.au3>
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>
#include <WindowsConstants.au3>

Global Const $SC_DRAGMOVE = 0xF012
$hForm = GUICreate('hj', 1000, 600, 300, 300, $WS_OVERLAPPEDWINDOW )
GUISetState()
_GDIPlus_Startup()
$hPng = _GDIPlus_ImageLoadFromFile("C:\Users\Lilu\Desktop\Новая папка\70_1_154_220.png")
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
$hParent = GUICreate('', 1000, 300, 0,0, -1 ,  $WS_CHILD+$WS_EX_LAYERED+$WS_EX_TOPMOST,$hForm)
GUISetState()
_WinAPI_UpdateLayeredWindowEx($hParent, 500, 300 ,$hBitmap, 255, 10)
GUISetState()
_GDIPlus_ImageDispose($hPng)
_GDIPlus_Shutdown()
GUISetState($hParent)
;




$Button = GUICtrlCreateButton('Exit', 476, 150, 80, 23)

GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
WM_MOVE($hParent, $WM_MOVE, 0, 0)
GUISetState()
;GUISetState(@SW_SHOW, $hForm)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button
            Exit

    EndSwitch
WEnd

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hParent

            Local $Pos = WinGetPos($hParent)


    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE

Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd

        Case $hParent
            Return $HTCAPTION
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
Попробовал сделать так:
1)создал главное окно 1,
2)создал дочернее окно 2 ($WS_CHILD) , к окну 1.
3)создал окно 3 для добавления Png картинок и присвоил окну 3 ($WS_EX_MDICHILD) к окну 2
Итог: все равно не отображается картинка png
пс. если убрать ($WS_CHILD), то все работает, но мне он нужен, чтобы получился эффект уезжания картинки в главном окне за границы
Код:
#Include <ComboConstants.au3>
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>
#include <WindowsConstants.au3>

Global Const $SC_DRAGMOVE = 0xF012
$hForm = GUICreate('hj', 1000, 600,0, 0, $WS_OVERLAPPEDWINDOW )
GUISetState()
_GDIPlus_Startup()
$hPng = _GDIPlus_ImageLoadFromFile("C:\Users\Lilu\Desktop\Новая папка\70_1_154_220.png")
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
$hParent1 = GUICreate('', 1000, 300, -1,-1,$WS_CHILD ,$WS_EX_LAYERED+$WS_EX_TOPMOST,$hForm)
Global $K2 = GUICtrlCreatePic("C:\Users\Lilu\Desktop\3.jpg", 0, 0, 1100, 30)
GUISetState($hParent1)
$hParent = GUICreate('', 1000, 300, -1,-1,-1 ,$WS_EX_LAYERED+$WS_EX_TOPMOST+$WS_EX_MDICHILD,$hParent1)
GUISetState()

_WinAPI_UpdateLayeredWindowEx($hParent, 0, 0 ,$hBitmap, 255, 10)

_GDIPlus_ImageDispose($hPng)
_GDIPlus_Shutdown()

GUISetState()
;




$Button = GUICtrlCreateButton('Exit', 476, 150, 80, 23)

GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
WM_MOVE($hParent, $WM_MOVE, 0, 0)
GUISetState()
;GUISetState(@SW_SHOW, $hForm)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button
            Exit

    EndSwitch
WEnd

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hParent

            Local $Pos = WinGetPos($hParent)


    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE

Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd

        Case $hParent
            Return $HTCAPTION
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST


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

Yashied подскажи пожалуйста...


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

Ничего не получается, фухх, надо отдохнуть....
попробовал такой вариант
Код:
#include <GuiConstants.au3>
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>
#Include <GDIPlus.au3>
#Include <WinAPIEx.au3>

For $i = 0 To 3
  _ScreenCapture_Capture(@ScriptDir & "\TempScr" & $i & ".jpg", $i * 100, $i * 100, $i * 100 + 100, $i * 100 + 100)
Next

Global $aPics[4]

$GUI = GUICreate("",1000,500)
GUISetState()
;$a = GUICtrlCreatePic("C:\Users\Lilu\Desktop\3.jpg",0,0, 300,500)
	;GUICtrlSetState($a, $GUI_DISABLE)

GUISetState()


For $i = 0 To 3


	_GDIPlus_Startup()
$hPng = _GDIPlus_ImageLoadFromFile("70_1_283_395.png")
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
$hForm = GUICreate('', _GDIPlus_ImageGetWidth($hPng), _GDIPlus_ImageGetHeight($hPng), -1, -1, $WS_CHILD , $WS_EX_TOPMOST,$GUI)
 ; $aPics[$i] = GUICtrlCreatePic("70_1_283_395.png", 0, 0, 0, 0)
_WinAPI_UpdateLayeredWindowEx($hForm, -1, -1, $hBitmap, 255, 1)
_GDIPlus_ImageDispose($hPng)
_GDIPlus_Shutdown()
GUISetState()
	 GUICtrlSetState( $aPics[$i], $GUI_ENABLE)
Next


GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUISetState()

Do
Until GUIGetMsg() = -3

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    Switch $hWnd
        Case $hForm
            Return $HTCAPTION
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
ничего не получилось (( не хочет отображаться. с 9 утра до 16:00 еще не вылазил с компа...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
mmsgeorge
Во-первых, $WS_CHILD - это обычный стиль и его нельзя объединять с расширенными стилями $WS_EX_*.
Во-вторых, Extended Window Styles
[box]WS_EX_LAYERED 0x00080000
The window is a layered window. This style cannot be used if the window has a class style of either CS_OWNDC or CS_CLASSDC.
Windows 8: The WS_EX_LAYERED style is supported for top-level windows and child windows. Previous Windows versions support WS_EX_LAYERED only for top-level windows. [/box] Только на Win8 и выше этот стиль может быть применён к дочерним окнам. На Win10 ваш первый скрипт работает (я проверил), но начинаются проблемы с кнопкой - она не отображается.
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
InnI
а на windows 7, есть вариант как сделать.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
В оригинальной справке к функции _GDIPlus_BitmapCreateDIBFromBitmap() есть пример, в котором есть функция создания картинки из png _GUICtrlPic_Create(). Вот эта функция будет работать с вашим первым скриптом (проверил на Win7)
Код:
$hForm = GUICreate('hj', 1000, 600, 300, 300, $WS_OVERLAPPEDWINDOW )
$Button = GUICtrlCreateButton('Exit', 476, 150, 80, 23)
GUISetState()
$hParent = GUICreate('', 1000, 300, 0, 0, $WS_CHILD, -1, $hForm)
_GUICtrlPic_Create("111.png", 0, 0, -1, -1, -1, $GUI_WS_EX_PARENTDRAG)
GUISetState()
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
InnI
посмотрю, чуть попозже. ты мой спаситель! Благодарю!

InnI Получилось, кстати у меня в хелпе почему то нету этой функции. Теперь буду думать как расположить картинку на заднем фоне, чтобы она стала фоном, пока она перекрывает ту которая должна быть сверху.



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

InnI
непонятны некоторые вещи
Код:
Func _GUICtrlPic_Create($sFilename, $iLeft, $iTop, $iWidth = -1, $iHeight = -1, $iStyle = -1, $iExStyle = -1)
    _GDIPlus_Startup()
	$Pic1 = GUICtrlCreatePic("C:\Users\Lilu\Desktop\3.jpg", 0, 0,400,500)

	GUICtrlSetState($Pic1, $GUI_DISABLE); отключает картинку но drop drag работает
    Local $idPic = GUICtrlCreatePic("", $iLeft, $iTop, $iWidth, $iHeight, $iStyle, $iExStyle)
    Local $hBitmap = _GDIPlus_BitmapCreateFromFile($sFilename)
    If $iWidth = -1 Then $iWidth = _GDIPlus_ImageGetWidth($hBitmap)
    If $iHeight = -1 Then $iHeight = _GDIPlus_ImageGetHeight($hBitmap)
    Local $hBitmap_Resized = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
	;MsgBox(4096,"",$hBitmap_Resized)
    Local $hBMP_Ctxt = _GDIPlus_ImageGetGraphicsContext($hBitmap_Resized)
    _GDIPlus_GraphicsSetInterpolationMode($hBMP_Ctxt, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC)
    _GDIPlus_GraphicsDrawImageRect($hBMP_Ctxt, $hBitmap, 0, 0, $iWidth, $iHeight)
    Local $hHBitmap = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap_Resized)
    Local $hPrevImage = GUICtrlSendMsg($idPic, 0x0172, 0, $hHBitmap) ; $STM_SETIMAGE = 0x0172
    _WinAPI_DeleteObject($hPrevImage); Delete Prev image if any
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap_Resized)
    _GDIPlus_GraphicsDispose($hBMP_Ctxt)
    _WinAPI_DeleteObject($hHBitmap)
    _GDIPlus_Shutdown()

    Return $idPic
EndFunc   ;==>_GUICtrlPic_Create
1) _GDIPlus_GraphicsSetInterpolationMode($hBMP_Ctxt, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC) - что за $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC
2) Local $hPrevImage = GUICtrlSendMsg($idPic, 0x0172, 0, $hHBitmap) ; $STM_SETIMAGE = 0x0172 - что за ( 0x0172 , потом 0) ,что это делает?
И на каком этапе вставляется изображение?

3) Как сделать фон из картинки , под этой картинкой?



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

InnI
по поводу 3 пункта - ну подумав, пришел к выводу , что можно перерисовывать изображение на фоне (пока только так попробовал)
Добавив $Pic1 = GUICtrlCreatePic("C:\Users\Lilu\Desktop\3.jpg", 0, 0,400,500),
а потом меняя координаты в

Код:
_GUICtrlPic_Create("C:\Users\Lilu\Desktop\Новая папка\70_1_154_220.png", 120, 0, -1, -1, -1, $GUI_WS_EX_PARENTDRAG+$WS_EX_TOPMOST)
получаем что надо .. не получилось... картинка скачет и мерцает
Код:
Func _GUICtrlPic_Create($sFilename, $iLeft, $iTop, $iWidth = -1, $iHeight = -1, $iStyle = -1, $iExStyle = -1)
    _GDIPlus_Startup()
	$Pic1 = GUICtrlCreatePic("C:\Users\Lilu\Desktop\3.jpg", 0, 0,400,500)

	GUICtrlSetState($Pic1, $GUI_DISABLE)
    Local $idPic = GUICtrlCreatePic("", $iLeft, $iTop, $iWidth, $iHeight, $iStyle, $iExStyle)
    Local $hBitmap = _GDIPlus_BitmapCreateFromFile($sFilename)
    If $iWidth = -1 Then $iWidth = _GDIPlus_ImageGetWidth($hBitmap)
    If $iHeight = -1 Then $iHeight = _GDIPlus_ImageGetHeight($hBitmap)
    Local $hBitmap_Resized = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
	;MsgBox(4096,"",$hBitmap_Resized)
    Local $hBMP_Ctxt = _GDIPlus_ImageGetGraphicsContext($hBitmap_Resized)
    _GDIPlus_GraphicsSetInterpolationMode($hBMP_Ctxt, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC)
    _GDIPlus_GraphicsDrawImageRect($hBMP_Ctxt, $hBitmap, 0, 0, $iWidth, $iHeight)
    Local $hHBitmap = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap_Resized)
    Local $hPrevImage = GUICtrlSendMsg($idPic, 0x0172, 0, $hHBitmap) ; $STM_SETIMAGE = 0x0172
    _WinAPI_DeleteObject($hPrevImage); Delete Prev image if any
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap_Resized)
    _GDIPlus_GraphicsDispose($hBMP_Ctxt)
    _WinAPI_DeleteObject($hHBitmap)
    _GDIPlus_Shutdown()

    Return $idPic
EndFunc   ;==>_GUICtrlPic_Create


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

InnI
когда ручками перетаскиваю, ничего не моргает, но перетаскивается и фон, как менять положение этой картинки ума не приложу)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Для окна с неизменяемыми размерами
Код:
#include <WinAPISys.au3>
#include <GuiConstants.au3>
#include <ScreenCapture.au3>

_ScreenCapture_Capture("back.png", 1, 1, 1000, 600)
_ScreenCapture_Capture("111.png", 101, 101, 900, 400)

$hForm = GUICreate('Pic', 1000, 600, 300, 300, BitOR($GUI_SS_DEFAULT_GUI, $WS_CLIPCHILDREN, $WS_CLIPSIBLINGS))
$Pic1 = _GUICtrlPic_Create("back.png", 0, 0, 1000, 600)
GUICtrlSetState($Pic1, $GUI_DISABLE)
GUISetState()

$hParent = GUICreate('', 800, 300, 0, 0, $WS_CHILD, -1, $hForm)
_WinAPI_BringWindowToTop($hParent)
$Pic2 = _GUICtrlPic_Create("111.png", 0, 0, -1, -1, -1, $GUI_WS_EX_PARENTDRAG)
GUISetState()

Do
  Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
      Exit
    Case $GUI_EVENT_RESTORE
      _WinAPI_InvalidateRect($hParent)
  EndSwitch
Until 0

Func _GUICtrlPic_Create($sFilename, $iLeft, $iTop, $iWidth = -1, $iHeight = -1, $iStyle = -1, $iExStyle = -1)
    _GDIPlus_Startup()
    Local $idPic = GUICtrlCreatePic("", $iLeft, $iTop, $iWidth, $iHeight, $iStyle, $iExStyle)
    Local $hBitmap = _GDIPlus_BitmapCreateFromFile($sFilename)
    If $iWidth = -1 Then $iWidth = _GDIPlus_ImageGetWidth($hBitmap)
    If $iHeight = -1 Then $iHeight = _GDIPlus_ImageGetHeight($hBitmap)
    Local $hBitmap_Resized = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
    Local $hBMP_Ctxt = _GDIPlus_ImageGetGraphicsContext($hBitmap_Resized)
    _GDIPlus_GraphicsSetInterpolationMode($hBMP_Ctxt, $GDIP_INTERPOLATIONMODE_HIGHQUALITYBICUBIC)
    _GDIPlus_GraphicsDrawImageRect($hBMP_Ctxt, $hBitmap, 0, 0, $iWidth, $iHeight)
    Local $hHBitmap = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap_Resized)
    Local $hPrevImage = GUICtrlSendMsg($idPic, $STM_SETIMAGE, 0, $hHBitmap) ; $STM_SETIMAGE = 0x0172
    _WinAPI_DeleteObject($hPrevImage); Delete Prev image if any
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($hBitmap_Resized)
    _GDIPlus_GraphicsDispose($hBMP_Ctxt)
    _WinAPI_DeleteObject($hHBitmap)
    _GDIPlus_Shutdown()
    Return $idPic
EndFunc   ;==>_GUICtrlPic_Create
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
InnI
Все работает, правда некоторых функций нету в хелпе
1) _WinAPI_BringWindowToTop($hParent) - понял что выставляет порядок окна
2) _WinAPI_InvalidateRect($hParent) - что делает она?
я по прежнему не знаю , как менять положение картинки, ну с помощью кода ...
Код:
WinMove($hParent, "", 100, 100)


Проблема: Пропадает прозрачность,но все это делалось ради прозрачности.

+ чтобы окно для картинки подстраивалось под ее размеры пришлось добавить такую штуку
Код:
_GDIPlus_Startup()
Local $hBitmap = _GDIPlus_BitmapCreateFromFile("C:\Users\Lilu\Desktop\Новая папка\70_1_154_220.png")
$iWidth = _GDIPlus_ImageGetWidth($hBitmap)
$iHeight = _GDIPlus_ImageGetHeight($hBitmap)
_GDIPlus_BitmapDispose($hBitmap)

$hParent = GUICreate('', $iWidth, $iHeight, 0, 0, $WS_CHILD, -1, $hForm)
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
mmsgeorge
некоторых функций нету в хелпе
Все эти функции есть в оригинальной английской справке, поставляемой в комплекте с AutoIt 3.3.14.2.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
mmsgeorge
с прозрачностью как сделать?
Мои познания в области GDI+ несколько ограничены. И данный вопрос выходит за рамки этой области.
 
Автор
M

mmsgeorge

Новичок
Сообщения
96
Репутация
0
weweWe45s
это все хорошо, правда при перемещении происходит мигание картинки, как убрать? пробовал $WS_CLIPCHILDREN + $WS_CLIPSIBLINGS , но тогда кажется пропадает частичная прозрачность..
 

weweWe45s

Новичок
Сообщения
36
Репутация
1
тут к сожалению не знаю чем помочь (
upd http://autoit-script.ru/index.php?topic=11356.msg74668#msg74668
 
A

Alofa

Гость
mmsgeorge сказал(а):
InnI
а с прозрачностью как сделать?
Несовсем понятно о какой прозрачности идет речь (толи это дополнительная картинка имеет альфа-канал, толи ее всю нужно сделать прозрачной, толи фон должен быть прозрачным).
Пока посмотрите эти функции и примеры к ним:
Код:
WinSetTrans()
_WinAPI_SetLayeredWindowAttributes()
_GDIPlus_ImageAttributesSetColorKeys() ; http://autoit-script.ru/autoit3_docs/ARC_Curve_Black/userfunctions/_GDIPlus_ImageAttributesSetColorKeys.htm
 
Верх