Что нового

Нужны советы в создании скиновой UDF

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Хочу написать UDF для полной замены оформления окна и его элементов, нуждаюсь в советах...

Пример: Aero

Чтобы довести до полной автоматики требуется решить 2 проблемы:
1. Указать каждому скину дефолтные значения такие как:

BkColor ; Цвет фона дочернего окна
Size ; координаты дочернего относительно предка
TitleColor ; Цвет текста в Title
Icon ; Координаты иконки окна

Как лучше это сделать, записать в сам файл скина или в самом скрипте прописать значения для каждого с проверкой, какой сейчас используется - на счёт 2го я думаю что это будет глупо, как быть, что ещё можно придумать?

2. Картинки на окно одеваются с помощью функции _WinAPI_UpdateLayeredWindowEx(), а это значит что на таком окне больше ни чего создать нельзя, клиентская часть окна сделана с помощью создания дочернего окна, вопрос, как сделать кнопки такие как 'Закрыть', 'Свернуть', 'Развернуть'? Создавать 3е окно?

Пока что эти 2 вопроса стопорят написание данной UDF.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703,
1. ИМХО, можно добавить в структуру $tagHEADER соответствующие значения.
2. ИМХО, можно нарисовать эти кнопки так же, как иконку. Я проверил на примере клика по иконке, у меня нормально работает.
Код:
;...
Global $hPart[9][3], $fClick
;...
While True
	_IconClick()
	Switch GUIGetMsg()
;...

Func _IconClick()
	Local $a_Cur = GUIGetCursorInfo($hForm)
	If @error Then Return
	If $a_Cur[0] > 1 And $a_Cur[0] < 19 And $a_Cur[1] > 1 And $a_Cur[1] < 19 Then
		If $a_Cur[2] Then
			If Not $fClick Then
				ConsoleWrite($a_Cur[0] & 'x' & $a_Cur[1] & @TAB & 'Mouse Down Icon' & @LF)
				$fClick = True
			EndIf
		Else
			If $fClick Then
				ConsoleWrite($a_Cur[0] & 'x' & $a_Cur[1] & @TAB & 'Mouse Up Icon' & @LF)
				$fClick = False
			EndIf
		EndIf
	Else
		$fClick = False
	EndIf
EndFunc   ;==>_IconClick
Только я еще в функции WM_NCHITTEST() изменил строку на
Код:
;...
If (Not @error And $Info[1] < 25 And $Info[0] > 18) Then
;...
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
ИМХО, можно добавить в структуру $tagHEADER соответствующие значения.

Если Вам не трудно, можете показать пример?

Если кнопки так же нарисовать на главном фоне, то тогда при выполнении действий над кнопками придётся полностью заменять весь фон :scratch:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703
Засунул в функцию WM_NCHITTEST() свой предыдущий код, у меня работает.
Код:
Func WM_NCHITTEST($hWnd, $iMsg, $wParam, $lParam)
	Switch $hWnd
		Case $hForm
			Switch _WinAPI_DefWindowProc($hWnd, $iMsg, $wParam, $lParam)
				Case $HTCLIENT
					Local $a_Cur = GUIGetCursorInfo($hForm)
					If Not @error Then
						If $a_Cur[1] < 25 And $a_Cur[0] > 18 Then
							$fClick = False
							Return $HTCAPTION
						ElseIf $a_Cur[0] > 1 And $a_Cur[0] < 19 And $a_Cur[1] > 1 And $a_Cur[1] < 19 Then
							If $a_Cur[2] Then
								If Not $fClick Then
									ConsoleWrite($a_Cur[0] & 'x' & $a_Cur[1] & @TAB & 'Mouse Down Icon' & @LF)
									$fClick = True
								EndIf
							Else
								If $fClick Then
									ConsoleWrite($a_Cur[0] & 'x' & $a_Cur[1] & @TAB & 'Mouse Up Icon' & @LF)
									$fClick = False
								EndIf
							EndIf
						Else
							$fClick = False
						EndIf
					EndIf
			EndSwitch
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703 [?]
можете показать пример?
Наверное, как-то так.
Код:
Global Const $tagHEADER = _
        'dword  Signature;' & _
        'dword  Version;' & _
        'dword  FileSize;' & _
        'dword  Count;' & _
		'dword  BkColor;' & _;
		'dword  TitleColor;' & _;
		'word  IconX;' & _;
		'word  IconY;' & _;
		'word  IconSize;' & _; и т.д.
        'dword  Reserved[4];' & _
        'wchar  Comment[128]'

Viktor1703 [?]
Если кнопки так же нарисовать на главном фоне, то тогда при выполнении действий над кнопками придётся полностью заменять весь фон
Вы же меняете его при изменении размеров.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Да, я так и делал, только как добавить туда данные... я добавлял так, кусок кода из _SkinSave
Код:
DllStructSetData($tHeader, 'Signature', 0x004B5341)
        DllStructSetData($tHeader, 'Version', 0x00000001)
        DllStructSetData($tHeader, 'FileSize', $Offset)
        DllStructSetData($tHeader, 'Count', $Count)
        DllStructSetData($tHeader, 'Comment', $sComment)
        DllStructSetData($tHeader, 'BkColor', 0xFFFFFF)


А считывал так:

Код:
Dim $Result[$Count + 1][3]
        $Result[0][0] = $Count
        $Result[0][1] = DllStructGetData($tHeader, 'Comment')
        $Result[0][2] = DllStructGetData($tHeader, 'BkColor')


И получается что массив будет состоять из множества колонок, в первом Item то есть:

Код:
0x0.....    1.png    0xFFFFFF    8    18    0x000000    25    6
0x0.....    2.png
0x0.....    3.png
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703 [?]
И получается что массив будет состоять из множества колонок
Объявите соответствующие переменные и читайте их значения из файла, раз они Вам в массиве не нужны. Или можно сделать отдельный массив с этими данными.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Ясно, спасибо, поэксперементирую :smile:
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Кому не сложно, протестируйте пожалуйста скин в Windows 7/Vista, в XP работает вроде без багов, огромное спасибо madmasles'у за этот пример.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Вообщем вот что получается на данный момент (черновик)

1. Работает медленно.
2. Если тянуть за левый или верхний край окна - так же появляются проблемы.

А так в принципе красиво :smile:

Есть идеи по упаковке ресурсов в отдельный файл скина при помощи Package UDF, все ресурсы можно добавлять в любом порядке, так же будет некий манифест скина в котором будут дефолтные значения для позиций элементов на скине, таких как иконка, title, кнопки Close Minimize Maximize, координаты клиентского окна относительно главного и т.д., так же в этом манифесте будет указываться имя ресурса или уникальный номер по которому ресурс будет доставаться из этого файла скина, вообщем то ни чего сложного нет, но пока что у меня в уме не складывается как организовать исходник правильно и нужно допилить то что уже есть
 
Верх