Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Сообщения полос прокрутки

Windows посылает оконной процедуре асинхронные сообщения WM_VSCROLL и WM_HSCROLL, когда на полосе прокрутки щелкают мышью или перетаскивается бегунок. Каждое действие мыши на полосе прокрутки вызывает появление по крайней мере двух сообщений, одного при нажатии кнопки мыши и другого, когда ее отпускают.

Младшее слово параметра wParam, которое объединяет сообщения WM_VSCROLL и WM_HSCROLL — это число, показывающее, что мышь осуществляет какие-то действия на полосе прокрутки. Его значения соответствуют определенным идентификаторам, которые начинаются с SB_, что означает "полоса прокрутки" (scroll bar). Хотя в некоторых из этих идентификаторов используются слова "UP" и "DOWN", они применяются и к горизонтальным и к вертикальным полосам прокрутки, как показано на рис. Оконная процедура может получить множество сообщений типа SB_LINEUP, SB_PAGEUP, SB_LINEDOWN или SB_PSGEDOWN, если кнопка мыши остается нажатой при перемещении по полосе прокрутки. Сообщение SB_ENDSCROLL показывает, что кнопка мыши отпущена. Как правило, сообщения SB_ENDSCROLL можно игнорировать.

Если младшее слово параметра wParam равно SB_THUMBTRACK или SB_THUMBPOSITION, то старшее слово wParam определяет текущее положение полосы прокрутки. Это положение находится между минимальным и максимальным значениями диапазона полосы прокрутки. Во всех других случаях при работе с полосами прокрутки старшее слово wParam следует игнорировать. Также можно игнорировать параметр lParam, который обычно используется для полос прокрутки, создаваемых в окнах диалога.

НЕ нашли? Не то? Что вы ищете?

Нажата: SB_LINEUP

Отпущена: SB_ENDSCROLL

 

Нажата: SB_PAGEDOWN

Отпущена: SB_ENDSCROLL

 

Нажата: SB_LINEDOWN

Отпущена: SB_ENDSCROLL

 

Нажата: SB_THUMBTRACK

Отпущена: SB_THUMBPOSITION

 

Нажата: SB_PAGEUP

Отпущена: SB_ ENDSCROLL

 

Значения идентификаторов для параметра wParam сообщений
полосы прокрутки

В документации по Windows указано, что младшее слово wParam может также быть равно SB_TOP или SB_BOTTOM. Оно показывает, что полоса прокрутки была переведена в свое максимальное или минимальное положение.

Обработка сообщений SB_THUMBTRACK и SB_THUMBPOSITION весьма проблематична. Если устанавливается большой диапазон полосы прокрутки, а пользователь быстро перемещает бегунок по полосе, то Windows отправит оконной функции множество сообщений SB_THUMBTRACK. Программа столкнется с проблемой обработки этих сообщений. По этой причине в большинстве приложений Windows эти сообщения игнорируются, а действия предпринимаются только при получении сообщения SB_THUMBPOSITION, которое означает, что бегунок оставлен в покое.

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

Типы функций

В основном, функции GDI могут быть разбиты на несколько крупных групп. Это группы не имеют четких границ и частично перекрываются. Все они, тем не менее, перечислены ниже:

q Функции, которые получают (или создают) и освобождают (или уничтожают) контекст устройства. Для рисования необходим описатель контекста устройства. Функции GetDC и ReleaseDC позволяют сделать это внутри обработчиков сообщений, отличных от WM_PAINT. Функции BeginPaint и EndPaint (хотя технически — это часть подсистемы USER в Windows) используются в теле обработчика сообщения WM_PAINT для рисования.

q Функции, которые получают информацию о контексте устройства.

q Функции рисования. Очевидно, из всех предварительно рассмотренных функций — это одна из самых важных.

q Функции, которые устанавливают и получают атрибуты контекста устройства. Атрибут контекста устройства определяет различные особенности работы функции рисования. Например, используется функция SetTextColor для задания любого текста, выводимого с использованием функции TextOut (или любой другой функции вывода текста. Все атрибуты контекста устройства имеют значение по умолчанию, которое устанавливается, при получении контекста устройства. Для всех функций Set есть функции Get, позволяющие получить текущее значение атрибута контекста устройства.

q Функции, которые работают с объектами GDI.

Для рисования на устройстве графического вывода (экране дисплея или принтере), сначала надо получить описатель контекста устройства (device context, DC). Передавая этот описатель, Windows тем самым дает право на использование самого устройства. Затем включается этот описатель как параметр в функции GDI для того, чтобы сообщить Windows, на каком устройстве собираются рисовать.

Контекст устройства содержит много текущих атрибутов, определяющих поведение функций GDI при работе с устройством. Эти атрибуты позволяют включать в вызовы функций GDI только начальные координаты или размеры, и ничего больше из того, что требуется для отображения объекта на устройстве. Например, когда вызывается функция TextOut, в ее параметрах надо указать только описатель контекста устройства, начальные координаты, сам выводимый текст и его длину. Не нужно указывать шрифт, цвет текста, цвет фона и межсимвольное расстояние, потому что эти атрибуты являются частью контекста устройства. Когда необходимо изменить один из этих атрибутов, вызывается функция, изменяющая значение атрибута в контексте устройства. Последующие вызовы функции TextOut будут использовать измененные значения атрибутов.

Получение описателя контекста устройства

Windows предоставляет несколько методов для получения описателя контекста устройства. Если описатель контекста устройства получается в теле обработчика сообщения, необходимо освободить его (удалить, вернуть системе) перед выходом из оконной процедуры. После того, как освободится описатель контекста устройства, его значение теряет смысл.

Наиболее общий метод получения контекста устройства и его освобождения состоит в использовании функций BeginPaint и EndPaint при обработке сообщения WM_PAINT:

hdc = BeginPaint (hwnd, &ps);

[другие строки программы]

EndPaint (hwnd, &ps);

Переменная ps — это структура типа PAINTSTRUCT. Поле hdc этой структуры — это описатель контекста устройства, который возвращается функцией BeginPaint. Структура PAINTSTRUCT содержит также структуру типа RECT с именем rcPaint (прямоугольник), определяющую прямоугольную область, содержащую недействительный (требующий перерисовки) регион клиентской области окна. Получив описатель контекста устройства от функции BeginPaint, можно рисовать только в пределах этого региона. Функция BeginPaint делает этот регион действительным.

Программы для Windows могут также получать описатель контекста устройства в теле обработчика сообщения, отличного от WM_PAINT:

hdc = GetDC (hwnd);

[другие строки программы]

ReleaseDC (hwnd, hdc);

Полученный контекст устройства с описателем hwnd относится к клиентской (рабочей) области окна. Основная разница между использованием этих функций и комбинации функций BeginPaint и EndPaint состоит в том, что можно рисовать в пределах всей рабочей области окна, используя описатель контекста устройства, возвращенный функцией GetDC. Кроме того, функции GetDC и ReleaseDC не делают действительным (не требующим перерисовки) ни один недействительный регион клиентской области окна.

Программы для Windows могут также получать описатель контекста устройства, относящийся ко всему окну программы, а не только к его клиентской области:

hdc = GetWindowDC (hwnd);

[другие строки программы]

ReleaseDC (hwnd. hdc);

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

Функции BeginPaint, GetDC и GetWindowDC получают контекст устройства, связанный с конкретным окном на экране. Более общая функция для получения описателя контекста устройства — это функция CreateDC:

hdc = CreateDC (pszDriver, pszDevice, pszOutput, pData);

[другие строки программы]

DeleteDC (hdc);

Например, можно получить описатель контекста устройства всего дисплея так:

hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);

Запись вне окна обычно не принята, но это удобно для некоторых редко используемых приложений. Иногда нужно только получить некоторую информацию о контексте устройства, и не надо ничего рисовать. В этих случаях можно получить описатель так называемого "информационного контекста" (information context), используя функцию CreateIC. Параметры этой функции такие же, как у функции CreateDC, например:

hdcInfo = CreateIC ("DISPLAY", NULL, NULL, NULL);

[другие строки программы]

DeleteDC (hdcInfo);

Нельзя осуществлять вывод на устройство, используя информационный контекст.

При работе с битовыми образами иногда может быть полезно получить "контекст памяти" (memory device context):

hdcMem = CreateCompatibleDC (hdc);

[другие строки программы]

DeleteDC (hdcMem);

Это достаточно общая концепция. Главное, что надо сделать, это выбрать битовый образ в контекст памяти, а затем вызвать функцию GDI для рисования битового образа.

Метафайл — это набор вызовов GDI в двоичном виде. Можно создать метафайл, получая контекст метафайла:

hdcMeta = CreateMetaFile (pszFilename);

[другие строки программы]

hmf = CloseMetaFile (hdcMeta);

Пока контекст метафайла действителен вызов GDI, который осуществляется, используя hdcMeta, не вызывает вывода на устройство, а записывается в метафайл. Когда вызывается CloseMetaFile, описатель контекста становится недействительным. Функция возвращает описатель метафайла (hmf ).

Получение информации из контекста устройства

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

iValue = GetDeviceCaps (hdc, iIndex);

Параметр iIndex — один из 28 идентификаторов, определенных в заголовочном файле Windows. Например, значение iIndex равное HORZRES заставляет функцию GetDeviceCaps вернуть ширину устройства в пикселях; значение VERTRES — высоту устройства в пикселях. Если hdc является описателем контекста устройства дисплея, то эту же информацию можно получить от функции GetSystemMetrics. Если hdc является описателем контекста устройства принтера, то тогда уже функция GetDeviceCaps возвращает высоту и ширину рабочей области принтера в пикселях.

Можно также использовать функцию GetDeviceCaps для определения возможностей устройства по обработке различных типов графики. Это неважно для видеомониторов, но становится очень важным при работе с принтерами. Например, большинство плоттеров не способны отображать битовые образы, и GetDeviceCaps сообщит об этом.

Битовые или растровые образы (bitmap) представляют собой один из двух методов хранения графической информации в программах для Windows. Битовый образ — это цифровое представление изображения. Каждый пиксель соответствует одному или более битам в растровом образе. Монохромные битовые образы требуют всего один бит для хранения информации об одном пикселе; цветные битовые образы требуют дополнительных битов для представления цвета каждого пикселя. Второй формой хранения графической информации является метафайл (metafile). Метафайл — это описание изображения, а не его цифровое представление.

Битовые образы и метафайлы занимают свое определенное место в компьютерной графике. Битовые образы чаще всего используются для хранения очень сложных изображений реального мира, таких как цифровые фотографии или видеоролики. Метафайлы более удобны для хранения изображений, выполненных человеком или компьютером, таких как архитектурные чертежи. И битовые образы и метафайлы могут находиться в памяти, могут быть сохранены на диске в виде файлов, могут передаваться между приложениями Windows через буфер обмена (clipboard).

Битовые образы имеют два существенных недостатка. Во-первых, они очень зависимы от оборудования. Большинство реальных устройств — цветные. Представление цветного битового образа на монохромном устройстве часто неудовлетворительно. Другая проблема состоит в том, что битовые образы часто рассчитаны на конкретное разрешение и коэффициент сжатия изображения. Хотя битовые образы могут быть и растянуты и сжаты, это требует, соответственно, либо дублирования, либо перемещения строк или столбцов пикселей, и может привести к искажениям изображения. Метафайл может быть преобразован практически к любому размеру без искажений.

Вторым существенным недостатком битовых образов является то, что для их хранения требуется много памяти. Например, битовый образ, представляющий экран 16-цветного дисплея VGA в режиме 640х480 пикселей, требует 150 килобайт. Метафайлы обычно требуют значительно меньше памяти, чем битовые образы. Размер памяти для битового образа зависит от размера изображения и числа цветов, в нем содержащихся. Размер памяти для метафайла зависит от сложности изображения и конкретного числа инструкций GDI для его воспроизведения.

Единственное преимущество битовых образов над метафайлами — это, конечно, скорость. Копирование битовых образов на экран обычно осуществляется значительно быстрее, чем воспроизведение метафайла.

Цвета и битовые образы

Каждый пиксель изображения соответствует одному или более битам битового образа. Для представления монохромного изображения требуется один бит на пиксель. Для представления цветного изображения требуется более одного бита на пиксель. Число цветов, которые могут быть представлены в битовом образе равно 2 в степени "число битов на пиксель". Например, для представления 16 цветов в битовом образе требуется 4 бита на пиксель, для представления 256 цветов — 8 битов на пиксель. Для полноцветного битового образа необходимо 24 бита на пиксель, по 8 битов для каждого из цветов RGB — красного, зеленого, синего.

Создание битовых образов в программе

Windows содержит пять функций, которые позволяют в программе создать зависящий от устройства битовый образ — объект GDI. Первая функция CreateDIBitmap рассматривалась выше. Вот другие функции:

hBitmap = CreateBitmap (cxWidth, cyHeight, iPlanes, iBitsPixel, pBits);

hBitmap = CreateBitmapIndirect (&bitmap);

hBitmap = CreateCompatibleBitmap (hdc, cxWidth, cyHeight);

hBitmap = CreateDiscardableBitmap (hdc, cxWidth, cyHeight);

Во всех случаях параметры cxWidth и cyHeight — это ширина и высота битового образа в пикселях. В функции CreateBitmap параметры iPlanes и iBitsPixel — это число цветовых плоскостей и число битов цвета на пиксель в битовом образе. Хотя бы один из этих двух параметров должен быть равен 1. Если оба параметра равны 1, то функция строит монохромный битовый образ.

В функции CreateBitmap параметр pBits может быть установлен в NULL, если создается неинициализированный битовый образ. Созданный битовый образ будет содержать случайные данные. В функциях CreateCompatibleBitmap и CreateDiscardableBitmap Windows использует контекст устройства, описываемый параметром hdc, для получения числа цветовых плоскостей и числа битов цвета на пиксель. Битовый образ, создаваемый этими функциями, будет неинициализированным.

Функция CreateBitmapIndirect схожа с функцией CreateBitmap за исключением того, что она использует структуру типа BITMAP для задания битового образа. Следующая таблица показывает поля этой структуры:

Поле

Тип

Описание

bmType

LONG

Установлено в 0

bmWidth

LONG

Ширина битового образа в пикселях

bmHeight

LONG

Высота битового образа в пикселях

bmWidthBytes

LONG

Ширина битового образа в байтах
(должна быть четной)

bmPlanes

WORD

Число цветовых плоскостей

bmBitsPixel

WORD

Число битов цвета на пиксель

bmBits

LPVOID

Указатель на массив битов

Поле bmWidthBytes должно быть четным числом — минимальным четным числом байтов, необходимым для хранения одной скан-линии. Массив битов, на который указывает bmBits, должен быть организован на базе поля bmWidthBytes. Если bm — структура типа BITMAP, то можно вычислить значение поля bmWidthBytes, используя следующее выражение:

bm. bmWidthBytes = (bm. bmWidth * bm. bmBitsPixel + 15) / 16 * 2;

Если Windows не может создать битовый образ (в основном из-за недостатка памяти), она возвратит NULL.

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

GetObject (hBitmap, sizeof (BITMAP), (LPVOID) &bitmap);

Эта функция копирует информацию о битовом образе в структуру (с именем bitmap) типа BITMAP. Эта функция не устанавливает поле bmBits. Для доступа к битам битового образа нужно вызвать функцию:

GetBitmapBits (hBitmap, dwCount, pBits);

Она копирует dwCount бит в символьный массив по указателю pBits. Для того, чтобы быть уверенными, что все биты битового образа скопируются в этот массив, можно вычислить параметр dwCount на основе значений полей структуры битового образа:

dwCount = (DWORD) bitmap. bmWidthBytes * bitmap. bmHeight *
bitmap. bmPlanes;

Можно также задать Windows скопировать символьный массив, содержащий биты битового образа, обратно в существующий битовый образ, используя функцию:

SetBitmapBits (hBitmap, dwCoint, pBits);

Поскольку битовые образы — это объекты GDI, необходимо удалить каждый созданный битовый образ:

DeleteObject (hBitmap);

Формат цветного битового образа

Цветной битовый образ в предыдущих версиях Windows немного более сложен и очень сильно зависим от устройства. Цветной битовый образ организован так, чтобы облегчить вывод битов на конкретное физическое устройство. Битовый образ организован или как набор цветовых плоскостей или имеет набор цветовых битов на пиксель. Это зависит от устройства вывода, для которого предназначен битовый образ.

Рассмотрим битовый образ, у которого bmBitsPixel равно 1 (что означает, что в нем 1 бит цвета на пиксель), а bmPlanes больше 1. Цветной битовый образ для 16-цветного VGA — это хороший пример. Windows использует четыре цветовых плоскости VGA для представления 16 цветов, поэтому bmPlanes равно 4. Массив битов начинается с верхней скан-линии. Цветовые плоскости для каждой скан-линии хранятся последовательно: красная плоскость — первой, зеленая плоскость — второй, затем голубая плоскость и плоскость интенсивности. Затем следует вторая скан-линия битового образа.

Битовый образ может также представлять цвет как некоторое число битов на пиксель. Предположим, что видеомонитор может представить 256 цветов, используя 8 бит (1 байт) на пиксель. Для каждой скан-линии первый байт представляет цвет самого левого пикселя, второй байт представляет цвет следующего пикселя, и т. д. Значение bmWidthBytes структуры BITMAP отражает увеличенную ширину каждой скан-линии в байтах, а значение bmWidth — это число пикселей в скан-линии.

Здесь есть одна тонкость: битовый образ не содержит никакой информации о том, как эти цветовые плоскости или биты цвета соответствуют реальным цветам устройства вывода. Конкретный битовый образ предназначен только для устройства, имеющего такую же организацию, как и битовый образ. Поэтому не рекомендуется использовать функции CreateBitmap или CreateBitmapIndirect для создания инициализированного цветного битового образа. Следует применять эти функции только для создания инициализированных или неинициализированных монохромных битовых образов.

Для создания цветного битового образа используется функция CreateCompatibleBitmap, которая гарантирует, что формат будет совместим с реальным графическим устройством отображения. Задается изображение цветного битового образа, выбирая его в контекст памяти (рассматривается ниже) и, затем, рисуется в этом контексте или используете функцию BitBlt.

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

Контекст памяти

Две функции — SetDIBitsToDevice и StretchDIBits позволяют воспроизвести массив битов на устройстве вывода. Тем не менее, даже если есть описатель битового образа, то нет функции для рисования битового образа на поверхности отображения контекста устройства.

DrawBitmap (hdc, hBitmap, xStart, yStart); // Такой функции нет!!!

Эта функция копировала бы битовый образ в контекст устройства, заданный параметром hdc, начиная с логической точки (xStart, yStart).

Контекст памяти (memory device context) — это контекст, имеющий поверхность отображения (display surface), существующую только в памяти. Можно создать контекст памяти, используя функцию CreateCompatibleDC:

hdcMem = CreateCompatibleDC (hdc);

Описатель hdc — описатель действительного открытого контекста устройства. Функция CreateCompatibleDC возвращает описатель контекста памяти. При создании контекста памяти все атрибуты устанавливаются в значения по умолчанию. Можно устанавливать атрибуты в значения, отличные от значений по умолчанию, получать текущие значения атрибутов, выбирать в него перья, кисти и регионы. И, конечно, можно даже рисовать на нем.

Когда впервые создается контекст памяти, он имеет поверхность отображения, содержащую только 1 монохромный пиксель. Это очень маленькая поверхность отображения. Надо увеличить поверхность отображения контекста памяти. Это осуществляется выбором битового образа в контекст памяти:

SelectObject (hdcMem, hBitmap);

Теперь поверхность отображения hdcMem имеет те же ширину, высоту и организацию цвета, что и битовый образ, описываемый hBitmap. Если начало координат окна и области вывода установлены по умолчанию, то логическая точка (0, 0) контекста памяти соответствует левому верхнему углу битового образа.

Если битовый образ уже содержит некоторое изображение, то это изображение становится частью поверхности отображения контекста памяти. Любые изменения битового образа (например, с использованием функции SetBitmapBits для установки другого массива битов в битовом образе) отразятся на поверхности отображения. Все, что рисуется в контексте памяти, немедленно отражается в битовом образе. Короче, битовый образ — это поверхность отображения контекста памяти.

Ранее были рассмотрены различные функции для создания битовых образов. Вот одна из них:

hBitmap = CreateCompatibleBitmap (hdc, xWidth, yHeight);

Если hdc — это обычный описатель контекста устройства для дисплея или принтера, то число цветовых плоскостей и число битов на пиксель созданного битового образа совпадает с соответствующими характеристиками устройства. Однако, если hdc — это описатель контекста памяти (и в него еще не выбран битовый образ), то функция CreateCompatibleBitmap возвращает монохромный битовый образ шириной xWidth и высотой yHeight пикселей.

Битовый образ — объект GDI. С помощью функции SelectObject можно выбирать эти четыре объекта GDI в контекст памяти. Однако, нельхя выбирать битовый образ в обычный контекст устройства — только в контекст памяти.

Когда закончится работа с контекстом памяти, его надо удалить:

DeleteDC (hdcMem);

Мощная функция BitBlt

Компьютерная графика включает в себя процедуру записи пикселей на устройство отображения. Ранее уже рассматривались некоторые пути выполнения этой задачи, но для больших и сложных манипуляций с пикселями в Windows есть только функции BitBlt, PatBlt и StretchBlt. BitBlt означает перенос блоков битов (bit block transfer). Функция BitBlt переносит пиксели, другими слои, это— универсальная растровая функция (raster blaster). Термин "transfer" не совсем справедлив по отношению к функции BitBlt. Она делает больше, чем просто перенос пикселей, — она осуществляет одну из 256 логических растровых операций над тремя наборами пикселей.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8