Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Ответить
Настройки темы
.: NSIS - все вопросы :. часть 2.

Аватара для kotkovets

Ветеран


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


Конфигурация

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


Изменения
Автор: kotkovets
Дата: 07-06-2020
Описание: NSIS 3.05


Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения.


Описание:
читать дальше »
NSIS (Nullsoft Scriptable Install System) - профессиональная система для создания инсталляторов в среде Windows с октрытым исходным кодом. При своем малом размере система очень гибкая, и при с широкими возможностями. Генерируемый ею инсталлятор также имеет очень маленький размер и идеально подходит для распространения продукта через Интернет.


Текущая версия: NSIS 3.05 от 15 декабря 2019 года
Скачать | Архив сборок версии

Первая часть этой темы
Скачать первую часть этой темы одним архивом

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.
Руководство пользователя. Перевод – Поляков А.В, зеркало

Документация

Утилиты разработчика
Расширение функциональности

Примеры скриптов на нашем форуме
Скрипт NSIS для перепаковки AIMP2+Сборки
Тема для Notepad++(пример парсинга XML)

Достоинства
читать дальше »


◦ Очень маленький размер установочного блока (около 34 Кбайт)
◦ zlib, bzip2 и LZMA-сжатие
◦ Гибкая система скриптов (спецально разработанная для инсталляторов)
◦ Поддержка многоязычности, точнее 53 языка, есть возможность ввода нового языка
◦ Поддержка плагинов
◦ Скрипт Препроцессор
◦ Создание Web-инсталляторов


Ещё немного полезной информации:
читать дальше »

▫ История создания установщика

NSIS создан как альтернатива InstallShield, предназначенного для коммерческих продуктов.

NSIS был создан для распространения Winamp. Он базируется на предыдущем продукте Nullsoft — PiMP (plugin Mini Packager), иначе известным как SuperPiMP. После версии 2.0a0, проект был перемещён на SourceForge.net, где к работе над ним присоединились и сторонние разработчики. NSIS 2.0 был выпущен в свет 2 года спустя.

NSIS версии 1 был очень похож на классический Windows Installer, но он был более управлемым с помощью скриптов и поддерживал другие форматы сжатия. NSIS версии 2 поддерживает новый графический интерфейс пользователя, LZMA-сжатие, многоязычность и имеет хорошую систему плагинов.

Версия 2.01 была первой версией, поддерживающей компиляцию на любой из POSIX-платформ. Это позволило создавать Windows-инсталляторы на GNU/Linux и FreeBSD без использования эмулятора Wine. На данный момент поддерживается компиляция только для Windows.

▫ Описание

Компилятор NSIS — программа makensis — компилирует скрипты в исполняемый код. Каждая строчка скрипта содержит одну команду. Пример:
Код: Выделить весь код
 # Пример скрипта
 Name "Example1"
 OutFile "example1.exe"
 InstallDir "$PROGRAMFILES\Example1"
 Page Directory
 Page InstFiles
 Section
   SetOutPath $INSTDIR
   File ..\makensis.exe
 SectionEnd

Modern User Interface

В версии 2.0 был введён новый графический интерфейс пользователя, названный Modern UI (MUI). MUI очень похож на интерфейс мастеров, он поддерживает splash screen, выбора языка, выбор компонентов для установки и более широкие возможности настройки по сравнению со своим предшественником. Пример:
Код: Выделить весь код
 # Пример скрипта с Modern UI
 !include MUI.nsh
 Name "Example 2"
 OutFile Example2.exe
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "license.rtf"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "German"
 !insertmacro MUI_LANGUAGE "French"
 Section "Extract makensis"
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd
NSIS может быть расширен при помощи плагинов, которые могут быть написаны на C++, Си, и Delphi. Плагины могут быть использованы для улучшения функциональности и интерфейса инсталлятора. Плагины могут быть вызваны в любой части кода NSIS скрипта.

С пакетом NSIS поставляются несколько плагинов, позволяющих добавлять новые страницы, заменять фоновые изображения, скачивать файлы из Интернета, выполнять математические вычисления, обновлять файлы и многое другое.

▫ Программы, использующие NSIS


◦ Антивирус Касперского
◦ Qip
◦ 3DNA Desktop
◦ 7-Zip
◦ ATI Display Driver
◦ CDex
◦ Dev-C++
◦ DivX
◦ eMule FileZilla
◦ Google Picasa
◦ Google Talk
◦ Intel C (компилятор)
◦ IrfanView
◦ LightAllow
◦ LyX
◦ Miranda IM Mozilla Firefox 2.0
◦ NASA World Wind
◦ Notepad++
◦ OpenOffice.org для Windows
◦ Pidgin
◦ VLC Player
◦ Winamp

▫ Чем я могу распаковать инсталлятор, созданный в NSIS?

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:02, 09-12-2012

 

Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


MKN, как вариант с 2-ым диалогом могу предложить такое решение, добавить эффект исчезания, а потом появления
Т.к. вроде бы, функция анимации создаёт саму анимацию именно в действии, т.е. если окно уже показано, то к нему нельзя применить эффект опять появления
Сначала скрываем, а потом показываем, впринципе так даже получше будет мне кажется
Код: Выделить весь код
!define AW_HOR_POSITIVE 0x00000001 
!define AW_HOR_NEGATIVE 0x00000002 
;!define AW_VER_POSITIVE 0x00000004 
;!define AW_VER_NEGATIVE 0x00000008
!define AW_CENTER 0x00000010 
!define AW_HIDE  0x00010000 
!define AW_ACTIVATE 0x00020000 
!define AW_SLIDE 0x00040000 
!define AW_BLEND        0x00080000 

Function Cancel
    System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_POSITIVE}|${AW_HIDE})`
FunctionEnd
!define MUI_CUSTOMFUNCTION_ABORT Cancel

Function .onInstSuccess 
    System::Call `user32::AnimateWindow(i$HWNDPARENT,i1000,i${AW_BLEND}|${AW_HIDE})`
FunctionEnd 

!include MUI2.nsh
;!include "FileFunc.nsh"
;!include "LogicLib.nsh"
;!include "WinMessages.nsh"

Page custom page1
Page custom page2
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "test_window_move.exe"
Var dlg
!define WS_BORDER 0x00800000

Function page1
nsDialogs::Create 1018
Pop $dlg
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому окну позарез надо применить AnimateWindow ",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'

SendMessage $dlg ${WM_GETFONT} 0 0 $R9
SetCtlColors $R2 `0x0000FF` `0x99FFFF`

System::Call `user32::AnimateWindow(i$dlg,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`
 

nsDialogs::Show
FunctionEnd

Function page2
call MyFunc
nsDialogs::Create 1018
Pop $dlg
# Для видимости перелистывания диалога
 ${NSD_CreateCheckbox} 25u 27u 68u 14u "checkbox"
 ${NSD_CreateLabel} 0 5u 100u 10u "sdfsdfsdf" 
#
nsDialogs::Show
FunctionEnd

Function MyFunc
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_NEGATIVE}|${AW_HIDE})`
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_POSITIVE}|${AW_ACTIVATE})`
FunctionEnd

Section
SectionEnd
Цитата MKN:
И как быть , если созданных окон несколько ? »
Подставлять handle другого окна в вызов функции, не?

Цитата MKN:
Только цвет теперь в созданном окне пропадает после анимации... »
поменяйте местами вызов функции анимации с присваением цвета, выделил жирным

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]


Отправлено: 17:40, 29-01-2013 | #151



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


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


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

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


Цитата MKN:
И как быть , если созданных окон несколько и к каждому надо применить свою анимацию и цвет ? »
Тогда будет правильней записать строку так :
Код: Выделить весь код
System::Call `user32::AnimateWindow(i$R2,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`
это для созданного окна функцией CreateWindowEx в вашем случае.

Отправлено: 17:42, 29-01-2013 | #152

MKN MKN вне форума

Ветеран


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

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


K.A.V.,
Действительно, оригинально получается (как затвор передёргивается )
С цветом уже понял...

Цитата profcom:
Тогда будет правильней записать строку так : »
А вот с $R2 я начинал и выглядит это логично, но номер этот почему то не проходит... Нет анимации...

Отправлено: 17:42, 29-01-2013 | #153


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


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

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


Цитата MKN:
А вот с $R2 я начинал и номер этот почему то не проходит... Нет анимации... »
У меня проходит, увеличь время показа с 500 до 2500 например и будет нагляднее.

Отправлено: 17:46, 29-01-2013 | #154

MKN MKN вне форума

Ветеран


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

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


Цитата profcom:
увеличь время показа с 500 до 2500 например и будет нагляднее. »
Не получается - просто появляется окно с небольшой задержкой без анимации... Интересно, почему так у меня ?
При таком нехорошем раскладе, как менять хэндлы созданных окон для анимации, если их будет несколько на одной странице ?

Последний раз редактировалось MKN, 29-01-2013 в 18:18.


Отправлено: 17:50, 29-01-2013 | #155


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


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

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


Цитата MKN:
При таком нехорошем раскладе, как менять хэндлы созданных окон для анимации, если их будет несколько на одной странице ? »
Смари сюда

Создаём ещё одно такое же "окошко" выше первого:

Код: Выделить весь код
System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому AnimateWindow ",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i10,i200,i60,i$dlg,i223,i0,i0) i.R2'
ShowWindow $R2 0
System::Call `user32::AnimateWindow(i$R2,i1000,i${AW_SLIDE}|${AW_VER_NEGATIVE}|${AW_ACTIVATE})`
Затем, мы делаем элемент скрытым командой ShowWindow, т.к. AnimateWindow не сработает, если мы попытаемся показать элемент, который уже показан
И потом только мы прописываем вызов функции анимации на созданный элемент

Как-то так


Полный код:
читать дальше »

Код: Выделить весь код
!define AW_HOR_POSITIVE 0x00000001 
!define AW_HOR_NEGATIVE 0x00000002 
!define AW_VER_POSITIVE 0x00000004 
!define AW_VER_NEGATIVE 0x00000008
!define AW_CENTER 0x00000010 
!define AW_HIDE  0x00010000 
!define AW_ACTIVATE 0x00020000 
!define AW_SLIDE 0x00040000 
!define AW_BLEND        0x00080000 

Function Cancel
    System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_POSITIVE}|${AW_HIDE})`
FunctionEnd
!define MUI_CUSTOMFUNCTION_ABORT Cancel

Function .onInstSuccess 
    System::Call `user32::AnimateWindow(i$HWNDPARENT,i1000,i${AW_BLEND}|${AW_HIDE})`
FunctionEnd 

!include MUI2.nsh
;!include "FileFunc.nsh"
;!include "LogicLib.nsh"
;!include "WinMessages.nsh"

Page custom page1
Page custom page2
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "test_window_move.exe"
Var dlg
!define WS_BORDER 0x00800000

Function page1
nsDialogs::Create 1018
Pop $dlg
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому окну позарез надо применить AnimateWindow ",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
SendMessage $dlg ${WM_GETFONT} 0 0 $R9
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
System::Call `user32::AnimateWindow(i$dlg,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`


System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "К этому AnimateWindow ",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i10,i200,i60,i$dlg,i223,i0,i0) i.R2'
ShowWindow $R2 0
System::Call `user32::AnimateWindow(i$R2,i1000,i${AW_SLIDE}|${AW_VER_NEGATIVE}|${AW_ACTIVATE})`

  

nsDialogs::Show
FunctionEnd

Function page2
call MyFunc
nsDialogs::Create 1018
Pop $dlg
# Для видимости перелистывания диалога
 ${NSD_CreateCheckbox} 25u 27u 68u 14u "checkbox"
 ${NSD_CreateLabel} 0 5u 100u 10u "sdfsdfsdf" 
#
nsDialogs::Show
FunctionEnd

Function MyFunc
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_NEGATIVE}|${AW_HIDE})`
System::Call `user32::AnimateWindow(i$HWNDPARENT,i500,i${AW_SLIDE}|${AW_HOR_POSITIVE}|${AW_ACTIVATE})`
FunctionEnd

Section
SectionEnd

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:08, 29-01-2013 | #156

MKN MKN вне форума

Ветеран


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

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


Создаём прямоугольную область со скругленными углами (закругляем углы окна) с помощью функции CreateRoundRectRgn :
(можно вообще сделать окно страницы в виде эллипса или круга...)

Код: Выделить весь код
!include MUI2.nsh

Page custom page1
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "CreateRoundRectRgn.exe"
Var dlg
 
 Function page1
nsDialogs::Create 1018
Pop $dlg
System::Call "*(i, i, i, i)i.r0"; создать новую структуру 
System::Call "User32::GetClientRect(i$HWNDPARENT, ir0)"; Получить новые координаты структуры - в $0 
System::Call "*$0(i, i, i.r1, i.r2)"
 ;Функция GetClientRect извлекает координаты рабочей области окна. Рабочие координаты определяют левый верхний 
 ;и нижний правый углы рабочей области. Поскольку рабочие координаты определены относительно левого верхнего угла 
 ;рабочей области окна, координаты левого верхнего угла - (0,0).
System::Free $0, освободить оперативную память 
IntOp $1 $1 + 5 
IntOp $2 $2 + 30 
 ;Отрегулируйте значения координат в CreateRoundRectRgn, как Вам надо
System::Call "Gdi32::CreateRoundRectRgn(i0,i0,ir1,ir2,i30,i40)i.r0"
System::Call "User32::SetWindowRgn(i$HWNDPARENT, ir0, i1)"
/*
int nLeftRect , // x -координата верхнего левого угла области 
int nTopRect , // y -координата верхнего левого угла области 
   
int nRightRect , // x -координата нижнего правого угла области 
int nBottomRect , // y -координата нижнего правого угла области 
    
int nWidthEllipse , // ширина эллипса для закругленных углов 
int nHeightEllipse  // высота эллипса для закругленных углов 

Параметры 
nLeftRect - определяет x -координату верхнего левого угла области. 
nTopRect - определяет y - координату верхнего левого угла области. 
nRightRect - определяет x -координату нижнего правого угла области. 
nBottomRect - определяет y -координату нижнего правого угла области. 
nWidthEllipse - определяет ширину эллипса, используемого для создания закругленных углов. 
nHeightEllipse - определяет высоту эллипса, используемого для создания закругленных углов. 
*/
nsDialogs::Show
FunctionEnd

Section
SectionEnd
Интересно, можно ли закруглить углы окнам, созданным с помощью CreateWindowEx ?

Последний раз редактировалось MKN, 31-01-2013 в 10:42.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:17, 30-01-2013 | #157


Аватара для kotkovets

Ветеран


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

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


Цитата MKN:
Интересно, можно ли закруглить углы окнам, созданным с помощью CreateWindowEx »
нет, для этого есть функции рисования (GDI) и отрисовки окон - в порядке обработки очередности сообщений винды,
а именно в событии WM_PAINT, ну что ли так:
http://radiofront.narod.ru/htm/prog/...api/paint.html
через нсисовский system это практически нереально..
проблема system - нормальная реализация обратных функций (калбеков)
в остальном system - хорош..

-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.


Отправлено: 23:18, 30-01-2013 | #158

MKN MKN вне форума

Ветеран


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

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


Reposition Window - изменяем позицию (месторасположение) окна.
Может пригодится, когда окно инсталлятора закрывает собой другое окно, например запущенного приложения (или наоборот). Окно в нужный момент сместится-"отпрыгнет" в сторону.
Код: Выделить весь код
!include MUI2.nsh
Page custom page1
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "repositionWindow.exe"
Var dlg
Var btn
!define stRECT "(i, i, i, i) i"
!define SPI_GETWORKAREA             0x0030

Function page1
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateButton} 80u 14u 120u 14u "Переместить окно"
pop $btn
${NSD_OnClick} $btn BtnClick
nsDialogs::Show
FunctionEnd

Function repositionWindow
	; Создать RECT структуру.  Внутри этой структуры координаты углов. Верхний левый угол определяется двумя координатами left и top. 
	;Нижний правый соответственно определяется двумя оставшимися координатами - right и bottom.
	System::Call "*${stRECT} .r1"
	
	; Получить окно прямоугольника.Функция GetWindowRect отыскивает размеры рамки ограничивающей прямоугольник 
	;определяемого окна. Размеры даны в экранных координатах, которые расположены относительно левого верхнего угла экрана.
	System::Call "User32::GetWindowRect(i, i) i ($HWNDPARENT, r1) .r2"
	
	; Получить координаты
	System::Call "*$1${stRECT} (.r2, .r3, .r4, .r5)"

	; Рассчитать ширину / высоту нашего окна
	IntOp $2 $4 - $2 ; $2 - ширина
	IntOp $3 $5 - $3 ; $3 - высота
	
	; Определить размер рабочего стола без панели задач
	System::Call "User32::SystemParametersInfo(i, i, i, i) i (${SPI_GETWORKAREA}, 0, r1, 0) .r4" 
	
	; Получить координаты
	System::Call "*$1${stRECT} (.r4, .r5, .r6, .r7)"
	
	System::Free $1

	; правую сторону экрана разделить на 4
	IntOp $0 $6 / 4
	IntOp $8 $2 / 4
	IntOp $0 $0 - $8
	; нижнюю часть экрана разделить на 4
	IntOp $1 $7 / 4
	IntOp $8 $3 / 4
	IntOp $1 $1 - $8
	
	;Установить новую позицию окна
	System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($HWNDPARENT, 0, $0, $1, 0, 0, 0x201)"
FunctionEnd

Function BtnClick
  pop $btn
  MessageBox MB_OK "Приготовились к прыжку ?" IDOK
  Call repositionWindow
FunctionEnd

Section
SectionEnd
Можно заставить прыгать и окна, созданные с помощью CreateWindowEx, более простым кодом, но возник вопрос - как вернуть окно на место, в исходную позицию, после повторного клика кнопки ? ( для любого кол-ва окон и кнопок)
Код :
Код: Выделить весь код
!include MUI2.nsh
Page custom page1
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "repositionWindowEx.exe"
Var dlg
Var btn
!define WS_BORDER 0x00800000

Function page1
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateButton} 150u 14u 120u 14u "Переместить Window 1"
pop $btn
${NSD_OnClick} $btn BtnClick

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "Window 1",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
nsDialogs::Show
FunctionEnd

Function repositionWindow
	System::Call "User32::SetWindowPos(i, i, i, i, i, i, i) b ($R2, 0, 3, 3, 0, 0, 0x201)"
FunctionEnd

Function BtnClick
  pop $btn
  Call repositionWindow
FunctionEnd

Section
SectionEnd

Последний раз редактировалось MKN, 31-01-2013 в 17:02.


Отправлено: 10:41, 31-01-2013 | #159


Аватара для kotkovets

Ветеран


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

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


Цитата MKN:
но возник вопрос - как вернуть окно на место, в исходную позицию...»
Но ты же с помощью CreateWindowEx создавал диалог и координаты известны..
Код: Выделить весь код
...i50,i100...,i$dlg,i222,i0,i0) i.R2
Цитата MKN:
как вернуть окно на место, в исходную позицию, после повторного клика кнопки ? ( для любого кол-ва окон и кнопок) »
из структуры рект родителя и дочернего окна - точнее, разницой первого члена структуры рект родителя и дочернего окна...
Код: Выделить весь код
  System::Call "*(i,i,i,i)i.r1"
  System::Call "*(i,i,i,i)i.r3"
  System::Call "User32::GetWindowRect(iR2,ir1)"
  System::Call "User32::GetWindowRect(i$dlg,ir3)"
  System::Call "*$1(i.r2)"
  System::Call "*$3(i.r4)"
  Intop $5 $2 - $4
Эта разница постоянна, а вот если она изменится, то можно менять позицию окна..
т.е в данном примере разница равна 50..
читать дальше »
Код: Выделить весь код
!include MUI2.nsh
Page custom page1
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

OutFile "repositionWindowEx.exe"
Var dlg
Var btn
!define WS_BORDER 0x00800000

Function page1
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateButton} 150u 14u 120u 14u "Переместить Window 1"
pop $btn
${NSD_OnClick} $btn BtnClick

System::Call 'user32::CreateWindowEx(i0,t "STATIC",t "Window 1",\
                      i${DEFAULT_STYLES}|${WS_BORDER},\
                      i50,i100,i200,i60,i$dlg,i222,i0,i0) i.R2'
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
nsDialogs::Show
FunctionEnd

Function BtnClick
  pop $btn
  System::Call "*(i,i,i,i)i.r1"
  System::Call "*(i,i,i,i)i.r3"
  System::Call "User32::GetWindowRect(iR2,ir1)"
  System::Call "User32::GetWindowRect(i$dlg,ir3)"
  System::Call "*$1(i.r2)"
  System::Call "*$3(i.r4)"
  Intop $5 $2 - $4
  ${If} $5 != 50
     System::Call "User32::SetWindowPos(iR2,i,i50,i100,i,i,i0x201)"
  ${Else}
     System::Call "User32::SetWindowPos(iR2,i,i3,i3,i,i,i0x201)"
  ${EndIf}
  System::Free $1
  System::Free $3
FunctionEnd

Section
SectionEnd

-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.


Последний раз редактировалось kotkovets, 01-02-2013 в 20:23.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:26, 31-01-2013 | #160



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 dimadr Наборы обновлений для Windows XP/2003/Windows 7 267 14-02-2020 08:25
[архив].: NSIS - все вопросы :. kotkovets Автоматическая установка приложений 3387 09-12-2012 11:56
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 jameszero Наборы обновлений для Windows XP/2003/Windows 7 1491 22-07-2011 22:42
Выбор|модернизация процессора .:[все вопросы]:. Часть I Myxa Выбор отдельных компонентов компьютера и конфигурации в целом 1845 01-01-2011 19:18
Вопросы по создателю инсталляций NSIS MaxDELETE Программное обеспечение Windows 14 04-07-2007 10:01




 
Переход