Hdc c что это
Все, что необходимо начинающему и опытному программисту
Данные типа HDC представляют собой 32-разрядное целое беззнаковое число. После получения дескриптора контекста программа может использовать функции графического интерфейса, такие как TextOut и DrawText.
Указывать шрифт, цвет текста, цвет фона и расстояние между отдельными символами не нужно, поскольку эти атрибуты являются частью контекста устройства. Если по каким-либо причинам необходимо изменить один из этих атрибутов, то нужно вызвать соответствующую функцию. Перед началом рисования программа должна получить дескриптор контекста устройства. По окончании рисования программа должна освободить дескриптор. После освобождения дескриптор становится недействительным и использоваться не должен. Корректно работающая программа должна получать и освобождать дескриптор во время обработки каждого отдельного сообщения.
Дескриптор контекста устройства может быть получен одним из двух способов: • при обработке сообщений WM_PAINT. В этом случае используются функции BeginPaint и EndPaint. В качестве параметров эти функции принимают дескриптор,окна и адрес структуры PAINTSTRUCT, обычно именуемой как ps. Оконная процедура вызывает функцию BeginPaint в обработчике сообщения WM_PAINT. Функция возвращает в качестве результата дескриптор контекста в переменной типа нос, именуемой обычно hdc. После получения дескриптора контекста можно использовать функции рисования, например, TextOut или DrawText. Вызов функции EndPaint освобождает дескриптор контекста устройства. Процесс обработки сообщения WMPAINT, например в программе HELLOW ИЗ главе 4, будет выглядеть так, как представлено в листинге 5.1.
Листинг 5.1. Обработка сообщения WM PAINT
cmp uMsg, WM_PAINT
j ne next_l
lea EDX, ps
push EDX
push hWnd
call BeginPaint
mov hdc, EAX
push lenText
push offset textMes
push 100
push 100
push hdc
call TextOut
lea EDX, ps
push EDX
push hWnd
call EndPaint
ret
В случае, если сообщение WM_PAINT не обрабатывается, то оно должно передаваться в процедуру обработки сообщений по умолчанию DefWindowProc. Процедура DefWindowProc обрабатывает сообщения WM_PAINT, ВЫЗВаВ ПОДрЯД фуНКЦИИ BeginPaint И EndPaint, как ПОКазаНО в следующем фрагменте кода:
lea EDX, ps
push EDX
push hWnd
call BeginPaint
mov hdc, EAX
lea EDX, ps
push
push hWnd
EDX
call EndPaint
ret
• при обработке сообщений, отличных от WMPAINT, если возникает необходимость рисования, вызвав функцию GetDC.
Освободить дескриптор контекста можно с помощью функции WIN API ReieaseDC. Функция GetDC в качестве параметра принимает дескриптор окна приложения. Функция ReieaseDC в качестве параметров принимает дескриптор окна и дескриптор контекста, ранее созданный через вызов GetDC. Вывод текста и работу с контекстом устройства рисования с помощью функций WIN API BeginPaint и EndPaint мы рассмотрели в главе 4. Поэтому проанализируем второй метод получения дескриптора контекста. Для этого модифицируем наше приложение HELLOW.
Пусть требуется вывести строку текста при нажатии в окне приложения левой кнопки мыши. В этом случае в оконную процедуру необходимо включить обработчик сообщения WMLBUTTONDOWN. ИСХОДНЫЙ текст программы (назовем ее DRAWTEXT) приведен в листинге 5.2.
Листинг 5.2. Исходный текст программы DRAWTEXT
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
szDisplayName DB «КОНТЕКСТ УСТРОЙСТВА И ВЫВОД ТЕКСТА
DRAWTEXT. ASM
.386
.model flat, stdcaii
option casemap :none различаем регистр символов
(ВАРИАНТ 2) «, О
CommandLine DD О
. code
start:
invoke GetModuleHandle, NULL
mov- hlnstance, EAX
invoke GetCommandLine
mov CommandLine, EAX
invoke WinMain, hlnstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, 0
WinMain proc hlnst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
; Локальные переменные процедуры
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
; Заполнение структуры WNDCLASSEX требуемыми параметрами
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
push hlnst
pop wc.hlnstance
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.IpszMenuName, NULL
mov wc.IpszClassName, offset szClassName
invoke , NULL, IDI APPLICATION mov wc.hlcon, EAX
invoke , NULL, IDC_ARROW mov wc.hCursor, EAX
mov wc.hlconSm, 0
invoke RegisterClassEx, ADDR wc invoke CreateWindowEx,
WS_EX_OVERLAPPEDWINDOW,ADDR szClassName,\
ADDR szDisplayName, WS_OVERLAPPEDWINDOW,\
CWJJSEDEFAULT, CWJJSEDEFAULT, CWJJSEDEFAULT, \
CWJJSEDEFAULT, NULL, NULL, hlnst, NULL
invoke ShowWindow, hWnd, SW_SHOWNORMAL invoke Updatewindow,
hWnd ; Цикл обработки сообщений
Программирование на ассемблере в Windows: от простого к сложному 251 StartLoop
invoke GetMessage, ADDR msg, NULL, 0, 0
cmp EAX, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov EAX, msg.wParam
ret
WinMain endp
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL hdc :HDC
LOCAL rect :RECT
LOCAL coord :DWORD
cmp
jne
invoke
mov
invoke
mov
invoke
invoke
ret
next_l:
cmp
jne
invoke
xor
ret
next_2:
invoke
ret
uMsg, WM_LBUTTONDOWN
next_l
GetDC, hWnd
hdc, EAX
GetClientRect, hWnd, ADDR rect
coord, DT_CENTER or DT_SINGLELINE or DT_VCENTER
DrawText, hdc, ADDR textDraw, -1, ADDR rect, coord
ReieaseDC, hWnd, hdc
uMsg, WM_DESTROY
next_2
PostQuitMessage, NULL
EAX, EAX
DefWindowProc,hWin, uMsg, wParam, lParam
WndProc endp
end start
Для читателей, предпочитающих классический ассемблер без высокоуровневых структур, таких как if-else, while и invoke; приводим исходный текст только что рассмотренного примера. В листинге 5.3 приведен текст программы, где используются только команды ассемблера.
iVARIOUS
Есть четыре типа контекста устройств:
1. Display Device Contexts — Позволяет рисовать в видео дисплее.
2. Printer — Операции рисования через принтер.
3. Memory — Для рисования в растровом изображении.
4. Information — Извлечение данных с устройств ПК.
При рисовании по окну программы, используется первый тип. Получить контекст дисплея можно с помощью следующую функцию:
HDC GetDC (
HWND hWnd
);
Данная функция возвращает переменную типа HDC, следовательно ее нужно создать для сохранения дескриптора устройства, через которое будет происходить рисование в окне. Функция принимает всего один аргумент типа HWND, в котором хранится дескриптор выбранного окна для рисования.
Следующий шаг это создания параметров кисти для рисования:
HPEN CreatePen(
int fnPenStyle,
int nWidth,
COLORREF crColor
);
Первый параметр fnPenStyle — это стиль рисования линии, второй nWidth — толщина толщина линии, третий crColor — цвет линии ( С помощью функции RGB(int,int,int) цвет легко регулировать смешивая три основных цвета).
Чтоб применить созданную кисть к рисованию линий, нужно привязать ее к контексту устройства HDC, если этого не сделать будет применена кисть по умолчанию :
HGDIOBJ SelectObject(
HDC hdc,
HGDIOBJ hgdiobj
);
Теперь когда все подготовлено можно задействовать любые функции которые рисуют все наборы линий и фигур из них. Для этого нужно выбрать первую точку отсчета функцией :
BOOL MoveToEx(
HDC hdc,
int X,
int Y,
LPPOINT lpPoint
);
Она принимает четыре параметра, первые три это контекст устройства HDC, два других координаты (x,y).
После создания главной точки можно рисовать любые фигуры, например линию функцией с параметрами HDC и двумя конечными точками линии:
BOOL LineTo(
HDC hdc,
int nXEnd,
int nYEnd
);
В целом, чтоб нарисовать простую линию, достаточно разместить эти строчки в любом месте откуда видна переменная hwnd, в которой хранится дескриптор окна:
Графика в оконных приложениях
Для рисования графических примитивов в оконных приложениях используются 4 основных типа объектов:
- точка (Pixel);
- перо (Pen);
- кисть (Brush);
- фон (Background).
Точка
Цвет точки задается с помощью функции
В случае удачного завершения возвращаемое значение функции дублирует цвет точки, в случае ошибки возвращает -1.
Цвет точки представляет собой 32-битное число, заданное в системе RGB:
Можно также воспользоваться функцией
Значения красного, зеленого и синего используются в диапазоне 0…255.
Перо используется для рисования линий и контуров замкнутых фигур. Цвет пера задается функцией
Стили пера fnPenStyle могут быть заданы согласно таблице
| Значение | Тип | Описание | |
| PS_SOLID | 0 | ![]() |
Сплошное перо |
| PS_DASH | 1 | ![]() |
Прерывистое (пунктирное) перо. |
| PS_DOT | 2 | ![]() |
Точечное (штриховое) перо. |
| PS_DASHDOT | 3 | ![]() |
Штрих-пунктир |
| PS_DASHDOTDOT | 4 | ![]() |
Две точки — пунктир |
| PS_NULL | 5 | Невидимое перо | |
При успешном завершении функция возвращает дескриптор пера, в случае неудачи — константу NULL .
Кисть
Кисть используется для закрашивания замкнутых объектов. Цвет кисти задается с помощью функции
При успешном завершении функция возвращает дескриптор кисти, в случае неудачи — константу NULL .
Эта же функция используется для задания цвета фона .
Можно заранее создать несколько кистей и перьев, а затем выбирать нужные с помощью функции
Рисование графических примитивов
Перемещение в указанную точку осуществляется функцией:
Координаты точки x и у определяются в пикселях относительно левого верхнего угла.
В случае успешного выполнения возвращает ненулевое значение.
Структура POINT имеет вид
Рисование отрезков осуществляется функцией:
В случае успешного выполнения возвращает ненулевое значение.
Рисование прямоугольника осуществляется функцией:
Рисование прямоугольника начинается из точки, в которую осуществлено перемещение с помощью функции MoveTo() .
В случае успешного выполнения возвращает ненулевое значение.
Рисование эллипса осуществляется функцией:
В случае успешного выполнения возвращает ненулевое значение.
Рисование дуги осуществляется функцией:
В случае успешного выполнения возвращает ненулевое значение.
Вывод текста в окно
Для вывода текста в поле окна используется функция
В случае успешного выполнения возвращает ненулевое значение.
Задать цвет фона под буквами можно с помощью функции
Задать цвет букв можно с помощью функции
В случае неудачного завершения эти функции возвращают константу CLR_INVALID=0xFFFF .
Использование графических функций
Для перерисовки окна, в котором будут отображаться графические объекты, будем использовать обработку сообщения WM_PAINT .
Обработка сообщения WM_PAINT почти всегда начинается с вызова функции:
При обработке вызова BeginPaint() , Windows обновляет фон рабочей области с помощью кисти, заданной в поле hbrBackground структуры WNDCLASS , описанной здесь. Вызов BeginPaint() делает всю рабочую область действительной (не требующей перерисовки) и возвращает описатель контекста устройства. Контекст устройства описывает физическое устройство вывода информации (например, экран) и его драйвер. Описатель контекста устройства необходим для вывода в рабочую область окна текста и графики.
- hwnd – дескриптор окна;
- lpPaint – указатель на структуру PAINTSTRUCT .
Структура PAINTSTRUCT имеет вид
- hdc – дескриптор контекста устройства.
- fErase – ненулевое значение стирает фон.
- rcPaint – структура RECT , определяющая верхний левый и нижний правый углы рабочей области.
Обработка сообщения WM_PAINT почти всегда заканчивается вызовом функции:
Функция EndPaint() освобождает описатель контекста устройства, после чего его значение нельзя использовать. Возвращает всегда ненулевое значение.
Получение дескриптора контекста устройства осуществляется вызовом функции:
hWnd – дескриптор окна, для которого используется контекст устройства.
Возвращаемое значение – дескриптор контекста устройства.
освобождает контекст устройства hDC для данного окна hWnd , после чего значение контекста устройства нельзя использовать. Возвращает всегда ненулевое значение.
Комментариев к записи: 3
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
<
switch (message)
<
//.
case WM_PAINT :
PaintAll(hwnd);
return 0;
case WM_ERASEBKGND:
return 0;
//.
>
return DefWindowProc (hwnd, message, wparam, lparam);
>
namespace e
<
extern HWND hpicturebox; // это окно где что-то рисуется
>
Система контроля спуска со склонов (HDC), что это такое?
Hill Descent Control (HDC), как она работает и помогает ли водителю?

Из всего перечня систем-помощников водителя нет более понятной по названию, чем система контроля спуска со склонов. Но понятное название не раскрывает технической сути оборудования, его важности для водителей.
Система разрабатывалась для класса внедорожников, но со временем ею стали комплектоваться паркетники и даже городские седаны, хэтчбеки, универсалы. Но нужно ли оборудование для контроля спуска со склонов, стоит ли за него платить деньги?
Как работает система
![]()
История системы контроля скорости при спуске со склонов гор началась давно. И с самого начала существования она неразлучна с технологией распределения тормозных усилий, более известной под аббревиатурой ABS. Она является ее клоном, так как использует ту же систему датчиков, управляющих модулей. Цель у систем одна – рациональное использование тормозных усилий. Единственное отличие – снижение нагрузки на водителя во время спуска. Также система контроля со спусков поддерживает постоянную скорость в активном состоянии.
На трассе, дороге общего пользования низкая тяговая нагрузка обеспечивает плавность хода автомобиля, что значительно увеличивает уровень безопасности водителя и пассажиров. Система контроля скорости на спусках дает такой же эффект при движении в сложных дорожных условиях. При помощи рационального распределения тормозных усилий обеспечивается плавность хода на склонах, поддерживается постоянная скорость. Для надежного сцепления с грунтом, дорожным покрытием тормозной потенциал каждого колеса используется индивидуально. Моментальное торможение позволяет избежать долговременной блокировки колес, что исключает возможность опасного скольжения.
У производителей автомобилей система контроля спуска со склона имеет разную аббревиатуру: DDS, HDS, DAC, но активируется она с помощью специальной кнопки или тумблера. На сыпучих грунтах, крутых склонах система полностью берет на себя функцию распределения тормозных усилий и дает возможность водителю сосредоточиться на маневрировании. Производителями предусматривается возможность ускорить или замедлить движение автомобиля во время спуска при активной системе контроля с помощью ручек или кнопок.
Система контроля скорости на склонах заменяет ручное управление тормозными механизмами. Она создает эффект тяговой силы пониженной передачи полноприводных систем. Именно он обеспечивает безопасное прохождение склонов, участков бездорожья, с его помощью водитель полностью контролирует автомобиль.
Нужна ли система, стоит ли за нее платить
![]()
Большинство производителей автомобилей комплектуют системой контроля скорости на склонах полноприводные модификации. Тут покупатель не платит за оборудование. В качестве примера такой экономичной рациональности можно привести Kia Sportage. Но есть модели, на которые система не устанавливается или предусмотрена только для продвинутых комплектаций.
Но как часто владельцы автомобилей пользуются контролем скорости на склонах? В большинстве случаев система просто простаивает. Исключением являются только фанаты путешествий и заездов в экстремальных дорожных условиях, когда без помощи автоматизированной системы не обойтись. Но простое наличие такой функции не несет вреда и станет надежным помощником при возникновении нештатной ситуации.




