Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Flix

Пользователь


Сообщения: 98
Благодарности: 55

Профиль | Отправить PM | Цитировать


Если необходимо просто избавиться от дефекта, появляющегося на элементах с текстом фирмы и описания компонентов при использовании некоторых стилей SkinSharp, то вариант, предложенный K.A.V. можно намного упростить. Как мы уже выяснили ранее, данный дефект проявляется на элементах, у которых имеется свойство WS_DISABLED, т.е. говоря простым язык - элемент отключен.



Чтобы избавиться от дефекта, данные элементы необходимо включить, и тогда текст примет свойства заданные самой темой.

Включаем элемент с текстом фирмы (брандинг). В функции onGUIInit, перед командой применением стиля, указываем следующие команды:

Код: Выделить весь код
  ; Получаем дескриптор элемента управления с надписью бренда
  GetDlgItem $0 $HWNDPARENT 1028
  ; Включаем элемент управления (1- включить, 0- отключить)
  EnableWindow $0 1
Включаем элемент с описанием компонентов установки. Здесь необходимо добавить две функции перед страницей с выбором компонентов. Первая функция включит элемент при отображении диалога, а вторая будет включать элемент каждый раз при наведении курсора мышки на компоненты установки. Итак, указываем функции:

Код: Выделить весь код
  ; Функция включения элемента с описанием компонентов
  !define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
  ; Функция включения элемента с описанием компонентов при наведении курсора мышки
  !define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyleOnSel

  !insertmacro MUI_PAGE_COMPONENTS
А теперь код самих функций:

Код: Выделить весь код
# Функция включения стиля для элемента с описанием компонентов
Function ENABLEDStyle
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления 
  EnableWindow $1 1
FunctionEnd

# Функция включения стиля для элемента с описанием компонентов
# при наведении курсора мышки на компоненты установки
Function ENABLEDStyleOnSel
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления 
  EnableWindow $1 1
FunctionEnd
При этом строки с описанием компонентов можно оставить без изменений:

Код: Выделить весь код
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
Вот и все, при работе инсталлятора, например с темой 0011.she, указанного выше дефекта мы больше наблюдать не будем:



Полный код сценария (используется NSIS v3.0a2):
Код: Выделить весь код
# Поддержка Unicode
Unicode true

!include MUI.nsh
!include nsDialogs.nsh

!define PRODUCT_NAME "My application"
SetCompressor lzma
BrandingText "Nullsoft Scriptable Install System"

 
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit
 
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "License.txt"

; Функция включения элемента с описанием компонентов
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ENABLEDStyle
; Функция включения элемента с описанием компонентов при наведении курсора мышки
!define MUI_CUSTOMFUNCTION_ONMOUSEOVERSECTION ENABLEDStyleOnSel

!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
 
!insertmacro MUI_LANGUAGE "Russian"
 
Name "SkinH"
OutFile "setup_SkinH.exe"
InstallDir "$PROGRAMFILES\My application"
 
Section "Секция 1" SEC1
SectionEnd

Section "Секция 2" SEC2
SectionEnd

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
 
Function onGUIInit
  InitPluginsDir
  SetOutPath $PLUGINSDIR
  File "${NSISDIR}\Plugins\x86-unicode\SkinH.dll"
  File "${NSISDIR}\Contrib\Skins\0011.she"
  
  ; Получаем дескриптор элемента управления с надписью бренда
  GetDlgItem $0 $HWNDPARENT 1028
  ; Включаем элемент управления (1- включить, 0- отключить)
  EnableWindow $0 1

  ; При помощи функции SkinH_AttachEx загружаем файл стиля с именем 0011.she
  System::Call SkinH::SkinH_AttachEx(t'$PLUGINSDIR\0011.she')
 
#################### Patches for SkinSharp ####################
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
  IntOp $0 $0 + 0x0002CA98
  System::Call Kernel32::GetCurrentProcess()i.s
  System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
  System::Call "*$0(&i1 0)"
###############################################################
FunctionEnd

# Функция включения стиля для элемента с описанием компонентов
Function ENABLEDStyle
  ; Выполняем поиск окна
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления 
  EnableWindow $1 1
FunctionEnd

# Функция включения стиля для элемента с описанием компонентов
# при наведении курсора мышки на компоненты установки
Function ENABLEDStyleOnSel
  ; Выполняем поиск окна инсталлятора
  FindWindow $0 "#32770" "" $HWNDPARENT
  ; Получаем дескриптор элемента управления с описанием компонентов
  GetDlgItem $1 $0 1043
  ; Включаем элемент управления 
  EnableWindow $1 1
FunctionEnd

Function .onGUIEnd
  ; Удаление временной папки
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
  System::Call Kernel32::FreeLibrary(is)
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:27, 27-02-2014 | #1057