Войти

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 [5] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

K.A.V.
19-01-2013, 01:05
K.A.V., а можно сделать в ToolTips перенос по строкам, чтобы все не в одну строчку было? »
Ну подставьте в строку символ $\n
В классическом тултипе не срабатывает переноска строк, в модерне переносит :)

kotkovets
19-01-2013, 01:07
Небольшой набросок тултипа, сделанный когда-то для личных нужд..
раз уж пошла такая пьянка...

MKN
19-01-2013, 10:36
Попытаюсь примерами "подогреть" интерес к 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
---
зы.
в моем примере уже автоматом добавляется это свойство тултипу

diakov
20-01-2013, 00:56
так при любом раскладе переносятся строки как нужно, при помощи символа - $\n »

Если применять к ToolTips::Modern то срабатывает, а если к ToolTips::Classic то нет...

kotkovets
20-01-2013, 11:39
Если применять к ToolTips::Modern то срабатывает, а если к ToolTips::Classic то нет... »
я не пользуюсь этим плагом - глючный...

diakov
20-01-2013, 12:22
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 делаем нужные действия...
под свои конкретные задачи скрипт переделать легко! действуй!

diakov
20-01-2013, 13:08
Благодарствую сейчас буду экспериментировать.

MKN
20-01-2013, 18:05
Применеие в 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 - все делает также, но только для "своих" страничек, данный код полезен только, если нужно сделать диалог на стандартных страничках.

MKN
20-01-2013, 21:31
kotkovets,
Подскажи пожалуйста - каким образом создать окно с рамкой, к примеру, для той же вставки текста ?
Пытался использовать для этого WS_BORDER и WS_DLGFRAME - без результата...

И такой вопрос - возможно ли поместить на странице отображение реального времени, т.е. попросту часы ?

Awral
20-01-2013, 22:57
Здравствуйте. Сделал файл 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 на всю ширину инсталлятора. Теперь не виден текст. Вопрос: как убрать эту картинку на задний план, чтобы был виден текст? »
текст добавлять по скрипту выше (раньше, команды выполняются последовательно), чем картинка..
как то так вкратце - важно последовательность действий

MKN
21-01-2013, 10:53
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 и что дальше??

Awral
21-01-2013, 22:52
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

Salmo
22-01-2013, 04:30
Добрый день... Есть ли возможность в NSIS создавать не модальные окна сообщений? Скрипт до распаковки совершает длительное действие над текстовым файлом в цикле, - как этот процесс визуально обозначить? Повесить на это время баннер или сообщение.




© OSzone.net 2001-2012