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

Показать сообщение отдельно
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