purebasic.info

PureBasic forum
Текущее время: Вт окт 23, 2018 3:02 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Центрирование окна
СообщениеДобавлено: Чт дек 05, 2013 7:16 pm 
Не в сети
доцент

Зарегистрирован: Сб июл 13, 2013 3:39 pm
Сообщений: 46
Благодарил (а): 10 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Процедура центрирования окна относительно [центра окна - левого верхнего края ]

Код:
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
 
#Window_0 = 1
#Window_2 = 2
 
; #Procedure# ===================================================================================================
; Название ...........: Window_Centered
; Описание  ....: Центрирование окна относительно окна  
; Синтаксис .........: Window_Centered(hWnd, w, h, c , d , pRect)
; Параметры  .....: hWnd   - Хэндл окна относительно которого центрировать
;                              w - h    -  Размеры центрируемого окна: высота . ширина  
;                              c          -   Способ центрирования  – 0 по центру окна  1 по левому верхнему углу
;                              d          -   Расстояние от левой - провой границ экрана  
; Возвращаемое значение   pRect  ..: Указатель на структуру Rect в которой содержатся координаты и размер центрируемого окна    
; ==============================================================================================================
 
 
Procedure.i Window_Centered(Gui, w, h, c , d , *GP.Rect)
  rect.Rect
  wgcs.Point
  SystemParametersInfo_(#SPI_GETWORKAREA, #False, @rect, #False)
  *GP\top=WindowX(Gui,#PB_Window_InnerCoordinate)
  *GP\left=WindowY(Gui,#PB_Window_InnerCoordinate)
  *GP\right=WindowHeight(Gui,#PB_Window_FrameCoordinate)
  *GP\bottom=WindowWidth(Gui,#PB_Window_FrameCoordinate)
  wgcs\y=WindowHeight(Gui)
  wgcs\x=WindowWidth(Gui)
  dLeft = (*GP\right - wgcs\x) / 2
  dTor =  (*GP\bottom - wgcs\y - dLeft)
  If c = 0
    *GP\top = *GP\top + (*GP\right - w) / 2 - dLeft
    *GP\left = *GP\left + (*GP\bottom - h  - dTor) / 2
  EndIf
  If d > (rect\right - rect\top - w - dLeft * 2) / 2 Or d > (rect\bottom - rect\left - h - dLeft + dTor) / 2 : d = 0 : EndIf
  If *GP\top + w + dLeft * 2 + d > rect\right : *GP\top = rect\right - w - d - dLeft * 2 : EndIf
  If *GP\left + h + dLeft + dTor + d > rect\bottom : *GP\left = rect\bottom - h - dLeft - dTor - d : EndIf
  If *GP\top <= rect\top + d : *GP\top = rect\top + d : EndIf
  If *GP\left <= rect\left + d : *GP\left = rect\left + d : EndIf
  *GP\right = w
  *GP\bottom = h
  ProcedureReturn *GP
EndProcedure
 
Procedure Open_Window2(x,y,right,bottom)
  OpenWindow(#Window_2,  x,  y,  right, bottom,  "Window Centered", #PB_Window_MinimizeGadget | #PB_Window_SystemMenu, WindowID(#Window_0))
  DisableWindow(#Window_0, #True)
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
  CloseWindow(#Window_2)
  DisableWindow(#Window_0, #False)
EndProcedure
 
OpenWindow (#Window_0,  0,  0,  450, 400,  "Window 1", #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
TextGadget(#PB_Any, 0, 200, 450, 0, "", #SS_ETCHEDHORZ)
;TextGadget(#PB_Any, 0, 200, 450, 0, "", #SS_ETCHEDVERT)
bt=ButtonGadget(#PB_Any, 185, 180, 75, 18, "Open Window")
 
Repeat
Event =  WaitWindowEvent()
If  EventGadget() = bt
  Window_Centered(#Window_0, 320, 150, 0, 70, @rect.rect)
  Open_Window2(rect\top, rect\left, rect\right, rect\bottom)
  EndIf
If Event = #PB_Event_CloseWindow
Break    
EndIf
ForEver
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Центрирование окна
СообщениеДобавлено: Чт дек 05, 2013 8:53 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2286
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
А как произойдет центрирование, если подключено несколько экранов?

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Центрирование окна
СообщениеДобавлено: Чт дек 05, 2013 9:43 pm 
Не в сети
доцент

Зарегистрирован: Сб июл 13, 2013 3:39 pm
Сообщений: 46
Благодарил (а): 10 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
qpAHToMAS писал(а):
А как произойдет центрирование, если подключено несколько экранов?

Вообще без понятия так как не имею второго монитора (
но думаю если процедуры : WindowX(), WindowY(), WindowHeight(),WindowWidth(), корректно отработают то нормально сработает


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Центрирование окна
СообщениеДобавлено: Чт дек 05, 2013 9:52 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
А почему бы так не центрировать?
Код:
1
OpenWindow(#Window_about, 0, 0, 200, 200, "About", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_WindowCentered,WindowID(#Window_0))  



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Центрирование окна
СообщениеДобавлено: Чт дек 05, 2013 10:54 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
qpAHToMAS писал(а):
А как произойдет центрирование, если подключено несколько экранов?

Если главное окно на втором мониторе, то второе окно открывается на первом мониторе.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Центрирование окна
СообщениеДобавлено: Пт дек 06, 2013 12:07 am 
Не в сети
доцент

Зарегистрирован: Сб июл 13, 2013 3:39 pm
Сообщений: 46
Благодарил (а): 10 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
MrF писал(а):
А почему бы так не центрировать?
Код:
1
OpenWindow(#Window_about, 0, 0, 200, 200, "About", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_WindowCentered,WindowID(#Window_0))  



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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB