Цитата Kopejkin:
Какой дескриптор у текста "Position your mouse over a component to see its description" »
|
Переходим в папку
\NSIS\Contrib\UIs и открываем
modern.exe программой для просмотра ресурсов (ResHacker, Restorator и т.д.)
Ищем диалог, в котором располагается искомый элемент, в нашем случае это диалог
104 - выбор компонентов
Ищем нужный нам элемент и смотрим его ID -
1043
Теперь, чтобы выполнить взаимодействие с данным элементом при работе графического интерфейса инсталлятора (убрать/присвоить стиль, поменять текст/цвет и т.д.) - нам нужно узнать его дескриптор, дескриптор своего рода уникальный идентификатор каждого элемента в графическом интерфейсе любой программы, надеюсь, понятно объяснил, если что - гугл
Чтобы узнать этот самый дескриптор, нам нужно знать ID элемента, который прописан в UI файле (мы уже узнали, это
1043)
Но т.к. наш элемент находится в дочернем окне графического интерфейса ("внутри основного", посмотрите диалоги в ресурсах и всё поймёте), нам нужно сделать немножко другие манипуляции.
Теперь в коде выполняем команду:
Код:
GetDlgItem $0 $HWNDPARENT 1043
$0 - переменная, куда будет поммещен дескриптор элемента с ID 1043
$HWNDPARENT - дескриптор окна инсталлятора
1043 - соответственно, ID элемента, дескрпитор которого нам нужно узнать
Это пример получения дескриптора элемента по идентификатору в ресурсах диалога
Чтобы удалить стиль конкретно обсуждаемый "WS_DISABLED", нужно выполнить команду:
Код:
${NSD_RemoveStyle} $0 0x08000000L
где
$0 - дескриптор элемента, у которого удаляем стиль
0x08000000L - даёт понять команде, какой стиль удалять, в нашем случае это "
WS_DISABLED"
Цитата Kopejkin:
При использовании скинов SkinSharp ваш способ не окрашивает текст в красный (серый), а дает возможность отображаться тексту "Nullsoft Install System"цветом других текстов скина. В окнах обычного инсталлятора (без скинов) текст окрашивается. »
|
И не удивительно, ведь "скин сам решает" и устанавливает свои цвета, точно также реализовано и в "NSIS SkinCrafter" плагине, при его использовании нельзя установить цвета на текст, для этого и были созданы скины...
Теперь о проблеме...Посидел, посмотрел, выводы такие:
Если вы хотите изменить цвет текста описания компонентов, то вы должны указать и цвет фона для этого текста, иначе получите глюки при отображении описаний (возможно, решаемо, но не хочу копаться
)
Если цвет текста изменять не надо - будет дефолтный цвет (черный по-умолчанию, ну, в зависимости от настроек темы оформления и т.д.)
Т.к. речь идёт о кастомизации интерфейса, то делаю вывод, что цвет текста всё-таки менять нужно, иначе получится не очень привлекательно
реализовать можно так:
1. Если нужно просто убрать стиль на элемент описания, то воспользуйтесь примером из пункта 3, удалив те участки кода в моих примерах, которые выделены жирным шрифтом
Сдеюущие примеры для того, чтобы убрать стиль и назначить цвет текста и фона элементу описания секций
2. Не красиво, нужно редактировать главный файл настроек интерфейса MUI, но удобно назначать описания секциям, не внося никаких изменений в главный файл скрипта вашего инсталлятора
Можно, например, просто скопировать указанный ниже файл и в ту же папку и изменить его имя, и за место
Код:
!include "mui.nsh"
прописать
Код:
!include "C:\Program Files\NSIS\Contrib\Modern UI\My_System.nsh"
Открываем файл: \NSIS\Contrib\Modern UI\System.nsh
Ищем
читать дальше »
Код:
!macro MUI_DESCRIPTION_BEGIN
FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043
StrCmp $0 -1 0 mui.description_begin_done
SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:"
EnableWindow $MUI_TEMP1 0
SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$MUI_TEXT"
Goto mui.description_done
mui.description_begin_done:
!macroend
Закомменитруем строку
EnableWindow $MUI_TEMP1 0, которая делает элемент с текстом описания неактивным
читать дальше »
Код:
!macro MUI_DESCRIPTION_BEGIN
FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043
StrCmp $0 -1 0 mui.description_begin_done
SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:"
; EnableWindow $MUI_TEMP1 0
SendMessage $MUI_TEMP1 ${WM_SETTEXT} 0 "STR:$MUI_TEXT"
Goto mui.description_done
mui.description_begin_done:
!macroend
Ищем:
читать дальше »
Код:
Function "${SHOW}"
!insertmacro MUI_INNERDIALOG_TEXT 1042 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}"
FindWindow $MUI_TEMP1 "#32770" "" $HWNDPARENT
GetDlgItem $MUI_TEMP1 $MUI_TEMP1 1043
EnableWindow $MUI_TEMP1 0
!insertmacro MUI_INNERDIALOG_TEXT 1043 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
StrCpy $MUI_TEXT "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
!insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
FunctionEnd
Меняем на:
читать дальше »
Код:
Function "${SHOW}"
!insertmacro MUI_INNERDIALOG_TEXT 1042 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE}"
FindWindow $MUI_TEMP2 "#32770" "" $HWNDPARENT
GetDlgItem $MUI_TEMP1 $MUI_TEMP2 1043
SetCtlColors $MUI_TEMP1 "0xFF0000" "0xFFFFFF" ; Элемент текста описания, Красныйй цвет текста на белом фоне
GetDlgItem $MUI_TEMP1 $MUI_TEMP2 1042
SetCtlColors $MUI_TEMP1 "" "0xFFFFFF" ; Ставим белый фон на слово "Описание", элемент рамки, цвет текста не меняется
!insertmacro MUI_INNERDIALOG_TEXT 1043 "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
StrCpy $MUI_TEXT "${MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO}"
!insertmacro MUI_PAGE_FUNCTION_CUSTOM SHOW
FunctionEnd
3. Второй способ. Изменения вносятся только в ваш скрипт инсталлятора. Из плюсов - не нужно редактировать главный файл настроек MUI интерфейса. Минусы - нужно будет писать собственную функцию обработки показа описаний и нужно назначать описания секциям по порядковым номерам начиная с 0, т.е. в том порядке, в каком они прописаны в вашем скрипте.
Для начала
читать дальше »
Код:
!insertmacro MUI_PAGE_WELCOME
!define MUI_PAGE_CUSTOMFUNCTION_SHOW RemoveDISABLEDStyle_Description
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
Функция
читать дальше »
Код:
Function RemoveDISABLEDStyle_Description
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $1 $0 1043
${NSD_RemoveStyle} $1 0x08000000L
SetCtlColors $1 "0xFF0000" "0xFFFFFF" ; Красныйй цвет текста на белом фоне
GetDlgItem $1 $0 1042
SetCtlColors $1 "" "0xFFFFFF" ; Ставим белый фон на слово "Описание", элемент рамки, цвет текста не меняется
FunctionEnd
Пример двух секций с присвоением им описаний + функция для обработки показа описаний
читать дальше »
Код:
Section "Первая секция"
SectionEnd
Section "Вторая секция"
SectionEnd
Function .onMouseOverSection
FindWindow $R0 "#32770" "" $HWNDPARENT
GetDlgItem $R0 $R0 1043
StrCmp $0 -1 "" +2
SendMessage $R0 ${WM_SETTEXT} 0 "STR:$(MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO)" ; текст "Наведите курсор мыши на название компонента, чтобы прочесть его описание." в зависимости от языка графического интерфейса
StrCmp $0 0 "" +2
SendMessage $R0 ${WM_SETTEXT} 0 "STR:Описание первой секции"
StrCmp $0 1 "" +2
SendMessage $R0 ${WM_SETTEXT} 0 "STR:Описание второй секции"
FunctionEnd
При использовании второго метода не забудьте удалить старые строки описаний компонентов, типа таких:
читать дальше »
Код:
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "Описание первой секции"
!insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "Описание второй секции"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
вроде ничего не забыл