Размер окна приложения на ассемблере

Метки:  , ,

Время от времени в разделе будут появляться короткие заметки по разнообразным, зачастую необходимым на практике, фрагментам кода на языке ассемблера. В этом посте я хотел бы сохранить фрагмент кода, предназначенный для получения размеров окна приложения ассемблере и вывода их в графическое окно. Иногда у начинающих встречаются задачи, в которых необходимо получить размеры (ширина/высота) областей произвольного окна собственного приложения. Что бы не рыскать каждый раз по Сети в поисках ответов, решил сохранить код решения задачи в качестве автономной заметки на собственном блоге. Код, приведенный далее в примере, рассчитан на диалект препроцессора FASM. Исходный код небольшого приложения, выводящего в окно размеры собственного окна:

Структура приложения достаточно проста, я не стал писать внутренние алгоритмы для оптимизации и сокращения кода, дабы потом можно было просто использовать фрагменты кода в сторонних программах. Каркас приложения взял из примера статьи про оконное приложение на ассемблере, там и объясняются все ключевые моменты исходного кода приложения. Для того, что бы сразу сосредоточиться на основных моментах, отметим, что код, выполняющий получение размера окна приложения размещен в строках 68-75 и 77-84. Размеры окна приложения на ассемблере запрашиваются у системы при помощи двух функций Win32 API GetClientRect и GetWindowRect, входными параметрами которых являются дескриптор (описатель) окна и адрес структуры типа RECT, которая принимает параметры виртуального прямоугольника, описывающего координаты углов окна.

window size

Процедуры GetClientRect и GetWindowRect должны вызываться в процедурах обработки сообщений типового или диалогового окон после того, как окно создано! Например, в нашем примере функции вызываются в рамках кода обработки сообщения WM_PAINT.

Для получения координат областей окна могут использовать функции:

  • GetClientRect - Получение координат клиентской части окна;
  • GetWindowRect - Получение координат неклиентской части окна;

Про клиентскую и неклиентскую области можно почитать в этой статье про вывод текста в окно. После того, как функции возвращают заполненные структуры координат, производится простое вычисление высоты и ширины окна и вывод значений из подготовленного при помощи функции-форматера wsprintf буфера посредством функции TextOut.
Так стоит запомнить одну характерную особенность:

Функция GetClientRect получает координаты в клиентских координатах, функция GetWindowRect в координатах экрана. В принципе для нашего примера это не критично, поскольку мы вычисляем разницу, но для других случаев это надо помнить!

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *