Что нового

[Окна, Диалоги] Фоновая картинка перекрывает другие элементы GUI

ohos

Новичок
Сообщения
47
Репутация
0
Привет, у меня возникла сложность в использовании фоновой картинки стандартными функциями, в справке нашел
Код:
GUICtrlCreatePic
, в примерах меня заинтересовал 3, тот, что использует .png картинки, но добавив картинку в свою программу столкнулся с парой проблем:

1. стандартные элементы GUI созданные с помощью
Код:
GUICtrlCreateLabel


или

Код:
GUICtrlCreateProgress
вообще не видны, ушли под картинку
2. при сворачивании окна и разворачивании пропадает из видимости еще и кнопка созданная тоже стандартным способом
Код:
GUICtrlCreateButton
, появляется кнопка только если поверх её расположения провести курсор после разворачивания

как решить их?

Один из лейблов был создан с помощью расширения GUIFFLabel выложенного на этом форуме, этот лейбл показывается поверх картинки всегда, при разворачивании его перересовывает активация функции WM_ACTIVATE() по событию WM_ACTIVATE

пример вставки картинки в описанное выше приложение в аттаче, файлик GUIFFLabel2.au3 тоже приложил, весь код программы ниже

Код:
#NoTrayIcon
#include <Crypt.au3>
#include <Date.au3>
#include <GUIFFLabel2.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <Array.au3>

#include <GDIPlus.au3>
#Include <WinAPI.au3>

Opt("GUIOnEventMode", 1)
;---------------------------------------------------------- vars
;---------------------------------------------------------- 0xF0F0F0 серый
;---------------------------------------------------------- 0xACB8C4 желтый кажется

;---------------------------------------------------------- Self Update
;----------------------------------------------------------
;----------------------------------------------------------
$hWnd=GUICreate("тест окно",380,200)
; Load PNG image
_GDIPlus_StartUp()
$hImage   = _GDIPlus_ImageLoadFromFile("D:\Работа\проверятор - скрипты AutoIt\0.png")
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)

$Lbl1=GUICtrlCreateLabel("лейбл1",10,30,100,20,$SS_LEFT)
$Lbl2=GUICtrlCreateLabel("лейбл2",10,50,310,60,$SS_LEFT)
$hTimeSpendLbl = _GUICtrlFFLabel_Create($hWnd, "другой лейбл1", 10,90,110,20, 9, 'Times', 1, 0)
$Button = GUICtrlCreateButton("Однако кнопка",10,120,120,20)
$progressbar1 = GUICtrlCreateProgress(10, 150, 200, 20)


GUICtrlSetOnEvent(-1, "_Main_Events")

GUIRegisterMsg(0x0006 , "WM_ACTIVATE")
GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Main_Events")
GUISetState(@SW_SHOW)


Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
    _WinAPI_RedrawWindow($hWnd, 0, 0, $RDW_UPDATENOW)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
    _WinAPI_RedrawWindow($hWnd, 0, 0, $RDW_VALIDATE)
    Return $GUI_RUNDEFMSG
EndFunc

While 1
    Sleep(100)
	;типо главный цикл
WEnd

;---------------------------------------------------------- controll of interface
;----------------------------------------------------------
;----------------------------------------------------------

Func _Main_Events()
;~ 	consolewrite('событие_'&@GUI_CtrlId&@lf)
    Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
EndFunc

Func WM_ACTIVATE()
	sleep(100)
	_GUICtrlFFLabel_Refresh($hTimeSpendLbl)
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
ohos [?]
Задать элементу картинки отключённое состояние (Disabled):
Код:
GUICtrlSetState($nPic, $GUI_DISABLE)



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

В случае с png, можно попробовать как то так:

Код:
#NoTrayIcon
#include <Crypt.au3>
#include <Date.au3>
#include <GUIFFLabel2.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <Array.au3>

#include <GDIPlus.au3>
#include <WinAPI.au3>

Opt("GUIOnEventMode", 1)
;---------------------------------------------------------- vars
;---------------------------------------------------------- 0xF0F0F0 серый
;---------------------------------------------------------- 0xACB8C4 желтый кажется

;---------------------------------------------------------- Self Update
;----------------------------------------------------------
;----------------------------------------------------------

Global $Lbl1, $Lbl2, $Button

$hWnd = GUICreate("тест окно", 380, 200)
; Load PNG image

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\0.png")
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)

;~ $ret = GUICtrlCreatePic("D:\Работа\проверятор - скрипты AutoIt\1.bmp", 0, 0,380,200)
;~ _SetImageBinaryToCtrl($hWnd,"D:\Работа\проверятор - скрипты AutoIt\1.bmp")
;~ MsgBox(0,'создание картинки',$ret)

$hTimeSpendLbl = _GUICtrlFFLabel_Create($hWnd, "другой лейбл1", 10, 90, 110, 20, 9, 'Times', 1, 0)
$progressbar1 = GUICtrlCreateProgress(10, 150, 200, 20)
GUICtrlSetOnEvent(-1, "_Main_Events")

GUIRegisterMsg(0x0006, "WM_ACTIVATE")
GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Main_Events")

GUISetState(@SW_SHOW)

Func MY_WM_PAINT($hWnd, $Msg, $wParam, $lParam)
	_WinAPI_RedrawWindow($hWnd, 0, 0, $RDW_UPDATENOW)
	_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
	_WinAPI_RedrawWindow($hWnd, 0, 0, $RDW_VALIDATE)
	
	If $Lbl1 Then
		GUICtrlDelete($Lbl1)
		GUICtrlDelete($Lbl2)
	EndIf
	
	$Lbl1 = GUICtrlCreateLabel("лейбл1", 10, 30, 60, 20, $SS_LEFT)
	$Lbl2 = GUICtrlCreateLabel("лейбл2", 10, 50, 60, 20, $SS_LEFT)
	
	If $Button Then
		GUICtrlDelete($Button)
	EndIf
	
	$Button = GUICtrlCreateButton("Однако кнопка", 10, 120, 120, 20)
	GUICtrlSetState($Button, $GUI_FOCUS)
	
	Return $GUI_RUNDEFMSG
EndFunc

While 1
	Sleep(100)
	;типо главный цикл
WEnd

;---------------------------------------------------------- controll of interface
;----------------------------------------------------------
;----------------------------------------------------------

Func _Main_Events()
;~ 	consolewrite('событие_'&@GUI_CtrlId&@lf)
	Switch @GUI_CtrlId
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
EndFunc

Func WM_ACTIVATE()
	Sleep(100)
	_GUICtrlFFLabel_Refresh($hTimeSpendLbl)
EndFunc
 
  • Like
Реакции: Norm
Автор
O

ohos

Новичок
Сообщения
47
Репутация
0
задал, только $nPic заменил на $hImage, верно? не получилось
а вот со вторым вариантов вышло, благодарю, только вопрос - не будет ли последствий от частого пересоздания элементов GUI при сворачивании и разворачивании?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
ohos [?]
$nPic заменил на $hImage, верно?
Не верно, GUICtrlSetState работает со встроенными элементами, ведь о них же речь шла в начале.

не будет ли последствий от частого пересоздания элементов GUI при сворачивании и разворачивании?
Да не должно быть особо проблем.


P.S.
Но наверняка можно это обойти и другим способом, это я просто на скорую руку привёл пример.
 
Автор
O

ohos

Новичок
Сообщения
47
Репутация
0
Не верно, GUICtrlSetState работает со встроенными элементами, ведь о них же речь шла в начале.

пробовал оставить $nPic, автоит жалуется на отсутствие объявления этой переменной,
а картинка созданная через _GDIPlus... не вернет нужный хендл для передачи GUICtrlSetState?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
пробовал оставить $nPic, автоит жалуется на отсутствие объявления этой переменной,
Естественно, она же не используется, это был пример, типа ID а не дескриптор.

картинка созданная через _GDIPlus... не вернет нужный хендл для передачи GUICtrlSetState?
Нет, она вернёт дескриптор, а для GUICtrlSetState нужен ID.
 
Верх