Главная » C++, C++ Builder » Обработка измерения элемента C++ Builder

0

Вы, может быть, помните, что мы сделали список переменного owner-draw (ручной прорисовки) типа. Это заставит систему Windows  посылать  списку  сообщение  WM_MEASEUREITEM. CBuilder затем перенаправит это сообщение в обработчик MeasureItem для списка, который в свою очередь вызовет обработчик MeasureItem для родительского окна и для формы, если такие обработчики существуют. Так как мы создали обработчик события MeasureItem, то пора теперь его реализовать. Добавьте следующий код в обработчик события MeasureItem в исходном файле формы (Unit1.cpp):

void __fastcall TForm1::MeasureItem(TWinControl *Control, int Index,int &Height)

{

if ( FpFont )

ListBox1->Canvas->Font = FpFont;

// Получить высоту шрифта

Height = ListBox1->Canvas->TextHeight("M");

}

В этом методе мы сначала проверяем, выбрал ли пользователь шрифт для списка. Если это так, то свойству Font (шрифт) свойства Canvas списка присваивается это значение. Иначе свойство Font списка будет содержать значение шрифта по умолчанию в системе. Закончив с этим, мы используем метод TextHeight для вычисления высоты строки. Так как все символы в строке – одинакового шрифта, а Windows поддерживает шрифты только с одинаковой высотой,  то  мы можем брать высоту любого символа. Прописная M хорошо подходит для этого,  так  как  во- первых она хорошо смотрится в одиночестве, а кроме того M и W — самые широкие символы в любом шрифте. Вас, наверное, интересует, что стало со старым шрифтом (как объектом), который был связан со значением шрифта для свойства списка Canvas. В других системах вам пришлось бы получить этот старый шрифт, связанный с Canvas, затем удалить его, после чего установить новое значение. Тогда вам бы еще пришлось побеспокоиться о том, использовался ли этот объект еще где-либо в системе; если да, то программа бы рухнула при попытке обратиться к этому шрифту где-либо в другом месте. Не мучайтесь, CBuilder не дает вам напрямую изменять свойство Font в операции присваивания. Вместо этого вы заставляете систему вызвать метод Set для свойства Font объекта Canvas. Этот метод Set автоматически освободит объект Font, если это нужно, сберегая вам тем самым нервы и время. Это еще одна приятная вещь из так называемых расширений языка.

Источник: Теллес М. – Borland C++ Builder. Библиотека программиста – 1998

По теме:

  • Комментарии