Что нового

GDI+ вставка png в GUI

Fever

Скриптер
Сообщения
308
Репутация
112
Здравствуйте, уважаемые участники форума.
Пишу вам с таким вопросом:
Есть некое layered окно, на нем необходимо нарисовать png изображение. Беда в том, что в GDI я не силен, поэтому прошу помощи у вас :suicide:

Код:
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#Include <WinAPIEx.au3>
#Include <Icons.au3>

Global $pName = "", _
$hImage[6][2]

Global $width = 180, $height = 80

$hImage[1][0] = "1.png"
$hImage[2][0] = "2.png"

_GDIPlus_Startup()
$hPng = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\" & $hImage[1][0])
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
_GDIPlus_BitmapDispose($hPng)

$hTrans = GUICreate($pName, 300, 100, -1, -1, $WS_POPUPWINDOW, $WS_EX_LAYERED)
$hForm = GUICreate($pName, $width, $height, -1, -1, $WS_POPUPWINDOW, $WS_EX_LAYERED, $hTrans)
GUISetBkColor(0xFF00DC)
$Pos = WinGetPos($hTrans)
WinMove($hForm, "", $Pos[0]+110, $Pos[1]+10)

_WinAPI_UpdateLayeredWindowEx($hTrans, $hBitmap, 225)
_WinAPI_SetLayeredWindowAttributes($hForm, 0xFF00DC)

GUIRegisterMsg($WM_MOVE, "WM_MOVE")
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")

_DrawImage()

GUISetState(@SW_SHOW, $hTrans)
GUISetState(@SW_SHOW, $hForm)

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

Func _DrawImage()
	Local $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND($hForm)
	Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphic1)
	Local $hGraphic2 = _GDIPlus_ImageGetGraphicsContext($hBitmap)

	Local $Image = _GDIPlus_BitmapCreateFromFile($hImage[2][0])
	Local $w = _GDIPlus_ImageGetWidth($Image)
	Local $h = _GDIPlus_ImageGetHeight($Image)

	_GDIPlus_GraphicsDrawImageRect($hGraphic2, $Image, 0, 0, $w, $h)

	_GDIPlus_GraphicsDispose($hGraphic2)
	_GDIPlus_GraphicsDispose($hGraphic1)
EndFunc

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

            Local $Pos = WinGetPos($hTrans)

            If IsArray($Pos) Then
                WinMove($hForm, '', $Pos[0]+110, $Pos[1]+10)
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    Switch $hWnd
        Case $hTrans
            Switch $iMsg
                Case $WM_NCHITTEST
                    Return $HTCAPTION
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST

обратите внимание на ф-цию _DrawImage что с ней не так? (честно, немного копипастил и что там делается не слишком понимаю :-[).
если можна оставьте к исправленной ф-ции пару комментариев, чтобы я понимал что и как, спасибо.
 
Автор
F

Fever

Скриптер
Сообщения
308
Репутация
112
в том то и дело, что используя библиотеку Yashied'a на полностью прозрачном окне, получается вот такая малина с изображением :-\
screenshoot_13__6_2_11_19_57_2__13_7984275_aefgilmnu7.png

а именно розовые края. если сделать окно не прозрачным, то этого не наблюдается :-\
 

SECTOR

Продвинутый
Сообщения
399
Репутация
59
Странно, у меня с этой библиотекой всё ок :scratch:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Fever, опишите лучше полностью свою задачу. Если это будет что-то вроде скиновой кнопки, то лучше рисовать ее динамически на фоне. Посмотрите, например, на этот калькулятор, там нет никаких элементов, только одно окно.
 
Автор
F

Fever

Скриптер
Сообщения
308
Репутация
112
Yashied, честно, перерыл Ваш исходник калькулятора с ног до головы, принцып так и не понял :(

если не затруднит, внесите маленькую поправочку в мой исходник, ещё, если можна, оставьте пару комментариев в коде, связаных с выводом изображения :-[

ниже приведен код этого "чуда", что на скрине :D
нужные картинки в архиве в 1 посте

Код:
#NoTrayIcon
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#Include <WinAPIEx.au3>
#Include <Icons.au3>

#Include "Skin.au3"

Global $pName = "", _
$hImage[6][2]

Global $width = 180, $height = 80

$hImage[1][0] = "1.png"
$hImage[2][0] = "2.png"

_GDIPlus_Startup()
$hPng = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\" & $hImage[1][0])
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hPng)
_GDIPlus_BitmapDispose($hPng)

$hTrans = GUICreate($pName, 300, 100, -1, -1, $WS_POPUPWINDOW, $WS_EX_LAYERED)
$hForm = GUICreate($pName, $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED, $hTrans)
GUISetBkColor(0xFF00DC)
$Pos = WinGetPos($hTrans)
WinMove($hForm, "", $Pos[0]+110, $Pos[1]+10)

$pic = GUICtrlCreatePic("", 10, 10, 16, 16)
_SetImage($pic, $hImage[2][0])

_WinAPI_UpdateLayeredWindowEx($hTrans, $hBitmap, 225)
_WinAPI_SetLayeredWindowAttributes($hForm, 0xFF00DC)

GUIRegisterMsg($WM_MOVE, "WM_MOVE")
GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")

GUISetState(@SW_SHOW, $hTrans)
GUISetState(@SW_SHOW, $hForm)

While 1
	_WinAPI_UpdateLayeredWindowEx($hTrans, $hBitmap, 225)

	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			_GDIPlus_Shutdown()
			Exit
	EndSwitch

	Sleep(5)
WEnd

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

            Local $Pos = WinGetPos($hTrans)

            If IsArray($Pos) Then
                WinMove($hForm, '', $Pos[0]+110, $Pos[1]+10)
            EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    Switch $hWnd
        Case $hTrans
            Switch $iMsg
                Case $WM_NCHITTEST
                    Return $HTCAPTION
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
 
Верх