Reposition Window - изменяем позицию (месторасположение) окна.
Может пригодится, когда окно инсталлятора закрывает собой другое окно, например запущенного приложения (или наоборот). Окно в нужный момент сместится-"отпрыгнет" в сторону.
Код:
![Выделить весь код](images/misc/selectcode.png)
!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, более простым кодом, но возник вопрос - как вернуть окно на место, в исходную позицию,
после повторного клика кнопки ? ( для любого кол-ва окон и кнопок)
Код :
Код:
![Выделить весь код](images/misc/selectcode.png)
!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