Что нового

Как восстановить тему оформления GUI?

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Допустим мы убрали тему у GUI:
Код:
#include <GUIConstantsEx.au3>
#include <APIConstants.au3>
#include <WinAPIEx.au3>

_WinAPI_SetThemeAppProperties($STAP_ALLOW_CONTROLS)

$hGUI = GUICreate("Test Script", 300, 200)
GUISetState(@SW_SHOW, $hGUI)

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


Как теперь восстановить стиль окна (тему оформления), каким он был до вызова _WinAPI_SetThemeAppProperties :scratch:?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
CreatoR [?]
Как теперь восстановить стиль окна (тему оформления)
Вот так у меня получилось.
Код:
#include <GUIConstantsEx.au3>
#include <APIConstants.au3>
#include <WinAPIEx.au3>
#include <SendMessage.au3>

HotKeySet("{F1}", "Restore")

_WinAPI_SetThemeAppProperties($STAP_ALLOW_CONTROLS)

$hGUI = GUICreate("Test Script", 300, 200)
GUISetState(@SW_SHOW, $hGUI)

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

Func Restore()
  _WinAPI_SetThemeAppProperties(BitOR($STAP_ALLOW_NONCLIENT, $STAP_ALLOW_CONTROLS, $STAP_ALLOW_WEBCONTENT))
  _SendMessage($hGUI, $WM_THEMECHANGED)
EndFunc



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

Вариант с контролом.
Код:
#include <GUIConstantsEx.au3>
#include <APIConstants.au3>
#include <WinAPIEx.au3>
#include <SendMessage.au3>

HotKeySet("{F1}", "Enable")
HotKeySet("{F2}", "Disable")

$hGUI = GUICreate("Test Script", 300, 200)
$Btn = GUICtrlCreateButton("button", 50, 50, 200, 100)
GUISetState(@SW_SHOW, $hGUI)

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

Func Enable()
  _WinAPI_SetThemeAppProperties(BitOR($STAP_ALLOW_NONCLIENT, $STAP_ALLOW_CONTROLS, $STAP_ALLOW_WEBCONTENT))
  _SendMessage($hGUI, $WM_THEMECHANGED)
  GUICtrlSendMsg($Btn, $WM_THEMECHANGED, '', '')
EndFunc

Func Disable()
  _WinAPI_SetThemeAppProperties("")
  _SendMessage($hGUI, $WM_THEMECHANGED)
  GUICtrlSendMsg($Btn, $WM_THEMECHANGED, '', '')
  GUISetState(@SW_HIDE, $hGUI)
  GUISetState(@SW_SHOW, $hGUI)
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
Вот так у меня получилось
Спасибо.

Вариант с контролом
Это будет проблема, т.к придётся для каждого элемента посылать сообщение.

И ещё, у меня этот трюк не работает с окном у которого тема была сброшена внешними средствами, в моём случае через отключение скина (используется SkinCrafter):
Код:
#include <SkinCrafter.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <APIConstants.au3>
#include <WinAPIEx.au3>
#include <SendMessage.au3>

_LoadSkinCrafter("SkinCrafterDll.dll");Load SkinCrafter DLL

$Form1 = GUICreate("Form1", 429, 311)
_InitializeSkinCrafter($Form1, "Skin.skf");Set skin
$Button1 = GUICtrlCreateButton("Exit", 50, 50, 50)
GUISetState(@SW_SHOW)

_ExcludeSkin($Form1)
_WinAPI_SetThemeAppProperties(BitOR($STAP_ALLOW_NONCLIENT, $STAP_ALLOW_CONTROLS, $STAP_ALLOW_WEBCONTENT))
_SendMessage($Form1, $WM_THEMECHANGED)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $Button1
			Exit
	EndSwitch
WEnd


видимо нужно было это сразу писать :whistle:...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
А как её закрыть, эту SkinCrafterDll.dll ?
Пробовал
Код:
DllClose($nSkinCrafterDll)
Но у меня AutoIt падает на фоне окна с применённой темой оформления.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
А как её закрыть, эту SkinCrafterDll.dll ?
Код:
DllCall($hSkinCrafter_DLL, "int:cdecl", "DeInitDecoration")
DllCall($hSkinCrafter_DLL, "int:cdecl", "RemoveSkin")
DllClose($hSkinCrafter_DLL)

Но это не помогает.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Ну, если GUI небольшой, то можно закрыть Dll и пересоздать.
В противном случае - узнать, что там автор Dll творит с окном :smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
InnI [?]
если GUI небольшой, то можно закрыть Dll и пересоздать
Это не вариант, мне нужно динамическое переключение скинов, пересоздавать родительское окно как то не кошерно :-X.

В противном случае - узнать, что там автор Dll творит с окном
Да вот найти бы его...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
А если так ?
Код:
#include <SkinCrafter.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <APIConstants.au3>
#include <WinAPIEx.au3>
#include <SendMessage.au3>

_LoadSkinCrafter("SkinCrafterDll.dll");Load SkinCrafter DLL

$Form1 = GUICreate("Form1", 429, 311)
_InitializeSkinCrafter($Form1, "Skin.skf");Set skin
$Button1 = GUICtrlCreateButton("Exit", 50, 50, 50)
GUISetState(@SW_SHOW)

Sleep(1000)
_ExcludeSkin($Form1)
Sleep(1000)
_WinAPI_SetWindowTheme($Form1)
_WinAPI_SetWindowTheme(GUICtrlGetHandle($Button1))

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE, $Button1
            Exit
    EndSwitch
WEnd

OffTopic:
Почему то у меня на Windows 7 домашняя расширенная с NVidia GTS250 библиотека SkinCrafterDll.dll не открывается. Пишет @error = 2. С чего бы это?
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
CreatoR
Написал скрипт для перебора ID контролов и спокоен :smile:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Medic84 [?]
Написал скрипт для перебора ID контролов и спокоен
Я то уже давно написал ;).
Но это лишняя обработка, занимает время (само по себе не много, но в совокупности с другими операциями, довольно ощутимо).

Кстати можно сделать так:

Код:
For $iCtrlID = 3 To _GUIGetLastCtrlID()
    _WinAPI_SetWindowTheme(GUICtrlGetHandle($iCtrlID))
Next

Func _GUIGetLastCtrlID()
	Local $aRet = DllCall("user32.dll", "int", "GetDlgCtrlID", "hwnd", GUICtrlGetHandle(-1))
	Return $aRet[0]
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
CreatoR [?]
Можно использовать старую версию 3.0, там ещё небыло надписи
Да, я читал. В архиве в той теме версия 3.1 и там тоже нет сплэш-окна. Но, как я уже сообщал, она у меня не открывается. А последняя версия работает нормально.


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

Всё. Разобрался.
Для работы библиотеки из архива той темы нужно дополнительно устанавливать пакет Microsoft Visual C++ 2005 Redistributable. А у меня стоял пакет 2008. Поэтому эта библиотека не открывалась, а с официального сайта - работала. Т.к. с сайта их две ставится: для 2005 и для 2008.
 
Верх