Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
K.A.V., а можно сделать в ToolTips перенос по строкам, чтобы все не в одну строчку было? »
Ну подставьте в строку символ $\n
В классическом тултипе не срабатывает переноска строк, в модерне переносит :)
kotkovets
19-01-2013, 01:07
Небольшой набросок тултипа, сделанный когда-то для личных нужд..
раз уж пошла такая пьянка...
Попытаюсь примерами "подогреть" интерес к NSIS System Plug-in и в частности к функции CreateWindowEx .
Пример 1 : Создаём на странице окно и помещаем в это окно WebBrowser :
(можно просматривать страницы, как в интернете, так и локально обычные htm html )
!AddPluginDir ".\"
!include MUI2.nsh
Page custom fnc_Create
;!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Name "test2_CreateWindowEx"
Caption "test2 CreateWindowEx"
OutFile "test2_CreateWindowEx.exe"
Var dlg
Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
System::Call `*(i,i,i,i)i(1,34,200,100).R0`
System::Call `user32::MapDialogRect(i$HWNDPARENT,iR0)`
System::Call `*$R0(i.s,i.s,i.s,i.s)`
System::Free $R0
FindWindow $R0 "#32770" "" $HWNDPARENT
System::Call `user32::CreateWindowEx(i,t"STATIC",in,i${DEFAULT_STYLES}|${SS_GRAYFRAME},i1,i1,i400,i200,iR0,i1100,in,in)i.R0`
WebCtrl::ShowWebInCtrl $R0 "http://www.google.ru"
;или
;WebCtrl::ShowWebInCtrl $R0 "$EXEDIR\index.htm"
nsDialogs::Show
FunctionEnd
Section
SectionEnd
Коротко, что для чего :
Функция CreateWindowEx создает разнообразные окна с расширенным стилем для разнообразных объектов.
"STATIC" - (статический элемент) Обозначает простое текстовое поле, окно или прямоугольник, используемый для надписей, окно или другие отдельные органы управления.
Координаты и размеры окна в данном примере, меняются в значениях - i1,i1,i400,i200
Стиль прямоугольника окна можно изменять (в примере это ${SS_GRAYFRAME} Наглядно видно что происходит, если менять например, на SS.BLACKRECT , SS_GRAYRECT и т.д. , не подгружая WebCtrl ),
Можно задавать тип объекта (создать кнопку, чекбокс, тултип, картинку, область текста и др.. )
Функция MapDialogRect конвертирует (преобразует) заданные единицы измерения диалогового окна - в экранные единицы (пиксели).
Команда WebCtrl:: работает со специальной DLL (это модернизированный nsWeb плагин )
kotkovets
19-01-2013, 14:57
можно сделать в ToolTips перенос по строкам, чтобы все не в одну строчку было? »
Для того чтобы наша всплывающая подсказка была многострочной используем сообщение TTM_SETMAXTIPWIDTH, которое активизируем так:
!define TTM_SETMAXTIPWIDTH 0x418
Function .onMouseOverSection
${If} $0 = -1
killtip:
SendMessage $ttip ${TTM_ACTIVATE} 0 0
Return
${EndIf}
StrCpy $2 ""
${If} $ttip = 0
System::Call 'USER32::CreateWindowEx(i${WS_EX_TOPMOST},t"tooltips_class32",i,i${WS_POPUP},i,i,i,i,i0,i,i,i)i.r2'
StrCpy $ttip $2
SendMessage $ttip ${TTM_SETMAXTIPWIDTH} 0 0xFFFFFF
${EndIf}
Ну подставьте в строку символ $\n
В классическом тултипе не срабатывает переноска строк, в модерне переносит »
так при любом раскладе переносятся строки как нужно, при помощи символа - $\n
---
зы.
в моем примере уже автоматом добавляется это свойство тултипу
так при любом раскладе переносятся строки как нужно, при помощи символа - $\n »
Если применять к ToolTips::Modern то срабатывает, а если к ToolTips::Classic то нет...
kotkovets
20-01-2013, 11:39
Если применять к ToolTips::Modern то срабатывает, а если к ToolTips::Classic то нет... »
я не пользуюсь этим плагом - глючный...
kotkovets, есть такой вопрос...вот например мозила создает папку профиля вот так
С:\Users\Пользователь\AppData\Roaming\Mozilla\Firefox\Profiles\5z4z2uxh.default\
Тоесть у каждого индивидуальная папка 5z4z2uxh.default, возможно ли как то получить в переменную этот путь, скажем прочить путь входящего в папку файла или как такое можно провернуть? Чтобы при установке можно было дописать в нее некоторые файлы.
Например как в описаном K.A.V. методе...только получается что в моем случае путь задан неявно...
${GetParent} "C:\Program Files\Winamp\uninstwa.exe" $R0
$R0="C:\Program Files\Winamp"
kotkovets
20-01-2013, 13:02
diakov, а подумать?
например переменная $APPDATA при SetShellVarContext current возвращает такой путь:
Section
SetShellVarContext current
MessageBox MB_OK "$APPDATA\Mozilla\Firefox\Profiles" IDOK
SectionEnd
Вот уже есть путь к папке профиля Mozilla...
дальше просто в этой папке ищем папки по маске *uxh.default
OutFile test.exe
!include Logiclib.nsh
ShowInstDetails show
Function FindProfiles
MessageBox MB_OK "$APPDATA\Mozilla\Firefox\Profiles\$1" IDOK
FunctionEnd
Section
SetShellVarContext current
FindFirst $0 $1 "$APPDATA\Mozilla\Firefox\Profiles\*uxh.default"
${DoUntil} $1 == ""
Call FindProfiles
FindNext $0 $1
${Loop}
FindClose $0
SectionEnd
В функции FindProfiles делаем нужные действия...
под свои конкретные задачи скрипт переделать легко! действуй!
Благодарствую сейчас буду экспериментировать.
Применеие в NSIS функции CreateWindowEx
Пример 2. Размещение текста на странице.
StrCpy $R0 "Текст Текст Текст Текст"
FindWindow $0 "#32770" "" $HWNDPARENT
System::Call 'USER32::CreateWindowEx(i0,t "STATIC",t "$R0",i ${WS_CHILD}|${WS_VISIBLE},i140,i50,i200,i100,i $0,i222,i0,i0) $R2'
Этот пример малоинтересен для кастомной страницы, но полезен для стандартных страниц - для размещения текста в любом месте страницы.
Теперь, изменим создаваемый элемент управления (встроенного класса ) "STATIC" - на класс "EDIT"
EDIT (ОКНО РЕДАКТИРОВАНИЯ ТЕКСТА) - Окно, внутри которого пользователь может напечатать с клавиатуры текст. Пользователь дает ему фокус клавиатуры, инициируя мышью или перемещая в него, каретку путем нажатия клавиши ТАБУЛЯЦИИ (TAB).
Пользователь может вводить текст, когда окно редактирования текста отображает мигающую каретку
К знакомым уже стилям окна (WS_CHILD и WS_VISIBLE ) добавим WS_VSCROLL - для создания в окне вертикальной полосы просмотра (прокрутки) .
Ещё раз про установленные стили окна:
WS_CHILD - Дочернее окно.
WS_VISIBLE - Создается окно, которое сразу становится видимым. По умолчанию окна создаются невидимыми,
и для их отображения требуется вызывать функцию ShowWindow .
Установим следующие стили поля редактирования для класса EDIТ : ES_MULTILINE ES_WANTRETURN ES_AUTOVSCROLL
ES_MULTILINE - Многостроковое окно редактирования текста. По умолчанию - одностроковое окно.
ES_WANTRETURN - Определяет, чтобы код возврата каретки был вставлен тогда, когда пользователь нажимает клавишу ENTER при вводе текста в многострочное поле.
ES_AUTOVSCROLL - Автоматически перемещает текст вверх на одну страницу, при нажатии клавиши ENTER на последней строке.
В итоге сделаем на странице "кусочек" текстового редактора :
!include MUI2.nsh
Page custom fnc_Create
;!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
OutFile "test3_CreateWindowEx.exe"
Var dlg
Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
StrCpy $R0 "Текст Текст Текст Текст"
FindWindow $0 "#32770" "" $HWNDPARENT
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R0",i ${WS_VISIBLE}|${WS_CHILD}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL},i50,i100, i200,i60,i $0,i222,i0,i0) $R2'
nsDialogs::Show
FunctionEnd
Section
SectionEnd
В этом "псевдоредакторе" можно вызвать контестное меню для вставки , копирования и т.д., но не ясно как сохранять текст, точнее как передавать текст в скрипт, далее для обработки... У кого какие мысли по поводу ?
kotkovets
20-01-2013, 19:06
но не ясно как сохранять текст, точнее как передавать текст в скрипт, далее для обработки... У кого какие мысли по поводу »
Все уже давно придумано...
В создании диалога маленькая ошибка, что бы команда возвращала дескриптор окна в переменную $R2 нужно так:
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$R0",i ${WS_VISIBLE}|${WS_CHILD}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL},i50,i100, i200,i60,i $0,i222,i0,i0)i.R2'
ну далее пользуемся макросами nsDialogs:
${NSD_GetText} $R2 $R3
MessageBox MB_OK "$R3" IDOK
---
nsDialogs - все делает также, но только для "своих" страничек, данный код полезен только, если нужно сделать диалог на стандартных страничках.
kotkovets,
Подскажи пожалуйста - каким образом создать окно с рамкой, к примеру, для той же вставки текста ?
Пытался использовать для этого WS_BORDER и WS_DLGFRAME - без результата...
И такой вопрос - возможно ли поместить на странице отображение реального времени, т.е. попросту часы ?
Здравствуйте. Сделал файл win.bmp из папки NSIS\Contrib\Graphics\Wizard на всю ширину инсталлятора. Теперь не виден текст. Вопрос: как убрать эту картинку на задний план, чтобы был виден текст?
kotkovets
20-01-2013, 23:57
Пытался использовать для этого WS_BORDER и WS_DLGFRAME - без результата.. »
!define WS_BORDER 0x00800000
Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "Текст Текст Текст Текст",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
SendMessage $dlg ${WM_GETFONT} 0 0 $R9
SendMessage $R2 ${WM_SETFONT} $R9 0
nsDialogs::Show
FunctionEnd
константа WS_BORDER нигде не объявлена поэтому объявляем.. http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms632600(v=vs.85).aspx
константа DEFAULT_STYLES объявлена в nsDialogs.nsh, т.е достаточно прописать !include MUI2.nsh
---
FindWindow $0 "#32770" "" $HWNDPARENT - абсолютно ненужная здесь команда, дескриптор родительского окна в переменной $dlg
---
возможно ли поместить на странице отображение реального времени, т.е. попросту часы ? »
вполне... через таймер..
обновление..
к примеру в одну секунду...
!include MUI2.nsh
!include "FileFunc.nsh"
Page custom fnc_Create
!insertmacro MUI_LANGUAGE "English"
OutFile "test_time-timer.exe"
Var dlg
!define WS_BORDER 0x00800000
Function fnc_Create
nsDialogs::Create 1018
Pop $dlg
${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
System::Call 'user32::CreateWindowEx(i0,t "EDIT",t "$3 $4:$5:$6",\
i${DEFAULT_STYLES}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}|${ES_AUTOVSCROLL}|${WS_BORDER},\
i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
SendMessage $dlg ${WM_GETFONT} 0 0 $R9
SendMessage $R2 ${WM_SETFONT} $R9 0
${NSD_CreateTimer} OnTimer 1000
nsDialogs::Show
${NSD_KillTimer} OnTimer
FunctionEnd
Function OnTimer
${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
${NSD_SetText} $R2 "$3 $4:$5:$6"
FunctionEnd
Section
SectionEnd
Так как, созданному элементу таким способом присваивается системный шрифт - не очень красиво...
установим элементу шрифт родительского окна, сразу после создания диалога:
SendMessage $dlg ${WM_GETFONT} 0 0 $R9
SendMessage $R2 ${WM_SETFONT} $R9 0
kotkovets
21-01-2013, 00:18
Здравствуйте. Сделал файл win.bmp из папки NSIS\Contrib\Graphics\Wizard на всю ширину инсталлятора. Теперь не виден текст. Вопрос: как убрать эту картинку на задний план, чтобы был виден текст? »
текст добавлять по скрипту выше (раньше, команды выполняются последовательно), чем картинка..
как то так вкратце - важно последовательность действий
kotkovets, благодарю за примеры !
установим элементу шрифт родительского окна, сразу после создания диалога »
А каким образом указать на шрифт, не установленный (не устанавливая его) в системе ?
Для этого , вроде как можно использовать функцию AddFontResourceEx или AddFontMemResourceEx
Но как это применимо в NSIS ?
ps В дельфи это пытались сделать так : http://www.delphimaster.net/view/4-1136633780/all
а так вроде на си http://www.gamedev.net/topic/551900-using-fonts-in-directx-from-resource-files/
http://www.codeguru.com/cpp/g-m/gdi/fonthandlinganddetection/article.php/c16019/How-to-Use-a-Font-Without-Installing-It.htm
Painkiller
21-01-2013, 20:08
Народ, не подскажите как через nsis добавить апплет в установку удаления программ . Пример есть UninstallTool.cpl. Что с ним делать. Закинуть в sistem32 и что дальше??
kotkovets, спасибо. Переставил блок ;Image control после ;Text в файле Welcome.nsh. Теперь все отобразилось нормально. Но появилась проблема. Можно ли как нибудь убрать фон, который присутствует у текста?
Я так понимаю за цвет фона отвечает строка
SetCtlColors $mui.WelcomePage.Text "" "${MUI_BGCOLOR}"
в файле Welcome.nsh. Но вот как установить прозрачный фон я не знаю =(
kotkovets
21-01-2013, 23:52
в файле Welcome.nsh. Но вот как установить прозрачный фон я не знаю =( »
по моему так:
SetCtlColors $mui.WelcomePage.Text 0 transparent
Добрый день... Есть ли возможность в NSIS создавать не модальные окна сообщений? Скрипт до распаковки совершает длительное действие над текстовым файлом в цикле, - как этот процесс визуально обозначить? Повесить на это время баннер или сообщение.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.