Поняття про списках, промальовує власником C + + Builder

Списки, промальовує додатком, в якому вони створені, називаються owner-draw (промальовує власником) (це також відноситься до списками всередині компонентів) Називаються вони так тому, що код для їх промальовування надає їх власник (форма) Існує два види owner-draw списків Перший з них називається фіксованим owner-draw списком У такому списку всі елементи фіксованій (однаковою) висоти Майже всі списки, які ви знайдете у вашому додатку, будуть саме фіксованими

Другий вид owner-draw списків – змінні Цей вид списку дозволяє кожному рядку, іншими словами кожному елементу списку мати змінну висоту Приклад, який ми реалізуємо, буде відноситься саме до такого, змінному увазі Як ви побачите в прикладі, мати змінний розмір не означає, що елементи не можуть мати однакову висоту, просто є можливість робити елементи різними У нашому випадку ми збираємося зробити список змінним, щоб продемонструвати, як ви можете встановлювати розмір рядків у списку Хоча ми і будемо використовувати одну і ту ж висоту для всіх елементів, залежну від шрифту списку, приклад буде дуже легко пристосувати для використання багатьох шрифтів для різних елементів, у кожного з яких буде своя висота

Для реалізації owner-draw списку вам потрібно розуміти дещо про повідомлення Windows, які надсилаються за лаштунками діяльності списку При створенні такого списку два повідомлення Windows мають першорядну роль На щастя, VCL обробляє ці повідомлення в події, так що ви можете працювати через стандартну обробку подій Немає необхідності возитися з елементами карти повідомлень при роботі з owner-draw списками в CBuilder

Перше повідомлення, яке слід обробити для вашого списку – WM_MEASUREITEM,

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

Друге повідомлення, яке потрібно обробляти – WM_DRAWITEM Це повідомлення, яке транслюється в подія DrawItem, потрібно Windows для самої промальовування кожного елемента в списку Коли Windows визначає, що елемент повинен бути перемальований на поверхні списку, то для цього елемента викликається обробник події DrawItem Оброблювач буде викликатися неодноразово, при кожному перемальовуванні елемента На відміну від інших систем, VCL більшу частину owner-draw списку малює сама, так що вам достатньо реалізувати частини, унікальні у вашій формою додатка

Ці два повідомлення – єдині, про які треба подбати при створенні owner-draw списків Завдання в їх грамотному використанні Хоча це і не дуже важка проблема, звичайно простіше, щоб вам хтось показав, як це робиться, а потім ви б копіювали цей код в інші додатки Таке ставлення дуже важливо в CBuilder, і ми його будемо використовувати де тільки можна Не винаходити колесо, якщо хтось вже зробив роботу за вас Ви побачите, що хоча ви і вільні творити що завгодно, але все виходить швидше і простіше, коли ви відштовхуєтеся вже написаних, протестованих компонентах в системі, ніж коли ви більшу частину роботи робите самі

У цьому прикладі ми реалізуємо досить складний список Форма надасть вам можливість вибирати новий колір для елементів списку, так само як і новий шрифт Ми будемо завантажувати растрові картинки для відображення з лівого боку кожного елемента списку Коротше кажучи, ми, ймовірно, зробимо все, що ви могли уявити собі для ручної промальовування елементів списку Коли ви закінчите цей приклад, можете присвоїти собі почесне звання Майстра за Списками

Вихідний код для програми «Ручна промальовування списків» знаходиться на супровідному компакт-диску в каталозі Chapter4 \ OwnerDrawList

Форма, з якою ми будемо працювати в цьому додатку, наведена на рис 410 Створіть

просту форму і покладіть на неї список (list box), більш-менш отцентрировав його на формі Окрім списку, ми буде працювати з FontDialog (діалог установки шрифту) і ColorDialog (діалог установки кольору), а також з головним меню Додайте всі ці компоненти на форму в будь-якому місці Не забудьте поставити стиль списку в Owner-Draw Variable (змінної висоти з ручною промальовуванням), інакше код, який ми напишемо в цьому прикладі, що не буде правильно працювати Якщо ви напишіть весь цей код і в списку нічого правильного чи не виявиться (тільки текст), то перевірте значення цієї властивості у списку

Рис 410 Форма прикладу річний промальовування списку Модифікація заголовного файлу

У заголовки (Unit1h) нашого застосування потрібно внести кілька змін перед тим, як продовжити роботу над прикладом Ці зміни наведені в наступному лістингу Зміни, які вам потрібно зробити, виділені підсвічуванням:

//——————————————————–

#ifndef Unit1H

#define Unit1H

//——————————————————–

#include &ltvcl\Classeshpp&gt

#include &ltvcl\Controlshpp&gt

#include &ltvcl\StdCtrlshpp&gt

#include &ltvcl\Formshpp&gt

#include &ltvcl\Dialogshpp&gt

#include &ltvcl\Menushpp&gt

//——————————————————–

class TForm1 : public TForm

{

__published:  // IDE-managed Components TListBox *ListBox1

TFontDialog *FontDialog1

TColorDialog  *ColorDialog1 TMainMenu *MainMenu1 TMenuItem *Display1 TMenuItem *ChangeFont1 TMenuItem *ChangeColor1

private: // User declarations Tfont *FpFont

TCOlor *FcColor Graphics::TBitmap  *Fbmp1 Graphics::TBitmap  *Fbmp2 public:   // User declarations

virtual

fastcall TForm1(TComponent* Owner)

virtual     fastcall ~TForm1(void) void SetListBoxItems(void)

}

//———————————————————

extern TForm1 *Form1

//———————————————————

#endif

У цьому прикладі ми використовуємо парочку речей, яких раніше ми не використали По-перше, покажчик на обєкт TFont буде використаний для збереження шрифту, який ми будемо застосовувати до елементів списку Цей обєкт є спадщиною HFONT Windows і містить багато методів для роботи із зображенням тексту На щастя, нам не потрібно багато методів для роботи зі шрифтами, так як у системі CBuilder зі шрифтами легко мати справу Обєкт font буде використаний для отримання поточного шрифту з вікна діалогу вибору шрифту і для установки поточного шрифту в відображуваної області списку

Клас TFontDialog в CBuilder дозволяє користувачеві вибирати всі атрибути шрифту Користувач може вибирати імена шрифтів, розміри, атрибути (жирний, курсив, ..) для тексту і навіть подивитися приклад відображення тексту вибраним шрифтом Краща сторона шрифтового діалогу в тому, що вам нічого не потрібно з ним робити Тільки відобразити вікно діалогу, дозволити користувачеві вибрати в ньому шрифт і його атрибути, а потім отримати новий обєкт TFont з діалогу, коли той закриється Це величезне поліпшення в порівнянні з більш ранніми системами, в яких було потрібно не тільки зобразити вікно діалогу, але також і зібрати шрифт з частин, вибрані у вікні діалогу

Обєкт TColor – дуже простий обєкт (насправді це просто число), який містить визначення кольору в Windows Кольори в Windows діляться на дві дискретні категорії: реальні кольору і відносні кольору Реальні кольору, представлені через значення RGB (Red, Green, Blue: червоний, зелений, синій), часто використовуються для прямого завдання кольору для зображення В системі CBuilder вам не обовязково безпосередньо звязуватися з RGB-значеннями, так як CBuilder надає для цього випадку константи, як наприклад clRed (червоний) або clBlue (синій)

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

схемою Зрештою, ви повинні дозволити користувачеві змінювати кольори, які ви вибрали для свого додатку, під час роботи програми

Клас TColorDialog в CBuilder надає кошти для того, щоб користувач міг змінювати кольору Побудований на стандартному діалозі Windows 95/NT Color Dialog, він дозволяє або вибрати один із зумовлених кольорів, або визначити який-небудь новий Вам не потрібно хвилюватися на цю тему Ви просто відображаєте вікно діалогу, дозволяючи користувачеві вибрати відповідний колір, а потім використовуєте значення кольору, вбрання користувачем Кожен раз, коли ви вирішуєте використовувати нестандартний колір у вашому додатку, подумайте, чи варто дозволяти його змінювати Це істотно для таких речей, як промальовані вручну список, який зображує текст елемента вибраним кольором

Ми додали все, що потрібно пора час починати писати код для форми Давайте почнемо з конструктора форми Ось код, який потрібно додати в конструктор:

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

FcColor = clBlack FpFont = NULL

/ / Створюємо растрові зображення Fbmp1 = new Graphics :: TBitmap Fbmp1-> LoadFromFile (

&quotd:\\Cbuilder\\Cbuilder\\images\\icons\\earth16bmp&quot) Fbmp2 = new Graphics::TBitmap

Fbmp2-&gtLoadFromFile( &quotd:\\Cbuilder\\Cbuilder\\images\\icons\\ship16bmp&quot)

}

У першу чергу код присвоює властивостям списку шрифт і колір деякі значення за замовчуванням Ми будемо використовувати обєкт FcColor для зберігання кольору для відображення тексту, FpFont – для шрифту За замовчуванням ми беремо чорний колір для тексту Шрифт буде встановлений в NULL, що означатиме в нашій програмі, що користувач не вибрав ніякого шрифту Як і всі нормальні компоненти, область промальовування (canvas) списку має значення для шрифта і буде його використовувати, якщо ми не поставимо шрифт під час роботи програми

Джерело: Теллес М – Borland C + + Builder Бібліотека програміста – 1998

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*