PDA

Показать полную графическую версию : .: 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

linkuha@vk
27-01-2013, 22:12
про секции я знаю, все сделал.
но я не включал MUI_PAGE_INSTFILES, т.к. я хочу чтобы в любом случае был выбор компонентов
и мне пишет "Установка успешно выполнена!", но ничего не устанавливается.

получается, если нельзя убирать выбор типа установки INSTFILES, то проблема была в этом.

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

kotkovets
28-01-2013, 00:44
но в статусе установки хотелось бы наблюдать не список распакованных файлов, а то какой компонент сейчас устанавливается, или все вместе. такое возможно?) »
справку читайте и поиском по сайту блин пользуйтесь...
http://forum.oszone.net/post-1515790-845.html

MKN
29-01-2013, 12:57
В nsDialogs есть функция обратного вызова для кнопки "Назад" - nsDialogs::OnBack function_address.
А есть ли нечто подобное для кнопки "Далее" (Next) ? Я не обнаружил...
К примеру, надо организовать вызов какой либо функции перед переходом со страницы на страницу (скажем у меня 10 кастомных страниц и я перед переходом-открытием каждой последующей, хочу сначала делать нечто, при нажатии кнопки "Далее", на предыдущей странице, и только потом должна открыться последующая страница)
Как это можно реализовать ? И для стандартных страниц тоже...

kotkovets
29-01-2013, 14:28
А есть ли нечто подобное для кнопки "Далее" (Next) ? Я не обнаружил... »
и не нужно, все равно далее откроется следующая страничка по скрипту...
К примеру, надо организовать вызов какой либо функции перед переходом со страницы на страницу (скажем у меня 10 кастомных страниц и я перед переходом-открытием каждой последующей, хочу сначала делать нечто, при нажатии кнопки "Далее", на предыдущей странице, и только потом должна открыться последующая страница) »
до команды nsDialogs::show (время показания странички) остальное все ДО, элементы диалога ты создаешь до...
И для стандартных страниц тоже... »
в справочнике: Оформление-> Интерфейс Модерн -> Стандартные функции

profcom
29-01-2013, 15:11
А есть ли нечто подобное для кнопки "Далее" (Next) ? Я не обнаружил... »
Есть стандартная функция .onGUIEnd в интерфейсе модерн выполняемая после закрытия любых страниц. Почитайте про нее в справке.

MKN
29-01-2013, 15:12
все равно далее откроется следующая страничка по скрипту... »
Мне нужно , чтобы сначала не страничка открылась, а сработала функция , которая укажет, как этой страничке открыться...
К примеру, чтобы следующая страница открывалась согласно моих параметров для функции AnimateWindow.
Если для первой страницы AnimateWindow работает как положено, то следующая, после клика Next, почему то игнорирует AnimateWindow...

И если уж говорить про AnimateWindow, то возможно ли её применение для окон созданных с помощью CreateWindowEx ?
Ни черта не получается анимировать созданные дополнительные окна, и ессно инфы нигде "ни гу-гу" ...
Если бы это удалось, то можно было бы оч. интересно оформлять элементы страниц...

K.A.V.
29-01-2013, 15:28
К примеру, надо организовать вызов какой либо функции перед переходом со страницы на страницу »
до команды nsDialogs::show »
Точнее до инициализации диалога, т.е. до команды nsDialogs::Create

Мне нужно , чтобы сначала не страничка открылась, а сработала функция , которая укажет, как этой страничке открыться... »
В чем проблема то, MKN? Или мы чего-то с Вячеславом не понимаем?



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

Page custom Dialog_1
Page custom Dialog_2
Page custom Dialog_3

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

Name "TEST.exe"
OutFile "TEST.exe"



Function Dialog_1
nsDialogs::Create 1018
pop $0
# Создание элементов диалога
nsDialogs::Show
FunctionEnd




Function Dialog_2
# А В этом диалоге ЗДЕСЬ выполняется функция перед созданием диалога
call MyFunc
nsDialogs::Create 1018
pop $0
# Создание элементов диалога
nsDialogs::Show
FunctionEnd

Function MyFunc
# Команды
FunctionEnd



Function Dialog_3
nsDialogs::Create 1018
pop $0
# Создание элементов диалога
nsDialogs::Show
FunctionEnd






Section
SetAutoClose true
SectionEnd

MKN
29-01-2013, 15:31
K.A.V.,
Так я уже делал... Не работает. Видно не всё так просто.
Вот код :

!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`
nsDialogs::Show
FunctionEnd

/*Function page2
call MyFunc
nsDialogs::Create 1018
Pop $dlg
nsDialogs::Show
FunctionEnd

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

Section
SectionEnd
Посмотрите сначала, как это работает с первой страницей, а потом раскомментите вторую и посмотрите, как НЕ работает анимация 2 страницы...

И просьба к kotkovets, - подскажи пожалуйста, как анимировать с помощью AnimateWindow, созданное CreateWindowEx окно ?

profcom
29-01-2013, 17:13
подскажи пожалуйста, как анимировать с помощью AnimateWindow, созданное CreateWindowEx окно ? »
Есть подозрение что это не работает с дочерними окнами. По этому же и не работает анимация страниц, работает лишь с главным окном.

Был абсолютно не прав, у вас в скрипте просто ошибка, анимация не применяется из за неправильной строки. В функции страницы 1 вместо $HWNDPARENT надо применить $dlg.
Function page1
nsDialogs::Create 1018
Pop $dlg

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'
System::Call `user32::AnimateWindow(i$dlg,i500,i${AW_SLIDE}|${AW_CENTER}|${AW_ACTIVATE})`

SendMessage $dlg ${WM_GETFONT} 0 0 $R9
SetCtlColors $R2 `0x0000FF` `0x99FFFF`
nsDialogs::Show
FunctionEnd

MKN
29-01-2013, 17:31
у вас в скрипте просто ошибка »
Опаньки... А я прощёлкал этот момент и полез в такие оконные дебри... Спасибо !
Интересно сработает, если созданных окон несколько ?

K.A.V.
29-01-2013, 17:40
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


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

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

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

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

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

profcom
29-01-2013, 17:46
А вот с $R2 я начинал и номер этот почему то не проходит... Нет анимации... »
У меня проходит, увеличь время показа с 500 до 2500 например и будет нагляднее.

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

K.A.V.
29-01-2013, 19:08
При таком нехорошем раскладе, как менять хэндлы созданных окон для анимации, если их будет несколько на одной странице ? »
Смари сюда :)

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

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

MKN
30-01-2013, 12:17
Создаём прямоугольную область со скругленными углами (закругляем углы окна) с помощью функции 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 ?

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

MKN
31-01-2013, 10:41
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

kotkovets
31-01-2013, 20:26
но возник вопрос - как вернуть окно на место, в исходную позицию...»
Но ты же с помощью CreateWindowEx создавал диалог и координаты известны..
...i50,i100...,i$dlg,i222,i0,i0) i.R2
как вернуть окно на место, в исходную позицию, после повторного клика кнопки ? ( для любого кол-ва окон и кнопок) »
из структуры рект родителя и дочернего окна - точнее, разницой первого члена структуры рект родителя и дочернего окна...
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




© OSzone.net 2001-2012