Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекція № 15.doc
Скачиваний:
0
Добавлен:
16.12.2018
Размер:
58.88 Кб
Скачать

Графічні координати

У тільки що створеного контексту пристрою (DC) одиницями координат за умовчанням є пікселі або одиниці пристрою. Згодом всю систему координат можна змінити і використовувати дюйми, сантиметри або одиниці точок принтера. Масштаб зображення також можна змінити або довільно, або за розміром листа. Стандартними одиницями вимірювання є одиниці пристрою (пікселі). З погляду атрибутів контексту пристрою цей режим відображення відомий як Мм_техт.

Стандартною початковою точкою (тобто координатами 0, 0) є верхній лівий кут поверхні промальовування, що на екрані відповідає верхньому лівому куту клієнтської області вікна. На друкарській сторінці це відповідає самому верхньому лівому куту листа, де можливо нанести зображення (не забувайте про поля). Подібно до того, як можна змінити систему координат, цілком можливо змінити і розташування їх початкової точки, але в прикладах цього розділу, проте, використовується початкова точка, задана за умовчанням.

Стандартний напрям руху по осях х і у декілька відрізняється від прийнятого в Декартової системи координат. Прийнята за умовчанням система координат вікна називається координатами клієнтської області (client-area coordinates). Оскільки для положення курсора миші використовується та ж сама система координат, що і для клієнтської області вікна, розпізнати клацання миші на розташованому у вікні об'єкті виявляється значно простішим.

Передача повідомлення wm_paint

Представляючи повідомлення WM_PAINT, автор підкреслив, що це найбільш важливе повідомлення з погляду графіки. Нагадаємо, що вікно може отримувати це повідомлення по найрізноманітніших приводах: коли, наприклад, одне вікно, що частково закривало інше, було переміщене або видалене, коли вікно було відновлене після згортання, був змінений розмір вікна і так далі Насправді, причина не така важлива. У будь-якому випадку це повідомлення свідчить про необхідність перемальовування всіх частин вікна.

Але в деяких випадках причиною повідомлення про необхідність перемальовування є не зовнішній чинник, такий, наприклад, як зміна користувачем розміру вікна, а внутрішній, який не так те і просто розпізнати. Наприклад, користувач міг би ввести який або текст у вікні поля введення, додати або видалити стовпець даних з вікна електронної таблиці. Будь-яка внутрішня причина, пов'язана із зміною що відображаються у вікні даних, повинна приводити до передачі повідомлення про перемальовування.

Щоб передати повідомлення про необхідність перемальовування, досить оголосити вміст вікна неприпустимим (invalid) або, кажучи простіше, застарілим. Це можна зробити за допомогою декількох різних функцій-членів класу CWnd. Найпростішою з них є функція Invalidate, оскільки їй передається тільки один параметр логічного типу (Boolean), вказуючий на необхідність очищення області вікна перед промальовуванням. Приведений нижче приклад виклику цієї функції оголошує неприпустимою всю клієнтську область вікна:

// Перемальовування всього вікна з попередньою

// очищенням його вмісту.

Invalidate(TRUE);

Іншою функцією, що генерує повідомлення про необхідність перемальовування є InvalidateRect, яка дозволяє вказати прямокутник, що підлягає перемальовуванню. На ^достаточно швидкодіючих апаратних засобах це дозволяє зменшити неже-чательное мерехтіння экранна (flicker). Але незалежно від потужності апаратних ;редств краще залишатися консервативним і, по можливості, запрошувати перемальовування шшь необхідних ділянок, оскільки дуже часте мерехтіння екрану дратує користувачів. З погляду ергономіки таке мерехтіння украй небажано, оскільки викликає втому очей, а отже, не тільки дратує користувачів, але і вимушує їх при турботі з таким програмним забезпеченням частіше робити перерви. Отже, щоб запитати юобшение про перемальовування для прямокутника, обмеженого координатами (10, 10) і (IQQ, 100), необхідно зробити наступне:

Визначити неприпустимий прямокутник

// і передати повідомлення про необхідність перемальовування

CRect rectUO, 10, 100, 100);

InvalidateRect{Srect, TRUE);

В порівнянні з іншими типами повідомлень (наприклад, про події миші або введення з клавіатури) повідомлення про необхідність перемальовування мають дуже низький пріоритет. Врешті-решт, якщо дані міняються часто і у великих кількостях, то в додаткових питаннях на перемальовування особливої необхідності немає. Після того, як стан вікна буде оголошений неприпустимим, воно цілком може встигнути отримати (і обробити) дещо інших повідомлень, перш ніж поступить повідомлення WM_PAINT.

В деяких випадках виявляється необхідним підняти пріоритет повідомлення WM_PAINT. Щоб відправити повідомлення про необхідність перемальовування негайно, можна викликати функцію UpdateWindow. Наприклад, за бажання, можна викликати функцію Invalidate, щоб запитати повідомлення про перемальовування, а потім негайно модифікувати вікно. Не так вже і рідко доводиться оголошувати частину вікна неприпустимою і відразу передавати повідомлення про необхідність її перемальовування. Для цього застосовується наступний код:

InvalidateRect( SRect, TRUE );

UpdateWindow ();

Таким чином, коли зображення у вікні изменено7, відповідну область вікна, що підлягає зміні, оголошують такою, що знаходиться в неприпустимому стані. Ця область перемальовує під час вступу чергового повідомлення WM_PAINT. Звернення до функції UpdateWindow не оголошує частину вікна неприпустимою, ця функція лише прискорює перемальовування області, вже оголошене що знаходиться в неприпустимому стані. Але якщо такої області немає, то звернення до функції UpdateWindow ніяк не вплине на вміст вікна. Консервативна політика перемальовування Windows обмежує промальовування виділеним прямокутником, тобто тільки тією частиною вікна, яка є неприпустимою.

Як уже згадувалося, виклик функції UpdateWindow приводить до негайного перемальовування, і подальше малювання можна здійснювати у вікні, що є допустимим. Але це має сенс тільки тоді, коли промальовування здійснюється у відповідь на повідомлення, відмінне від WM_PAINT. Наступний розділ присвячений опису того, як це можна зробити, а також обговоренню деяких проблем, пов'язаних з подібним підходом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]