- •Лекция №4. Gdi – графический интерфейс устройства.
- •Контекст устройства
- •Отсеченный путь
- •Этот метод используется при обработке сообщения wm_paint. Контекст устройства получают вызовом функции BeginPaint, имеющей следующий прототип:
- •Пример: в центре рабочей области окна вывести текст.
- •Использование сообщения wm_paint
- •Функция ValidateRect
- •Пример 2.
- •Частные контексты устройства
- •Операции контекста устройства
- •Режимы отображения.
- •Отображаем картинку в окне:
Пример 2.
В центре рабочей области окна вывести строку «Текст по умолчанию». После нажатия левой клавиши мыши содержимое этой строки сменить на текст «Нажата левая клавиша мыши», после нажатия правой клавиши вывести текст «Нажата правая клавиша мыши».
_________________________________________________________________________
#include <windows.h>
bool RegClass(WNDPROC,LPCTSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE hInstance;
char szMainClass[]="MainClass";
char szText[50]="Текст по умолчанию";
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,
LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
hInstance=hInst;
HWND hwnd;
if (!RegClass(WndProc,szMainClass,COLOR_WINDOW))
return FALSE;
hwnd=CreateWindow(szMainClass,"Вывод текста",WS_OVERLAPPEDWINDOW|WS_CAPTION|
WS_MINIMIZEBOX|WS_VISIBLE,0,0,500,500,0,0,hInstance,NULL);
/* CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT*/
if (!hwnd) return FALSE;
while (GetMessage(&msg,0,0,0))
DispatchMessage(&msg);
return msg.wParam;
}
bool RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground)
{
WNDCLASS wc;
wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=wc.cbWndExtra=0;
wc.lpfnWndProc=Proc;
wc.hInstance=hInstance;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(brBackground+1);
wc.lpszMenuName=(LPCTSTR)NULL;
wc.lpszClassName=szName;
return (RegisterClass(&wc)!=0);
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static short cx,cy;
switch(msg)
{
case WM_SIZE:
{cx=LOWORD(lParam);
cy=HIWORD(lParam);
return 0;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc=BeginPaint(hwnd,&ps);
SetTextColor(hdc,RGB(255,0,0));
SetBkColor(hdc,RGB(0,255,255));
SetTextAlign(hdc,TA_CENTER);
TextOut(hdc,cx/2,cy/2,szText,strlen(szText));
EndPaint(hwnd,&ps);
return 0;
}
case WM_LBUTTONDOWN:
{
strcpy(szText,"Нажата левая клавиша мыши");
InvalidateRect(hwnd,NULL,TRUE);
return 0;
}
case WM_RBUTTONDOWN:
{
strcpy(szText,"Нажата правая клавиша мыши");
InvalidateRect(hwnd,NULL,TRUE);
return 0;
}
case WM_DESTROY:
{PostQuitMessage(0); return 0;}
}
return DefWindowProc(hwnd,msg,wParam,lParam);
}
____________________________________________________________________________
Имеется три типа контекстов устройств для видеодисплеев:
1) Класса (Class)
2) Общий (Common)
3) Частный (Private)
Контексты устройства класса
Контексты устройства класса (class device contexts) поддерживаются строго для совместимости с 16-битовыми версиями Windows. В приложении вместо контекста устройства класса необходимо использовать частный контекст устройства.
Общие контексты устройства
Общие контексты устройства (common device contexts) - это дисплейные контексты устройства (DC) , которые сохраняются в специальном КЭШе системы. Общие контексты устройства используются в прикладных программах, которые выполняют нечастые операции рисования. Прежде, чем система возвратит дескриптор DC, она инициализирует общий контекст устройства с заданными по умолчанию объектами, атрибутами и режимами. Любые операции рисования, выполняемые приложением, используют эти значения по умолчанию, до тех пор, пока не будет вызвана одна из функций GDI, чтобы выбрать новый объект, изменить атрибуты существующего объекта, или выбирать новый режим.
Поскольку существует только ограниченное число общих контекстов устройства, приложение должно освобождать их после того, как оно закончило рисование. Когда приложение освобождает общий контекст устройства, любые изменения заданных по умолчанию данных, теряются.
