Blog. Just Blog

Установка окна по центру экрана

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Для того, чтобы создаваемое диалоговое окно отображалось в самом центре экрана, его надо создать с атрибутом стиля DS_CENTER. Но иногда требуется отцентровать уже созданное или чужое окно. Для этого я написал небольшую функцию, устанавливающую выбранное окно по центру экрана, с некоторыми дополнительными возможностями. Функция самодостаточна, не требует дополнительных переменных в сегменте данных, корректно работает с любыми окнами, пропуская развернутые на весь экран.
  1. ;-------------------------------------------------------------------------
  2. ; Процедура перемещения окна в центр экрана. Если окно развернуто или
  3. ; его размеры превышают размеры экрана, то окно не перемещается
  4. ; Параметры:
  5. ;   hwnd - хэндл окна
  6. ;   mode - относительно каких координат центровать окно (1 - только
  7. ;          рабочая область экрана с учетом размеров панели задач и
  8. ;          различных тулбаров, 0 - относительно размеров всего экрана)
  9. ;-------------------------------------------------------------------------
  10. proc    WindowToCenter hwnd:DWORD, mode:DWORD
  11.         ; Локальные переменные, они же структура RECT
  12.         local   left   :DWORD
  13.         local   top    :DWORD
  14.         local   right  :DWORD
  15.         local   bottom :DWORD
  16.  
  17.         ; Сохранить все регистры
  18.         pusha
  19.  
  20.         ; Такое окно существует?
  21.         invoke  IsWindow,[hwnd]
  22.         or      eax,eax
  23.         jz      .loc_ret
  24.         ; Окно развернуто на весь экран?
  25.         invoke  IsZoomed,[hwnd]
  26.         or      eax,eax
  27.         jnz     .loc_ret
  28.  
  29.         ; Получить размеры окна
  30.         lea     eax,[left]
  31.         invoke  GetWindowRect,[hwnd],eax
  32.  
  33.         ; Флаги функции SetWindowPos
  34.         push    SWP_NOSIZE+SWP_NOZORDER
  35.         push    NULL
  36.         push    NULL
  37.  
  38.         ; Какие размеры экрана получать
  39.         mov     eax,SM_CYSCREEN      ; Вся экранная область
  40.         cmp     [mode],0
  41.         je      @f
  42.         mov     eax,SM_CYFULLSCREEN  ; Рабочая область экрана
  43. @@:
  44.         ; Получить высоту экрана
  45.         invoke  GetSystemMetrics,eax
  46.         mov     ecx,[bottom]
  47.         sub     ecx,[top]
  48.  
  49.         ; Высота окна больше высоты экрана?
  50.         cmp     ecx,eax
  51.         jbe     @f
  52.  
  53.         ; Почистить стек и на выход
  54.         add     esp,12
  55.         jmp     .loc_ret
  56. @@:
  57.         sub     eax,ecx
  58.         shr     eax,1
  59.         ; Новая координата Y
  60.         push    eax
  61.  
  62.         ; Какие размеры экрана получать
  63.         mov     eax,SM_CXSCREEN      ; Вся экранная область
  64.         cmp     [mode],0
  65.         je      @f
  66.         mov     eax,SM_CXFULLSCREEN  ; Рабочая область экрана
  67. @@:
  68.         ; Получить ширину экрана
  69.         invoke  GetSystemMetrics,eax
  70.         mov     ecx,[right]
  71.         sub     ecx,[left]
  72.  
  73.         ; Ширина окна больше ширины экрана?
  74.         cmp     ecx,eax
  75.         jbe     @f
  76.  
  77.         ; Почистить стек и на выход
  78.         add     esp,16
  79.         jmp     .loc_ret
  80. @@:
  81.         sub     eax,ecx
  82.         shr     eax,1
  83.         ; Новая координата X
  84.         push    eax
  85.  
  86.         ; Разместить окно по центру экрана
  87.         invoke  SetWindowPos,[hwnd],NULL
  88.  
  89. .loc_ret:
  90.         ; Восстановить все регистры
  91.         popa
  92.         ret
  93. endp
Параметры вызова: hwnd - хэндл окна, которое надо отцентровать, mode - режим центровки: 0 - установить окно по центру всего экрана, 1 - установить окно по центру рабочей области, то есть с учетом размеров панели задач и различных тулбаров.

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

В приложении два примера с исходниками, создающие окно с изменяемыми размерами и устанавливающие его по центру экрана или клиентской области.

Примеры программ с исходными текстами (FASM)Примеры программ с исходными текстами (FASM)

Center.Window.Demo.zip (5,642 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 8694 | Комментариев: 4

Метки: Assembler, окна
Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
Nashev (10.01.2012 в 20:52):
Тут бы учесть возможную мультимониторность ещё не помешало б. Я в своё время нарвался, когда пользователи стали по несколко мониторов к компу цеплять :)
tester3000 (06.12.2010 в 18:04):
ВИКТОР вот исходник от Tomasz Grysztar снятия скриншота в JPG http://board.flatassembler.net...=97424#97424
ВИКТОР (08.02.2010 в 16:24):
СУППЕР!
Вот цены бы не было если написали бы маленькую программку, это в ВАШЕМ  стили, по снятию скриншота. Или хотя бы исходник.
Ваши программы маленькие но функционал содержут прилично.
Молодец!
INC. (05.01.2010 в 07:42):
Thanks

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0044 сек.) / Память: 4.5 Mb
Наверх