Каретка (НЕ курсор)

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

Програма KEYLOOK викликає ці дві функції всюди, де вона отримує контекст пристрої. Це відбувається в трьох місцях: в функції ShowKey. при обробці повідомлення WM_CREATE в WndProc і при обробці повідомлення WM_PAINT. Функція GetStockObject отримує описатель стандартного графічного об'єкта, яким є фіксований шрифт, який використовується в ранніх версіях Windows, які передували Windows 3.0. Виклик функції SelectObject вибирає цей об'єкт в контекст пристрою. Завдяки цьому виклику, весь текст буде виводитися на екран фіксованим шрифтом. Повернутися назад до пропорційного шрифту можна за допомогою функції:

Функція ShowKey викликає ScrollWindow для прокрутки вгору попередніх рядків перед виведенням нового рядка. Зазвичай це призводить до того, що частина вікна стає недійсною, і отже генерується повідомлення WM_PAINT. Для того, щоб цього уникнути, в функцію ShowKey включений виклик функції

Програма KEYLOOK не зберігає отримані апаратні повідомлення клавіатури, тому після отримання повідомлення WM_PAINT вона не може перемалювати вікно. З цієї причини KEYLOOK просто виводить заголовок таблиці у верхній частині робочої області при обробці повідомлення WM_PAINT. Перед викликом функції BeginPaint. при обробці повідомлення WM_PAINT, KEYLOOK робить недійсним все вікно. Це дозволяє стерти всі вікно, замість того, щоб прати недійсний прямокутник.

(Те, що програма KEYLOOK не зберігає отримані апаратні повідомлення клавіатури, і отже не може перемалювати вікно, поки обробляється повідомлення WM_PAINT, безсумнівно є недоліком. У програмі TYPER, показаної далі в цій главі, ця недолік усунуто.)

Вгорі робочої області програма KEYLOOK малює заголовок таблиці і, таким чином, ідентифікує дев'ять стовпців. Хоча можна створити шрифт, в якому символи будуть підкреслені, тут застосовується трохи інший підхід. Визначено дві змінні типу рядок символів, які називаються szTop (в ній міститься текст) і szUnd (в ній містяться символи підкреслення) і при обробці повідомлення WM_PAINT вони виводяться в одну і ту ж позицію у верхній частині вікна. Зазвичай Windows виводить текст в режимі "opaque", що означає, що Windows оновлює область фону символу при його виведенні на екран. Використання цього режиму фону може привести до того, що друга символьний рядок (szUnd) зітре першу (szTop). Щоб запобігти цьому, переведіть контекст пристрою в режим "transparent" (режим без заповнення фону символів):

Коли ви в програмі набираєте текст, зазвичай маленький символ підкреслення або маленький чотирикутник показує вам місце, де наступний набирається вами символ з'явиться на екрані. Ви можете вважати, що це курсор (cursor), але, якщо ви програмуєте для Windows, необхідно відмовитися від такого уявлення. У Windows це називається "каретка" (caret). Слово ж "курсор" відноситься до битовому образу, що відбиває стан миші на екрані.

Функції роботи з кареткою

Тут перераховані п'ять основних функцій роботи з кареткою:

• CreateCaret - створює пов'язану з вікном каретку.

• SetCaretPos - встановлює положення каретки в вікні.

• ShowCaret - показує каретку.

• HideCaret - ховає каретку.

• DestroyCaret - видаляє каретку.

Крім цих, ще є функція отримання положення каретки (GetCaretPos) і функції установки і отримання частоти миготіння каретки (GetCaretBlinkTime) і (SetCaretBlinkTime).

Каретка - це зазвичай горизонтальна риска або прямокутник, що мають розмір символу, або вертикальна риска. Вертикальна риска рекомендується при використанні пропорційного шрифту, такого як пропонований за замовчуванням системний шрифт Windows. Оскільки розмір символів пропорційного шрифту не фіксований, горизонтальної риски і прямокутника неможливо задати розмір символу.

Ви не можете просто створити каретку при обробці повідомлення WM_CREATE і видалити її при обробці повідомлення WM_DESTROY. Каретка - це те, що називається "загальносистемних ресурсом" (systemwide resource). Це означає, що в системі є тільки одна каретка. І, як результат, програма при необхідності виведення каретки на екран свого вікна "запозичує" її у системи.

Обробляючи повідомлення WM_SETFOCUS і WM_KILLFOCUS, програма може визначити, чи має вона фокус введення. Віконна процедура отримує повідомлення WM_SETFOCUS, коли отримує фокус введення, а повідомлення WM_KILLFOCUS, коли втрачає фокус введення. Ці повідомлення приходять попарно: віконна процедура отримує повідомлення WM_SETFOCUS завжди до того, як отримає повідомлення WM_KILLFOCUS, і вона завжди отримує однакову кількість повідомлень WM_SETFOCUS і WM_KILLFOCUS за час існування вікна.

Основне правило використання каретки виглядає просто: віконна процедура викликає функцію CreateCaret при обробці повідомлення WM_SETFOCUS і функцію DestroyCaret при обробці повідомлення WM_KILLFOCUS.

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

програма TYPER

GetStockObject і SelectObject.

При обробці повідомлення WM_SIZE програма TYPER розраховує ширину і висоту вікна в символах і зберігає ці значення в змінних cxBuffer і cyBuffer. Потім вона використовує функцію malloc. щоб виділити буфер для зберігання всіх символів, які можуть бути надруковані у вікні. У змінних xCaret і yCaret зберігається положення каретки в символах.

При обробці повідомлення WM_SETFOCUS програма TYPER викликає функцію CreateCaret для створення каретки, що має ширину і висоту символу, функцію SetCaretPos для установки положення каретки і функцію ShowCaret. щоб зробити каретку видимою. При обробці повідомлення WM_KILLFOCUS програма викликає функції HideCaret і DestroyCaret.

# TYPER.MAK make file

$ (LINKER) $ (GUIFLAGS) -OUT: typer.exe typer.obj $ (GUILIBS)

$ (CC) $ (CFLAGS) typer.c