Gdi windows что это
Перейти к содержимому

Gdi windows что это

  • автор:

Что такое GDI.EXE? Это безопасно или вирус? Как удалить или исправить это

GDI.EXE это исполняемый файл, который является частью Microsoft Windows, разработанный Корпорация Microsoft, Версия программного обеспечения для Windows: 3.10.0.103 обычно 220800 в байтах, но у вас может отличаться версия.

Расширение .exe имени файла отображает исполняемый файл. В некоторых случаях исполняемые файлы могут повредить ваш компьютер. Пожалуйста, прочитайте следующее, чтобы решить для себя, является ли GDI.EXE Файл на вашем компьютере — это вирус или вредоносная программа, которую вы должны удалить, или, если это действительно допустимый файл операционной системы Windows или надежное приложение.

GDI.EXE безопасен, или это вирус или вредоносная программа?

Первое, что поможет вам определить, является ли тот или иной файл законным процессом Windows или вирусом, это местоположение самого исполняемого файла. Например, для GDI.EXE его путь будет примерно таким: C: \ Program Files \ Microsoft Corporation \ Microsoft Windows \ GDI.EXE

Чтобы определить его путь, откройте диспетчер задач, перейдите в «Просмотр» -> «Выбрать столбцы» и выберите «Имя пути к изображению», чтобы добавить столбец местоположения в диспетчер задач. Если вы обнаружите здесь подозрительный каталог, возможно, стоит дополнительно изучить этот процесс.

Еще один инструмент, который иногда может помочь вам обнаружить плохие процессы, — это Microsoft Process Explorer. Запустите программу (не требует установки) и активируйте «Проверить легенды» в разделе «Параметры». Теперь перейдите в View -> Select Columns и добавьте «Verified Signer» в качестве одного из столбцов.

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

  • Имя: GDI.EXE
  • Программного обеспечения: Microsoft Windows,
  • Издатель: Корпорация Microsoft
  • Ожидаемое местоположение: C: \ Program Files \ Microsoft Corporation \ Microsoft Windows \ подпапке
  • Ожидаемый полный путь: C: \ Program Files \ Microsoft Corporation \ Microsoft Windows \ GDI.EXE
  • SHA1: 0224F77B717590126A353911425161AFDADFF0A5
  • SHA256:
  • MD5: 1A9DF6CFA3F61EC4B0B0DF3C5F265DD2
  • Известно, что до 220800 размер байт в большинстве Windows;

Если у вас возникли какие-либо трудности с этим исполняемым файлом, вы должны определить, заслуживает ли он доверия, прежде чем удалять GDI.EXE. Для этого найдите этот процесс в диспетчере задач.

Найти его местоположение и сравнить размер и т. Д. С приведенными выше фактами

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

Кроме того, функциональность вируса может сама влиять на удаление GDI.EXE. В этом случае вы должны включить Безопасный режим с загрузкой сетевых драйверов — безопасная среда, которая отключает большинство процессов и загружает только самые необходимые службы и драйверы. Когда вы можете запустить программу безопасности и полный анализ системы.

Могу ли я удалить или удалить GDI.EXE?

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

Windows GDI

Интерфейс графических устройств (GDI) Microsoft ® Windows ® дает возможность приложениям использовать графический и форматированный текст и на экране дисплея и на принтере. Базирующиеся на Windows приложения не получают доступ к графическим аппаратным средствам непосредственно. Вместо этого с драйверами устройства от имени приложений взаимодействует GDI.

Где применяется

GDI может использоваться во всех базирующихся на Windows приложениях.

Аудитория разработки

Этот API разработан для использования программистами использующими язык C/C++. Требуются знание графического пользовательского интерфейса Windows и управляемая сообщениями архитектура программы.

Требования в период выполнения программы

Информацию о том, какую операционную систему необходимо использовать для конкретной функции, смотрите раздел документации для функции Расположение и совместимость.

Русские Блоги

TextOut записывает строку в области отображения окна. Параметр PSText представляет собой указатель на строку, и ILngth длина строки. х и у параметров определяют начало строки в области отображения. Параметр HDC «Контент устройства Handle», который является важной частью GDI. В самом деле, каждая функция требует GDI, этот дескриптор в качестве первого параметра функции.

содержание оборудования

Читатель может все еще помнить, что ручка просто значение, и Windows, использует его внутренне. Авторы программы получают ручку от Windows, а затем использовать ручку в других функциях. Ручка содержимого устройства окно «Перевал» функции GDI. С помощью этого устройства контента ручки, программа автор может рисовать на области отображения, так что графический является хорошим или некрасиво.

Содержание устройства ( «DC») на самом деле структура данных сохраняется внутри внутри GDI. Содержание устройство связано с конкретным устройством отображения (например, видео-дисплей или принтер). Для видео дисплеев, содержание устройства всегда связано с конкретным окном на экране.

Некоторые значения в содержании устройства являются графическими «свойством», которые определяют деталь функции рисования GDI. Например, для TextOut, свойство содержимого устройства определяет цвет цвет, цвет фона, координаты Х и Y координат изображения в области отображения окна, и шрифты, используемые в Windows, когда отображается текст.

Когда программа требует рисунка, он должен сначала получить дескриптор содержимого устройства. После получения ручки, Windows заполняет внутреннюю структуру содержимого устройства с внутренним значением содержимого устройства.

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

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

Возьмите ручку содержимого устройства: один метод

Этот метод используется при обработке сообщения WM_PAINT. Она включает в себя две функции BeginPaint и EndPaint, что требует дескриптор окна (как обработчик сообщений окна передачи параметров) и адрес структуры PAINTSTRUCT (определены в файле заголовка WINUSER.H) в качестве параметра. Программа писателей Windows, как правило, называют это структурные переменные PS и определить его в обработчик окна сообщения:

При обработке сообщения WM_PAINT, обработчик сообщений окна сначала вызывает BeginPaint. Функция BeginPaint обычно стираются в фоновом режиме недействительной области при подготовке к рисованию. Эта функция также заполняет поле структуры PS. Значение BeginPaint является содержание дескриптор устройства, которое обычно сохраняется в переменной с именем КЖД. Она определяется в обработчике сообщений окна следующим образом:

Тип данных HDC определяется как 32-битный без фиксированного числа целого числа. Затем программа может использовать функцию GDI, такие как TextOut, который требует обработки содержимого устройства. EndPaint вызова, чтобы освободить дескриптор контекста устройства.

В общем, форма обработки сообщения WM_PAINT выглядит следующим образом:

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

Окна помещает сообщение WM_PAINT в очередь сообщений, так как область отображения является недействительным. Отказ Если вы не вызываете BeginPaint и EndPaint (или ValidateRect), Windows не делает зону действительными. Вместо этого Windows будет посылать еще одно сообщение WM_PAINT и был послан.

Составление информационной структуры

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

Когда вызов программы BeginPaint, Windows будет заполнить соответствующие значения полой структуры. Пользовательская программа использует только первые три поля, а остальные поля используются внутри Windows. Поле HDC является дескриптор содержимого устройства. В старой версии Windows, возвращаемое значение BeginPaint также ручка содержимое этого устройства. В большинстве случаев, FERASE отмечен как ложь (0), что означает, что Windows, стер фон недействительного прямоугольника. Окна использует поле HBRBACKGROUND структуры WNDCLASS для удаления фона, эта WNDCLASS структура используется, когда программа используется во время инициализации WinMain. Многие программы окна используют белую окраску.

Однако, если программа не в состоянии сделать прямоугольник в области отображения с помощью вызова функции Windows, invalidateect, последний параметр функции определяет, будет ли стерт фон. Если этот параметр является ложным (т.е. 0), Windows не будет стирать фон и frontstruct структура структуры PAINTSTRUCT будет верно (не ноль) после обратного вызова BeginPaint.

RCPaint поле структуры PAINTSTRUCT является структурой типа RECT. Структура RECT определяет прямоугольник, четыре поля для левого, верхнего, правого и ДНЕ. RCPaint поле структуры PAINTSTRUCT определяет границы недействительного прямоугольника. Эти значения в единицах элементов изображения, а также по отношению к верхнему левому углу области отображения. Инвалид прямоугольник это область, которая должна быть перенаправлена.

Прямоугольник RCPAINT в Paintstruct — не только неверный прямоугольник, но и «вырезанный» прямоугольник. Это означает, что Windows ограничивает операцию чертежа в прямоугольнике (более конкретно, если неверная прямоугольная область не является прямоугольным, Windows ограничивает операцию чертежа в этой области).

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

Этот вызов выполняется до вызова BeginPaint, что делает весь область отображения Invalid и стирает на заднем плане. Однако, если последний параметр равен false, фон не будет стерта, оригинальная вещь останется на месте.

Обычно это программа Windows просто повторно передает всю область отображения наиболее удобным способом просто редактировать весь область отображения без учета структуры RCPaint. Например, если круг включен в выходной сигнал дисплея области отображения, только часть круга попадает в неверный прямоугольник, что делает невозможным рисовать только неверную часть круга. Это требует покраски весь круг. Windows не вызывает никакой части прямоугольника RCPaint при использовании спичек содержимого устройства, вернувшись от BeginPaint.

Получите обработку содержимого устройства: метод 2

Хотя лучше всего обновить всю область отображения во время обработки сообщений WM_Paint, вы также найдете некоторую часть области рисования, чтобы нарисовать область отображения во время обработки сообщений Non-WM_Paint. Или вам необходимо использовать обработку содержимого устройства для других целей, таких как получение информации о контенте устройства.

Чтобы получить обработку содержимого устройства области отображения окна, вы можете вызвать GetDC, чтобы получить ручку, а вызов вызовете, после использования.

Подобно BegetPaint и EndPaint, должны использоваться функции GetDC и DelizedC. Если вы звоните GetDC при обработке сообщения, вы должны позвонить с выпуском, прежде чем выйти из обработчика сообщений окна. Не называйте GetDC в сообщении для вызова ReleaseDC в другом сообщении.

В отличие от дескриптора содержимого контента обрабатываемого контента устройства из BeginPaint, обрабатываемая обработка контента устройства GETDC имеет режущий прямоугольник, который равен всей области отображения. Вы можете нарисовать некоторую часть области отображения вместо того, чтобы рисовать на неверном прямоугольнике (если есть неверный прямоугольник). В отличие от Beadpaint, GetDC не делает никакой недействительной зоны. Если вам нужно сделать весь область отображения, вы можете позвонить

GetDC и ReleaseDC вообще можно назвать отвечать на сообщения клавиатуры (например, в ручках слова) и сообщения мышей (например, в программе рисования). На этом этапе программа может обновлять область отображения сразу на основе клавиатуры пользователя или ввода мыши, без учета использования сообщений WM_Paint для недействительной области окна. Однако, как только сообщение WM_PAINT, действительно, программа должна быть обновлена ​​после сбора достаточного количества информации.

Функция, аналогичная getdc, — getwindowdc. GetDC передается к содержимому рукоятке устройства для записи области отображения окна, и GetWindowDC передается к ручке содержимого устройства в течение всего написанного окна. Например, Программа может писать текст на заголовке столбца окна от GetWindowDC. Тем не менее, программа также должна обрабатывать WM_NCPaint («безразличие область Draw») сообщений.

TextOut: Подробнее

Textout — это наиболее часто используемая функция GDI для отображения текста. Синтаксис:

Эта функция будет подробно обсуждаться ниже.

Первый параметр является дескриптором содержимого устройства, Это может быть либо возвращаемое значение getdc, либо возвращаемое значение beginpaint при обработке сообщения wm_paint.

Свойства устройства устройства контролируют характеристики отображаемой строки. Например, есть атрибут, указанный в содержании устройства Цвет текста Внутренние цвета: черные, содержимое устройства также определить белый фон. Когда программа выводит текст на дисплей, Windows использует этот цвет фона, чтобы заполнить прямоугольное пространство вокруг символа (называемой «коробкой символов»).

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

Параметры PSText являются указателями, которые указывают на строки , Ilength — количество символов в строках Отказ Если PSText указывает на строку Unicode, количество байтов в строке в два раза в два раза. Там нет никакого контроля ASCII символов (например, Enter, Wrap, Таблица, или Ци сетки) в строке, и для Windows отображает эти управляющие символы как цельных блоков. Text0ut не распознает байт содержимого в качестве нуля в виде флага строки (для Unicode, короткомерный 0), и требуется длина параметра NLENGH.

Х и Y определяют X и Y определяют начальную позицию строки в области отображения, Х представляет собой горизонтальное положение, Y представляет собой вертикальное положение. Левый левый угол первого символа в строке расположен на точке координат (X, Y). В желаемом содержании устройства происхождение (точка x и y равно 0) — верхний левый угол области отображения. Если X и Y имеют значение 0 в TextOut, строка выводится из верхнего левого угла области отображения.

При чтении функции рисунка GDI (например, Textout) часто называют координатами, передавающими функцию. «Логические координаты» Отказ Обратите внимание, что есть много окон. «Координировать режим изображения» , Они используются для управления логических координат, заданных функциями GDI, чтобы преобразовать фактические координаты первичной цепи дисплея Отказ Режим изображения определяется в содержании устройства, изображение памяти MM_TEXT (идентификатор определяется в Wingdi.h). В режиме MM_TEXT изображения, логическое устройство такого же, как реальное устройство, все из которых установлены; увеличивает значение слева направо, а величина Y увеличиваются от topward.

Содержание устройства также определяет область пошива. Вы видели, Для обработки содержимого устройства, полученной из GetDC, внутренний определенные хрустящей область является всей областью дисплея, а также для обработки содержимого устройства от BeginPaint, это неверная область. Окна не отображают строки в любом месте за пределами области портного. Если персонаж входит в области кадрирования, Windows будет отображать только часть в этой области. Если вы хотите, чтобы написать вывод в окно, это не так просто, так что вам не придется беспокоиться о там в таком роде вещь.

размер символов

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

Какова высота символов и средняя ширина системного шрифта? Эта проблема зависит от размера дисплея видео. Минимальный размер дисплея требуется для Windows, 640 × 480, но многие пользователи предпочитают 800 × 600 или 1024 × 768 размер дисплея. Кроме того, для этих больших размеров дисплея, Windows позволяет пользователям выбирать различные размеры системных шрифтов.

Программа может позвонить в GetSystemMetrics функционировать взять информацию о различных визуальных компонентов на пользовательском интерфейсе, вызовите GetTextMetrics, чтобы получить размер шрифта. GetTextMetrics передается обратно к информации шрифта, выбранного в содержании устройства, поэтому он требует обработки содержимого устройства. Окна копируют различные значения размера текста в структуру типа TEXTMETRIC, определенном в Wingdi.h. TEXTMETRIC структура имеет 20 полей, и мы используем только первые семь:

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

Для использования функции GetTextMetrics, вам необходимо определить структурную переменную первым (обычно называют ТМ):

Если вам необходимо, чтобы определить размер текста, первым получить дескриптор содержимого устройства, а затем вызвать GetTextMetrics:

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

Размер шрифта: подробнее

TEXTMETRIC структура обеспечивает богатую информацию о шрифтах, выбранных в текущем содержимом устройства. Тем не менее, продольный размер шрифта определяется только 5 значений, 4 приведены значения

Самое важное значение Temheight, которое TMASCENT и TMDESCENT и. Эти два значения указывают максимальную продольную высоту базовых онлайн-символов. «Ведущий» относится к пространству, вставленного между принтером в двух строках. В TEXTMETRIC структуры, внутреннее расстояние входит в TMASCENT (так же в TmHeight), и это часто является местом, где появляется символ стресса. Поле TMinternalLleading может быть установлен в 0, в этом случае микрофон слегка укорочена, чтобы приспособить символ акцента.

Размер дисплея площадь

Существующие приложения для Windows, вы можете обнаружить, что размер окна сильно меняется. Когда окно максимизирует (при условии, что окно только заголовок столбца и нет меню), область отображения практически оккупировали весь экран. Размер развернутой области отображения может быть получен путем вызова GetSystemMetrics как SM_CXFullscreen и SM_CYFULLSCREEN. Отказ Наименьший размер окна может быть небольшой, иногда даже не существует, не говоря область отображения.

В недавней главе, мы используем функцию GetClientRect, чтобы получить размер области отображения. С помощью этой функции, нет ничего плохого, но если вы хотите использовать информацию каждый раз, когда вы используете информацию, она будет называть это не является эффективным. Определить лучший размер области отображения окна для обработки сообщений WM_SIZE в обработчик окна сообщения 。 Когда изменяется размер окна, Windows посылает сообщение WM_SIZE в обработчик окна сообщения. Отказ Низкий групповой характер параметра LPARAM переданного в обработчик окна сообщения содержит ширину области отображения, а высоту области отображения входят в большом характере. Чтобы сохранить эти размеры, необходимо определить две статические переменные в обработчик окна сообщения:

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

На самом деле, вы увидите подобный программный код в каждой программе Windows. LOWORD и HIWORD макросы определены в заголовке файла Windows WINDEF.H. Определение этих макросов выглядеть следующим образом:

Эти два макросы передаются обратно к значению Word (16-битный нефиксированным целых чисел, диапазон от 0 до 0xFFFF). Как правило, эти значения сохраняются в 32-битных чисел. Это не будет включать в себя какие-либо проблемы преобразования и сделать эти значения легко использовать в любых требуемых вычислений.

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

Эта категория окна говорит окна, если изменения горизонтального или вертикального размера, область отображения принудительно.

Windows GDI. Рисуем графические объекты

По данной теме написана не одна сотня книг (многие из которых на русском языке). А так как данная статья не претендует на полноту изложения, настоятельно рекомендуем прочесть хотя бы пару из них. Не факт, что всё усвоишь, но основные моменты всё равно запомнишь.

Содержание

Windows GDI

  • Применяется только при создании оконных приложений.
  • Аббревиатура расшифровывается как Graphics Device Interface (Интерфейс графических устройств).
  • До появления DirectX, являлась единственной библиотекой для разработки графических приложений в ОС MS Windows.
  • Значительно уступает DirectX по быстродействию. В то же время, функции GDI активно используются совместно с функциями DirectX в примерах, поставляемых вместе с DirectX SDK (например те, что относятся к работке со шрифтами ).
  • Является одним из трёх базовых компонентов ОС семейства MS Windows. Два других компонента (Kernel и User) отвечают за управление памятью, файловый ввод/вывод, взаимодействие с пользователем и т.д.
  • Является частью Microsoft ® Windows ® APIg (англ. application programming interface — прикладной программный интерфейс).
  • Предоставляет стандартные блоки, используемые прикладными программами, написанными для Windows ®, включая семейство Windows Server 2003, Windows XP, Windows 2000, Windows NT ®, Windows 95, Windows 98 и Windows Me.
  • Представляет собой часть операционной системы, реализованную, как и большинство её компонентов, в виде динамически подключаемой библиотеки (файла с расширением .dll).
  • Обеспечивает аппаратно-независимую графику для приложений в ОС семейства MS Windows. Через драйверы устройств графика отображается на множестве аппаратно-различных устройств (в основном это видеоадаптеры и мониторы). Таким образом, программе нет необходимости знать или учитывать особенности того или иного устройства, так как в Windows реализован так называемый HAL (Hardware Abstraction Level — Уровень аппаратной абстракции).
  • В своё время GDI критиковали за медлительность, что является прямым следствием его универсальности (+ непрямой доступ к видеопамяти). Но это актуально лишь для некоторых функций GDI.
  • Представляет собой одну из самых мощных и массивных составляющих Windows API. Только для работы с текстом предусмотрено более 40 функций.
  • Для своей работы требует подключение к проекту заголовочного файла windows.h .
  • изменение цвета пикселей;
  • рисование прямых, окружностей, прямоугольников;
  • вывод надписей с поддержкой различных шрифтов;
  • копирование участков изображения, создание регионов, отсечений;
  • отображение сплайнов Безье;
  • и многое другое.

Типы, используемые в GDI

Для работы с этими двумя основными типами существует около десятка функций. Вот наиболее полезные из них:
Таблица 1. Функции для работы с типами POINT и RECT

ФУНКЦИЯ ОПИСАНИЕ
BOOL PtInRect(CONST RECT *lprc, POINT pt); Возвращает TRUE, если точка, переданная в параметре pt, лежит внутри прямоугольника, на который указывает параметр lprc.
BOOL SetRect(LPRECT lprc, int xLeft, int yTop, int xRight, int yBottom); Позволяет установить поля структуры прямоугольника, адресуемой указателем lprc, четыремя значениями xLeft, yTop, xRight, YBottom. Использование этой функции исзбавляет программиста от написания четырёх операторов присваивания при попытке записать новые значения в уже существующую структуру прямоугольника.
BOOL EqualRect(CONST RECT *lprc1, CONST RECT *lprc2); Позволяет сравнить 2 структуры прямоугольников, адреса которых передаются ей в качестве параметров.
BOOL CopyRect(LPRECT lprcDst, CONST RECT *lprcSrc); Позволяет копировать содержимое одной структуры прямоугольника внутрь другой структуры такого же типа.
BOOL OffsetRect(LPRECT lprc, int dx, int dy); Позволяет переместить прямоугольник, адрес которого указан в первом параметре, на указанное расстояние.
BOOL InflateRect(LPRECT lprc, int dx, int dy); Позволяет увеличить или уменьшить прямоугольник на заданные величины смещений.
GDI также активно использует тип SIZE, который позволяет хранить высоту и ширину прямоугольника.

Контекст устройства (device context, DC) является основным понятием при работе с GDI.

  • Представляет собой структуру, которую Windows поддерживает для опеределённого участка памяти. Этот участок является своего рода "окном" в реальное устройство (например монитор или принтер).

Работа с объектами GDI

  • быть помещён внутрь какого-то контекста (говорят "выбран в контекст"); Объекты, выбранные в данный момент в контекст, удалять нельзя. Одновременно в конкретный момент времени в контексте может находиться лишь один экземпляр каждого объекта. Например, при помещении в контекст нового пера, старое перо из него изымается (но не удаляется!).
  • находиться в свободном состоянии. Такие объекты (которые не планируется использовать в будущем) необходимо удалять (с целью эффективного использования системной памяти). Удаление свободных и более неиспользуемых объектов GDI — забота программиста.

Помещение объекта в контекст

  • Желательно при использовании функции SelectObject.
  • Обязательно при определении в начале листинга макроса STRICT.

Удаление объекта из контекста

Создание объектов GDI

В качестве параметра указывается один из следующих типов предопределённых объектов:
Таблица 3. Некоторые типы предопределённых объектов GDI

ТИП ОПИСАНИЕ
BLACK_BRUSH Сплошная кисть чёрного цвета.
WHITE_BRUSH Сплошная кисть белого цвета.
GRAY_BRUSH Сплошная кисть серого цвета.
DKGRAY_BRUSH Сплошная кисть тёмно-серого цвета.
LTGRAY_BRUSH Сплошная кисть светло-серого цвета.
DC_BRUSH Windows 2000/XP: Кисть сплошного тона. Цвет по умолчанию является белым. Цвет может измениться при помощи использования функция SetDCBrushColor.
HOLLOW_BRUSH Пустая кисть (эквивалент NULL_BRUSH).
NULL_BRUSH Пустая кисть (эквивалент HOLLOW_BRUSH). Применяется для рисования фигур, у которых отсутствует заливка.
BLACK_PEN Чёрное перо.
WHITE_PEN Белое перо.
DC_PEN Windows 2000/XP: Сплошной цвет пера. Цвет по умолчанию является белым. Цвет может измениться при помощи использования функции SetDCPenColor.
DEFAULT_GUI_FONT Шрифт, используемый по умолчанию в графическом интерфейсе пользователя. Заданный по умолчанию (типичный) шрифт для объектов пользовательского интерфейса таких как меню и диалоговые окна. Им является MS Sans Serif.
SYSTEM_FONT Системный шрифт, используемый для отображения меню и текста в диалоговых окнах. Windows 95/98 and Windows NT: Системный шрифт — MS Sans Serif. Windows 2000/XP: Системный шрифт — Tahoma.
SYSTEM_FIXED_FONT Моноширинный (фиксированной ширины) системный шрифт . Этот предопределенный (стандартный) объект предусматривается только для совместимости с 16-битовыми версиями Windows ранее чем 3.0.
ANSI_FIXED_FONT Моноширинный системный шрифт (фиксированной ширины) Windows.
ANSI_VAR_FONT Системный шрифт Windows с переменным шагом (разноширинный шрифт).
DEVICE_DEFAULT_FONT Windows NT/2000/XP: Аппаратно-зависимый шрифт.
OEM_FIXED_FONT Предусматриваемый поставщиком основного оборудования (OEM) моноширинный шрифт (фиксированной ширины).
DEFAULT_PALETTE Заданная по умолчанию (Типичная) палитра. Состоит из статических цветов системной палитры.

В случае успешного завершения возвращается дескриптор затребованного логического объекта. Иначе — 0 (ноль). У предопределённых объектов есть одна особенность — их не требуется самостоятельно удалять с помощью функции DeleteObject. Впрочем, это не запрещено.
Используйте флажки DKGRAY_BRUSH, GRAY_BRUSH и объекты предопределения LTGRAY_BRUSH только в окнах со стилями CS_HREDRAW и CS_VREDRAW . Использование серой предопределенной кисти в любом другом стиле окна может привести к нарушению границ шаблонов кисти после того, как окно перемещается или изменяется по размеру. Начало координат предопределенных кистей не могут быть откорректированы. Стандартные объекты HOLLOW_BRUSH и NULL_BRUSH эквивалентны.
Windows 2000/XP: И DC_BRUSH и DC_PEN могут быть использованы взаимозаменяемо с другими предопределенными объектами подобно BLACK_BRUSH и BLACK_PEN.
Шрифт, используемый объектом предопределения DEFAULT_GUI_FONT может измениться. Используйте этот стандартный объект, когда Вы хотите использовать шрифт, который используют меню, диалоговые окна, и другие объекты пользовательского интерфейса.
В GDI предусмотрена возможность создания собственных объектов, удовлетворяющих любым требуемым характеристикам. Для создания нового объекта GDI конкретного типа предусмотрена своя, уникальная для этого типа функция (часто их даже несколько).

Рассмотрим создание объекта GDI на примере шрифта. Для этого используются функции CreateFont и CreateFontIndirect.
Прототип функции CreateFont выглядит так:

  • Если параметр nWidth равен нулю, то при создании шрифта Windows руководствуется лишь параметром nHeight. Возможные значения параметра fnWeight — FW_NORMAL, FW_BOLD, FW_EXTRABOLD и др.

Здесь создаётся шрифт размером 38 единиц, без наклона. жирный, подчёркнутый, использующий качество по умолчанию, с названием "Times New Roman".

Прототип функции CreateFontIndirect выглядит так:

Функцию CreateFontIndirect обычно применяют при необходимости создать несколько объектов-шрифтов, имеющих схожие характеристики и небольшие различия.
Объект-шрифт также удаляется с помощью функции DeleteObject.

Порядок действий при работе с объектами GDI

  1. Получить дескриптор объекта GDI (а. Воспользоваться одним из предопределённых объектов. б. Создать новый объект при помощи соответствующей функции.)
  2. Выбрать объект GDI в контекст устройства при помощи функции SelectObject (либо воспользовавшись макросом из файла windowsx.h). Не забываем сохранить при этом дескриптор объекта GDI, находившегося в контексте до этого.
  3. Выполнить необходимые действия с контекстом устройства (обычно это рисование или перерисовка).
  4. Выбрать в контекст устройства дескриптор объекта GDI, сохранённый в шаге 2. При этом дескриптор объекта, созданного нами, освободится.
  5. Удалить созданный объект GDI. Если этот объект является предопределённым, то удалять его необязательно.

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

Обе этих функции получают в качестве параметра дескриптор окна и возвращают его контекст. Отличие состоит в том, что GetDC возвращает дескриптор клиентской области окна, а GetWindowDC — дескриптор всего окна целиком, включая заголовк и полосы прокрутки.

По завершении работы с контекстом устройства, его необходимо освободить при помощи функции ReleaseDC:

Параметры функции TextOut:

ПАРАМЕТР ОПИСАНИЕ
HDC hdc Дескриптор контекста устройства, в который будет осуществляться вывод.
int x Координата точки по оси x (отсчитывается от левого верхнего угла), где будет размещена надпись.
int y Координата точки по оси y (отсчитывается от левого верхнего угла), где будет размещена надпись.
LPCSTR lpStr Указатель на строку с текстом. Строка обязательно заканчивается комбинацией символов \0.
int cbLen Число символов в строке с текстом.

При успешном завершении функция возвращает 1, иначе — 0.

Особый случай: сообщение WM_PAINT

  • Указывает на необходимость перерисовки окна приложения.
  • Занимает особое положение среди сообщений приложения, использующего графический интерфейс пользователя (Graphic User Interface — GUI).
  • Практически не используется при создании приложений DirectX.

В отличие от предыдущего примера, здесь присутствуют две специализированные функции BeginPaint и EndPaint + инициализирована структура PAINTSTRUCT.

Режимы отображения

  • Логические координаты — это те координаты, которые использует программист при вызове графических функций.
  • Физические координаты используются GDIдля реального вывода изображения на устройстве.

Здесь первый параметр — дескриптор контекста устройства. Второй параметр — устанавливаемый режим отображения, где указывается одно из следующих значений:
Таблица 4. Возможные значения параметра fnMapMode функции SetMapMode

ЗНАЧЕНИЕ ОПИСАНИЕ
MM_TEXT Логические координаты совпадают с физическими координатами устройства. В качестве единиц измерения используются пиксели. Левый верхний угол экрана имеет координаты (0, 0); ось Х направлена вправо, а ось Y — вниз. Этот режим отображения принят по умолчанию.
MM_HIMETRIC Каждая единица логических координат соответствует 0,01 мм. Левый нижний угол имеет координаты (0, 0). Ось Х направлена вправо. Ось Y направлена вверх.
MM_HIENGLISH Каждая единица логических координат соответствует 0,001 дюйма. Левый нижний угол имеет координаты (0, 0). Ось Х направлена вправо. Ось Y направлена вверх.
MM_LOENGLISH Каждая единица логических координат соответствует 0,01 дюйма. Левый нижний угол имеет координаты (0, 0). Ось Х направлена вправо. Ось Y направлена вверх.
MM_TWIPS Каждая единица логических координат соответствует 1/1440 дюйма. Левый нижний угол имеет координаты (0, 0). Ось Х направлена вправо. Ось Y направлена вверх.
MM_ANISOTROPIC Каждая единица логических координат может соответствовать произвольному количеству точек устройства, которое независимо масштабируется по каждой из осей. Задавать поведение этого режима можно при помощи функций SetWindowExtEx и SetViewportExtEx.
MM_ISOTROPIC Каждая единица логических координат может соответствовать произвольному количеству точек устройства, которое одинаково масштабируется по осям. Задавать поведение этого режима можно при помощи функций SetWindowExtEx и SetViewportExtEx.

Большинство функций GDI, в том числе и CreateFont, получают свои параметры именно в логических единицах контекста устройства.
Узнать текущий режим отображения можно с помощью функции GetMapMode:

Единственный параметр функции — дескриптор контекста устройства, а возвращаемый результат — одно из значений, приведённых в Таблице 4. В случае неудачи функция возвращает 0 (ноль).

Пример приложения, выводящее в окне текст и точки

Создаём оконное приложение.

  • Следуя инструкциям статьи Создание приложений Сpp Win32, в MSVC++2010 создай пустой Проект WinDots и добавь в него файл исходного кода WinMain.cpp .
  • Скопируй из этой же статьи весь исходный код базового оконного приложения Windows и вставь в WinMain.cpp:
  • Сохрани Решение (Файл->Сохранить все).

Готовим Проект WinDots к компиляции

Выбираем многобайтовую кодировку

Примечание

  • Убедись, что MSVC++2010 запущена и в ней открыт наш текущий Проект WinDots.
  • В Обозревателе решений щёлкаем правой кнопкой мыши по названию Проекта WinDots.
  • Во всплывающем контекстном меню выбираем "Свойства".
  • В появившемся окне установки свойств Проекта жмём Свойства конфигурации->Общие, в правой части в строке "Набор символов" выставляем значение "Использовать многобайтовую кодировку".
  • Жмём ОК.
  • Сохрани Решение (Файл->Сохранить все).
Отключаем инкрементную компоновку (incremental linking)

Ошибка LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt

В MS Visual C++ 2010 даже компиляция консольных приложений нередко завершается неудачей, а вместо исполняемого файла программист видит сообщение:
LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt.

ПРИЧИНА: MS Visual С++ 2010 «не нравится» версия .NET Framework, установленная в операционной системе. В общих чертах, MS Visual С++ 2010 спрограммирована для работы под управлением .NET Framework 4.0 и сильно к нему привязана. Если точнее, к нему сильно привязана система инкрементной компоновки приложений (incremental linking), которая по умолчанию включена для всех создаваемых проектов.
Во время установки MS Visual C++ 2010 пытается установить свой «родной» .NET Framework 4.0, проверяя версию этой программной платформы, установленную в ОС на данный момент. Если версия .NET Framework ниже 4.0, то она обновляется до 4.0 и всё прекрасно компилируется. Если версия .NET Framework выше 4.0, то всё оставляется как есть: IDE успешно завершает установку, но при компиляции ВСЕХ приложений выскакивает данная ошибка. Более того, ошибка была замечена даже при наличии в системе .NET Framework версии 4.0, но отличающейся от «родной» припиской вроде «Beta» или «Release Candidate».

ВАРИАНТЫ РЕШЕНИЙ:
1. Отключить инкрементную линковку в опциях Проекта.
В главном меню MSVC++2010 выбираем: Проект->Свойства->Свойства конфигурации->Компоновщик(Linker)->Включить инкрементное построение (Incremental Linking). Данный пункт по умолчанию включен для всех новых проектов. Выставляем его в Нет (No). И жмём OK. Инкрементное построение заметно сокращает время компилирования больших проектов. Но в нашем случае его отсутствие некритично.
2. Удалить (переместить в другое место) утилиту cvtres.exe из каталога bin установленной MS Visual C++ 2010.
В нашем случае (Win7 x64) полный путь до данного файла такой: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\cvtres.exe . Официальное название данного приложения — Microsoft® Resource File To COFF Object Conversion Utility (утилита конвертации файлов двоичных ресурсов в Component Object File Format). Опытным путём установлено, что при линковке IDE «спотыкается» именно об него.
3. Удалить из системы все версии .NET Framework (включая языковые пакеты и всякие профайлеры, если есть) и саму MS Visual C++ 2010.
Всё вышеперечисленное можно без труда найти в меню «Программы и компоненты» (MS Windows Vista/7/8). Затем заново установить MS Visual C++ 2010. При этом автоматом установится .NET Framework 4.0, идущий с ней в наборе.

Третий пункт — самый долгий. На деле почти всегда хватает выполнения первых двух. Данным вопросом озадачивались ребята здесь: https://www.cyberforum.ru/cpp-beginners/thread637174.html?ysclid=l3akpmanrq. После этого линковка (=компоновка) проходит идеально. Подобные «костыли» в IDE от Майков — не редкость. Можно предположить, что команда с головой ударилась в тестирование .NET-возможностей MSVC++2010, совсем забыв о Win32-направлении (либо признав его бесперспективным).

  • Убедись, что MSVC++2010 запущена и в ней открыт Проект, с которым работаешь.
  • В Обозревателе решений щёлкаем правой кнопкой мыши по названию Проекта.
  • Во всплывающем контекстном меню выбираем «Свойства».
  • В появившемся окне установки свойств Проекта жмём Свойства конфигурации -> Компоновщик -> Общие (Configuration Properties -> Linker -> General), в правой части в строке «Включить инкрементную компоновку» ставим значение Нет (/INCREMENTAL:NO).
  • Жмём ОК.

Компилируем Проект WinDots

  • Жми кнопку с зелёным треугольником на панели инструментов главного окна MSVC++2010 или F5 на клавиатуре.

Обрати внимание

  • Закрой окно базового приложения, нажав на кнопку с крестиком в правом верхнем углу или нажав Alt+F4 на клавиатуре.

Сменяем фон на белый

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

Подключаем заголовочный файл windowsx.h
  • В исходном коде WinMain.cpp найди следующую строку:
  • Строкой ниже добавь:

Теперь нам доступны специальные макросы Windows GDI.

Имзменяем значение члена оконного класса hbrBackground
  • В исходном коде WinMain.cpp найди следующую строку:
  • Замени её на строку
  • Сохрани Решение (Файл->Сохранить все).
  • Перекомпилируй Проект/Решение (в Обозревателе решений жмём правой кнопкой мыши по названию Проекта WinDots => Перестроить).
  • Закрой окно, нажав на кнопку с крестиком в правом верхнем углу или нажав Alt+F4 на клавиатуре.

Добавляем в оконную процедуру сообщение WM_PAINT и сопутствующий код

Добавляем текст в окне
  • В WinMain.cpp найди следующий фрагмент кода:
  • Замени код оконной процедуры на следующий:
  • Сохрани Решение (Файл->Сохранить все).
  • Перекомпилируй Проект/Решение (в Обозревателе решений жмём правой кнопкой мыши по названию Проекта WinDots => Перестроить).
Исследуем заменённый код.

Это обязательно при рисовании средствами GDI. Функция BeginPaint "захватывает" ( = монополизирует) выбранный контекст устройства перед размещением в нём графических объектов.
Служебное слово break не даёт перейти к обработке следующего сообщения (WM_DESTROY). Если его убрать, то программа выведет текст в окне и моментально завершит свою работу.

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

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