Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Види контексту відображення
Існують наступні види контексту відображення: - загальний; - для класу вікон; - особистий; - батьківський; - для вікна. Способи одержання та вивільнення контексту відображення залежать від його виду. Кожен контекст має свої особливості і призначення. Загальний контекст відображення. Цей контекст відрізняє вища швидкість доступу до нього. Приклад. Задача. При обробці повідомлення WM_PAINT в центрі робочої області вікна маліновим кольором шрифта на кремовому фоні вивести рядок " Вивід при обробці повідомлення WM_PAINT". Після натискання лівої кнопки миші на 60 пікселів вище синім кольором шрифта на жовтому фоні вивести рядок " Вивід при обробці повідомлення WM_LBUTTONDOWN" Розв‘язок (вивід тексту при обробці різних повідомлень). #include " Functions.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstance; char szClass[]=" OutputClass"; INT WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, PSTR, INT nCmdShow) {MSG msg; HWND hwnd;:: hInstance=hInstance; if (! RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE; hwnd=CreateWindow (szClass, " Виведення текту", WS_OVERLAPPEDWINDOW| WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (! hwnd) return FALSE; while (GetMessage(& msg, NULL, 0, 0)) DispatchMessage(& msg); return(int)msg.wParam; } 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: {char szText[]=" Виведення при обробці повідомлення WM_PAINT"; PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd, & ps); // Кольором виведення символів обираємо малиновий SetTextColor(hdc, RGB(255, 0, 255)); // Кольором фону виведення символів обираємо червоний SetBkColor(hdc, RGB(255, 251, 240)); SetTextAlign(hdc, TA_CENTER); TextOut(hdc, cx/2, cy/2, szText, strlen(szText)); EndPaint(hwnd, & ps); return 0; } case WM_LBUTTONDOWN: {char szText[]=" Виведення при обробці повідомлення WM_LBUTTONDOWN"; HDC hdc=GetDC(hwnd); // Кольором виведення символів обираємо синій SetTextColor(hdc, RGB(0, 0, 255)); // Кольором фону виведення символів обираємо жовтий SetBkColor(hdc, RGB(255, 255, 0)); SetTextAlign(hdc, TA_CENTER); TextOut(hdc, cx/2, cy/2-60, szText, strlen(szText)); ReleaseDC(hwnd, hdc); return 0; } case WM_DESTROY: {PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); } Контекст відображення для класу вікон. Можна створити єдиний контекст відображення для всіх вікон деякого класу. Для цього при реєстрації класу вказують стиль CS_CLASSDC. Тоді всі вікна цього класу будуть користуватись одним загальним контекстом відображення. Додатки, одержавши один раз контекст відображення для класу вікон, можуть не звільняти його. Виклик функцій EndPaint i ReleaseDC не звільняють такий контекст. Для збереження єдиного стилю роботи рекомендується викликати ці функції. Контекст відображення для класу вікон створюють один раз. Якщо створено декілька вікон цього класу, область обмеження і початок системи фізичних координат виводу автоматично налагоджуються на те вікно, яке використовує контекст відображення. Але, якщо на базі класу стилю CS_CLASSDC додаток створив лише одне вікно, воно може одержати контекст відображення для класу вікон один раз і не вивільняти його. Таким чином, контекст відображення для класу вікон підвищує продуктивність виводу у вікно тим, що не вимагає налагодження чисельних атрибутів контексту відображення після кожного виклику функції BeginPaint i EndPaint. Приклад. Задача. Для вікон класу стилю CS_CLASSDC створити єдиний контекст і встановити його атрибути за замовчуванням. Після натискання лівої кнопки миші змінити атрибути контексту, а після натискання правої кнопки - відновити початкові значення атрибутів. Розв‘язок (встановлення атрибутів контексту для класу за замовчуванням, зміна атрибутів та відновлення їх початкових значень). #include " Functions.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); Void ContAttr(HWND hwnd); HINSTANCE hInstance; char szClass[]=" OutputClass"; INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT nCmdShow) {MSG msg; HWND hwnd1, hwnd2;:: hInstance=hInstance; if (! RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE; hwnd1=CreateWindow (szClass, " Перше вікно", WS_OVERLAPPEDWINDOW| WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (! hwnd1) return FALSE; hwnd2=CreateWindow (szClass, " Друге вікно", WS_OVERLAPPEDWINDOW| WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (! hwnd2) return FALSE; //Встановлюємо почтаокві атрибути контексту ContAttr(hwnd1); while (GetMessage(& msg, NULL, 0, 0)) DispatchMessage(& msg); return(int)msg.wParam; } 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: {char szText[]=" Виведення з атрибутами контексту класу"; PAINTSTRUCT ps; HDC hdc=BeginPaint(hwnd, & ps); TextOut(hdc, cx/2, cy/2, szText, strlen(szText)); EndPaint(hwnd, & ps); return 0; } case WM_LBUTTONDOWN: {char szText[]=" Змінюємо атрибути контексту класу і виводимо"; HDC hdc=GetDC(hwnd); // Кольором виведення символів обираємо малиновий SetTextColor(hdc, RGB(255, 0, 255)); // Кольором фону виведення символів обираємо кремовий SetBkColor(hdc, RGB(255, 251, 240)); SetTextAlign(hdc, TA_CENTER); TextOut(hdc, cx/2, cy/2-60, szText, strlen(szText)); ReleaseDC(hwnd, hdc); return 0; } case WM_RBUTTONDOWN: { //Відновлюємо атрибути контексту ContAttr(hwnd); char szText[]=" Відновлюємо атрибути контексту класу і виводимо"; HDC hdc=GetDC(hwnd); TextOut(hdc, cx/2, cy/2+60, szText, strlen(szText)); ReleaseDC(hwnd, hdc); return 0; } case WM_DESTROY: {PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); } void ContAttr(HWND hwnd) {HDC hdc=GetDC(hwnd); // Кольором виведення символів обираємо синій SetTextColor(hdc, RGB(0, 0, 255)); // Кольором фону виведення символів обираємо жовтий SetBkColor(hdc, RGB(255, 255, 0)); SetTextAlign(hdc, TA_CENTER); ReleaseDC(hwnd, hdc); } Особистий контекст відображення. Цей контекст мають вікна класу зі стилем CS_OWNDC. Його одержують один раз і налагооджують атрибути, а звільняють лише при завершенні роботи додатку. Функції BeginPaint, EndPaint, GetDC, ReleaseDC не впливають на особистий контекст. Особистий контекст економить витрату оперативної пам'яті. Батьківський контекст відображення. Цей контекст використовує дочірні вікна. Він дозволяє їм " успадкувати" атрибути контексту відображення батьківського вікна. Контекст відображення для вікна. Попередні контексти дозволяють малювати лише в робочій області вікна. Контекст відображення для вікна дозволяє малювати в будь-якому місці - в області заголовку, системного меню, рамок, кнопко зміни розміру, …. Контекст відображення для вікна одержують за дпомогою функції GetWindowDC. Далі він використовується аналогічно загальному контексту відображення. Початок системи координат знаходиться в лівому верхньому куті вікна, а не в робочій області. Приклад. Задача. Заголовок вікна вивести червоним шрифтом. Розв‘язок (вивід в область заголовку вікна). #include " Functions.h" LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HINSTANCE hInstance; char szClass[]=" MyCaption"; INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT nCmdShow) {MSG msg; HWND hwnd;:: hInstance=hInstance; if (! RegClass(WndProc, szClass, COLOR_WINDOW)) return FALSE; hwnd=CreateWindow (szClass, NULL, WS_OVERLAPPEDWINDOW| WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, NULL); if (! hwnd) return FALSE; while (GetMessage(& msg, NULL, 0, 0)) DispatchMessage(& msg); return(int)msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {static short cx, cy; switch (msg) { case WM_CREATE: { // Визначаємо висоту заголовку вікна nCap=GetSystemMetrics(SM_CYCAPTION); // Визначаємо товщину рамки вікна nFr=GetSystemMetrics(SM_CYFRAME); l=nCap+nFr; t=(int)1.5*nFr; return 0; } case WM_MOVE: case WM_SIZE: {char szCap[]=" Мій заголовок вікна"; HDC hdc=GetWindowDC(hwnd); // Встановлення атрибутів виведення і виведення тексту SetTextColor(hdc, RGB(255, 0, 0)); SetBkMode(hdc, TRANSPARENT); TextOut(hdc, l, t, szCap, strlen(szCap)); ReleaseDC(hwnd, hdc); return 0; } case WM_DESTROY: {PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); }
|