Создание странного меню DELPHI
Переводчик: Ли Цзюньюй, электронная почта: [email protected], [email protected]
Пользовательские меню, текст, строки / Delphi 4, 5
Пользовательское меню, текст, строка/Delphi 4, 5
Необычные меню и т. д.
Странное меню и т.д.
Пользовательские меню, повернутый текст и специальные линии
Настраиваемые меню, повернутый текст и специальные линии.
До Delphi 4 было сложно настраивать меню (добавлять растровое изображение, менять шрифт и т. д.), поскольку рисунок владельца (т. е. пользовательский рисунок) — хотя и реализованный в Windows — не был доступен классу TMainMenu. Начиная с Delphi 4, Однако эта ситуация исправлена, и мы можем добиться своего с меню.
До Delphi 4 было сложно настроить меню (например, добавить изображение BMP, изменить шрифт и т. д.), поскольку событие рисования владельца (то есть пользовательское событие рисования), хотя и выполняется Windows, не появляется в Класс TMainMenu Начиная с Delphi 4.
Ситуация изменилась, и теперь у нас есть возможность настраивать меню.
В этой статье будут описаны некоторые приемы, которые можно использовать для настройки внешнего вида меню в приложениях Delphi. В этой статье мы обсудим размещение текста, размер меню, назначение шрифтов, а также использование растровых изображений и фигур для улучшения внешнего вида меню. также представлены методы создания повернутого текста и пользовательских линий. Все методы, обсуждаемые в этой статье, продемонстрированы в файлах PROjects, доступных для загрузки.
В этой статье основное внимание будет уделено некоторым методам, которые можно использовать для настройки внешнего вида меню в приложениях DELPHI. Мы рассмотрим размещение текста, размер меню, настройки шрифтов и улучшения с помощью файлов BMP и элемента управления SHAPE. . Просто ради развлечения в этой статье также будут подробно рассмотрены методы вращения текста и пользовательских линий. Все методы, обсуждаемые в этой статье, отлажены в файлах проекта и могут быть загружены в Интернете.
Пользовательские шрифты и размеры
Установить шрифт и размер
Чтобы создать пользовательское меню, установите для свойства OwnerDraw компонента меню -TMainMenu или TPopupMenu - значение True и укажите обработчики событий для его событий OnDrawItem и OnMeasureItem. Например, обработчик событий OnMeasureItem объявляется следующим образом:
Чтобы создать настраиваемое меню, установите для свойства OwnerDraw компонента TmainMenu или TpopupMenu значение TRUE и создайте его процедуры событий OnDrawItem и OnMeasureItem. Например, процедуру события OnMeasureItem можно объявить следующим образом:
процедура TForm1.Option1MeasureItem(Отправитель: TObject;
ACanvas: TCanvas; var Ширина, Высота: Целое число);
Задайте переменные Width и Height, чтобы настроить размер пункта меню. Обработчик событий OnDrawItem — это место, где выполняется вся тяжелая работа; именно здесь вы рисуете меню и выполняете любые специальные настройки, чтобы нарисовать пункт меню шрифтом Times New Roman. , например, вам следует сделать что-то вроде этого:
Установите соответствующие размеры переменных Width и Height элемента меню в описанной выше процедуре события. Все основные действия запускаются событием OnDrawItem; здесь вы можете перерисовать меню и выполнить любые специальные настройки. Например, чтобы перерисовать пункт меню шрифтом Times New Roman, вам нужно сделать следующее:
процедура TForm1.Times1DrawItem(Отправитель: TObject;
ACanvas: TCanvas; ARect: TRect Выбрано: Boolean);
начинать
ACanvas.Font.Name := 'Times New Roman';
ACanvas.TextOut(ARect.Left+1, ARect.Top+1,
(Отправитель как TMenuItem).Caption);
конец;
Однако этот код несовершенен. Если он запущен, заголовок меню будет выровнен по левой границе меню. Обычно это не поведение Windows по умолчанию, в меню есть место для размещения растровых изображений и галочек. вам следует рассчитать пространство, необходимое для этой галочки, с помощью кода, подобного показанному на рисунке 1. На рисунке 2 показано полученное меню.
Однако этот код ошибочен. Если вы запустите этот код, заголовок пункта меню будет выровнен по левому краю элемента меню. Это не стандартное поведение Windows. Обычно в левой части меню есть место для изображения BMP и выбора. отметка. Поэтому вам следует использовать код, чтобы вычислить, сколько места необходимо для размещения флага выбора, как показано на рисунке 1. На рис. 2 показано меню в действии.
процедура TForm1.Times2DrawItem (Отправитель: TObject;
ACanvas: TCanvas; ARect: TRect Выбрано: Boolean);
вар
dwCheck: Целое число;
MenuCaption: строка;
начинать
// Получаем размеры галочки.
Получите количество пикселей, необходимое для логотипа выбора.
dwCheck: = GetSystemMetrics(SM_CXMENUCHECK);
// Корректируем левое положение.
Отрегулируйте левое положение
ARect.Left := ARect.Left + LoWord(dwCheck) + 1;
MenuCaption := (Отправитель как TMenuItem).Caption;
// Имя шрифта — это заголовок меню.
ACanvas.Font.Name := 'Times New Roman';
// Рисуем текст.
нарисовать текст
DrawText(ACanvas.Handle, PChar(MenuCaption),
Длина(MenuCaption), ARect, 0);
конец;
Рис. 1. Обработчик событий OnDrawItem правильно размещает текст пункта меню.
[Переводчик опустил все рисунки, то же самое ниже]
Рис. 2. Меню, нарисованное с использованием пользовательских шрифтов.
Если текст слишком велик для отображения в меню, Windows обрежет его по размеру. Поэтому вам следует установить размер элемента меню так, чтобы можно было отобразить весь текст. Это роль обработчика событий OnMeasureItem, показанного на рисунке 3. .
Если текст слишком длинный, Windows автоматически обрежет его по размеру. Поэтому вам следует выбирать размер меню так, чтобы можно было отобразить весь текст. То же самое должно быть и в событии OnMeasureItem, которое можно увидеть на рисунке 3.
процедура TForm1.Times2MeasureItem(Отправитель: TObject;
ACanvas: TCanvas; var Ширина, Высота: Целое число);
начинать
ACanvas.Font.Name := 'Times New Roman';
ACanvas.Font.Style := [];
// Ширина — это пространство проверки меню
Эта длина равна длине метки выбора меню.
// плюс ширина текста элемента.
Плюс длина пункта меню
Ширина: = GetSystemMetrics(SM_CXMENUCHECK) +
ACanvas.TextWidth((Отправитель как TMenuItem).Caption) + 2;
Высота: = ACanvas.TextHeight(
(Отправитель как TMenuItem).Caption) + 2;
конец;
Рис. 3. Обработчик событий OnMeasureItem гарантирует, что элемент помещается в свое меню.
Пользовательские фигуры и растровые изображения
Настройка графики и растровых изображений
Также можно настроить элементы меню, включая растровые изображения или другие фигуры. Чтобы добавить растровое изображение, просто назначьте файл растрового изображения свойству TMenuItem.Bitmap — с помощью инспектора объектов во время разработки или с помощью кода во время выполнения. в качестве заголовка пункта меню вы можете использовать обработчик событий OnDrawItem, показанный на рисунке 4. На рисунке 5 показан результат.
Можно настроить меню с растровыми изображениями и другой графикой. Чтобы добавить растровое изображение, просто назначьте файл BMP свойству Bitmap TmenuItem в инспекторе объектов во время разработки или используйте код во время выполнения. Чтобы заменить заголовок меню цветным прямоугольником, вы можете использовать событие OnDrawItem, как показано на рисунке 4. На рисунке 5 показаны результаты.
процедура TForm1.ColorDrawItem(Отправитель: TObject;
ACanvas: TCanvas; ARect: TRect Выбрано: Boolean);
вар
dwCheck: Целое число;
Цвет Меню: TColor;
начинать
// Получаем размеры галочки.
dwCheck: = GetSystemMetrics(SM_CXMENUCHECK);
ARect.Left := ARect.Left + LoWord(dwCheck);
// Преобразуем заголовок пункта меню в цвет.
Преобразовать заголовок пункта меню в цвет
Цвет Меню :=
StringToColor((Отправитель как TMenuItem).Caption);
// Изменяем цвет кисти холста.
Изменить цвет кисти холста
ACanvas.Brush.Color := MenuColor;
// Рисует прямоугольник, если элемент выбран.
Рисует прямоугольник, если выбран пункт меню
// рисуем границу.
рисовать границы
если выбрано, то
ACanvas.Pen.Style := psSolid
еще
ACanvas.Pen.Style := psClear;
ACanvas.Rectangle(ARect.Left, ARect.Top,
ARect.Right, ARect.Bottom);
конец;
Рис. 4. Использование события OnDrawItem для рисования цветных прямоугольников на пунктах меню.
Рис. 5. Меню с цветными прямоугольниками в качестве элементов.
Есть только одна загвоздка: если вы используете Delphi 5, вы должны установить для свойства AutoHotkeys меню значение maManual. Если вы оставите значение по умолчанию, maAutomatic, Delphi добавит к заголовку символ амперсанда (&), что нарушит это правило. Другое решение — удалить амперсанд с помощью функции StripHotKey.
Более популярный подход заключается в том, что если вы используете Delphi 5, вам следует установить для свойства AutoHotkeys меню значение maManual. Если вы не сделаете этого и оставите значение maAutomatic по умолчанию, Delphi автоматически добавит амперсанд к заголовку, что нарушит код. Другое решение — использовать функцию StripHotKey для удаления амперсанда.
Другой способ использования событий OnDrawItem и OnMeasureItem — вертикальное написание текста в меню (как показано на рисунке 7). Для этого необходимо создать повернутый шрифт. Это возможно только с помощью функции Windows API CreateFont или CreateLogFont (см.). подсказку «Повернутый текст» далее в этой статье). Затем вы должны нарисовать его в обработчике событий OnDrawItem. Это событие вызывается каждый раз, когда рисуется элемент меню, если в меню есть элемент. 20 элементов, он будет отрисован 20 раз. Чтобы ускорить процесс, вертикальный текст будет отрисовываться только при выборе пункта меню (поскольку одновременно выбирается только один пункт меню). На рис. 6 показано, как это реализовано с помощью кода. , а на рис. 7 показан результат выполнения.
Другое использование событий OnDrawItem и OnMeasureItem — написание вертикального текста рядом с меню (например, как показано на рис. 7). Для этого вам нужно создать повернутый шрифт. Единственный способ — использовать функцию CreateFont или CreateLogFont Windows API (см. технику «повернутого текста» далее в этой статье). Поэтому вам придется перерисовать его в событии OnDrawItem. Это событие выполняется при извлечении пункта меню, поэтому, если в меню 20 пунктов, оно будет выполнено 20 раз. Чтобы сделать это быстрее, вертикальный текст можно перерисовывать каждый раз при выборе пункта меню (хотя одновременно выбирается только один пункт меню). На рис. 6 показано, как выполняется код, а на рис. 7 показаны результаты.
процедура TForm1.VerticalDrawItem(Отправитель: TObject;
ACanvas: TCanvas; ARect: TRect Выбрано: Boolean);
вар
lf: Тлогфонт;
ОлдФонт:HFont;
clFore, clBack: ЛонгИнт;
Прямоугольник: TRect;
dwCheck: ЛонгИнт;
MenuHeight: Целое число;
начинать
dwCheck: = GetSystemMetrics(SM_CXMENUCHECK);
// Это будет сделано один раз, когда элемент выбран.
Это будет выполнено при выборе пункта меню.
если выбрано, то начать
// Создаем повернутый шрифт.
Создать повернутый шрифт
FillChar(lf, SizeOf(lf), 0);
lf.lfHeight := -14;
lf.lfEscapement:= 900;
lf.lfOrientation := 900;
lf.lfWeight := Fw_Bold;
StrPCopy(lf.lfFaceName, 'Arial');
// Выберите этот шрифт для рисования.
Выберите этот шрифт для рисования
OldFont := SelectObject(ACanvas.Handle,
CreateFontIndirect(lf));
// Изменяем цвета переднего плана и фона.
Изменение цвета переднего плана и фона
clFore := SetTextColor(ACanvas.Handle, clSilver);
clBack := SetBkColor(ACanvas.Handle, clBlack);
// Получаем высоту меню.
Получить высоту меню
MenuHeight := (ARect.Bottom-ARect.Top) *
((Отправитель как TMenuItem).Родитель как TMenuItem).Count;
Прямоугольник := Rect(-1, 0, dwCheck-1, MenuHeight);
// Рисуем текст.
нарисовать текст
ExtTextOut(ACanvas.Handle, -1, MenuHeight, Eto_Clipped,
@Rectang, «Сделано в Borland», 15, ноль);
// Возвращаемся в исходное состояние.
Вернуться в исходное состояние
УдалитьОбъект(ВыбратьОбъект(ACanvas.Handle, OldFont));
SetTextColor(ACanvas.Handle, clFore);
SetBkColor(ACanvas.Handle, clBack);
конец;
// Рисуем настоящий текст меню.
Нарисуйте реальный текст пункта меню
ARect.Left := ARect.Left + LoWord(dwCheck) + 2;
DrawText(ACanvas.Handle,
PChar((Отправитель как TMenuItem).Caption),
Длина((Отправитель как TMenuItem).Caption), ARect, 0);
конец;
Рисунок 6. Использование OnDrawItem для рисования вертикального текста в меню.
Рисунок 7: Меню с вертикальным текстом.
Одна сложная деталь — определить, с чего начать рисование текста. Он должен начинаться внизу последнего пункта меню. Чтобы определить его положение, мы получаем высоту пункта меню, используя:
Вы должны знать, с чего начать рисовать текст. Он должен начинаться внизу последнего пункта меню. Чтобы получить эту позицию, мы получаем высоту пункта меню следующим образом:
ARect.Top - ARect.Bottom
и умножим его на количество пунктов в меню:
И умножаем на количество пунктов меню:
(((Отправитель как TMenuItem).Родитель как TMenuItem).Count)
Повернутый текст
повернутый текст
API Windows позволяет рисовать текст под любым углом. Для этого в Delphi необходимо использовать функцию API CreateFont или CreateFontIndirect, как показано на рисунке 8.
Windows API позволяет рисовать текст под любым углом. Чтобы сделать это в Delphi, вы должны использовать две функции API CreateFont или CreateFontIndirect. На рис. 8 показано объявление CreateFont.
функция CreateFont(
nHeight, // Логическая высота шрифта. Логическая высота шрифта.
nWidth, // Логическая средняя ширина символа.
nEscapement, // Угол спуска. Угол поворота.
nOrientation, // Угол ориентации базовой линии.
fnWeight: Integer // Вес шрифта. Подсвойство веса.
fdwItalic, // Флаг атрибута курсива. Это курсив?
fdwUnderline, // Флаг атрибута подчеркивания.
fdwStrikeOut, // Флаг атрибута вычеркивания. Следует ли использовать атрибут вычеркивания.
fdwCharSet // Идентификатор набора символов.
fdwOutputPrecision, // Точность вывода.
fdwClipPrecision, // Точность обрезки.
fdwQuality, // Качество вывода.
fdwPitchAndFamily: DWORD // Шаг и семейство.
lpszFace: PChar // Указатель на строку имени шрифта.
): HFONT;
Рис. 8. Объявление Object Pascal для функции Windows API CreateFont.
Хотя эта функция имеет много параметров, обычно вам нужно изменить только один или два атрибута текста. В таких случаях вместо этого следует использовать функцию CreateFontIndirect. Она принимает только один аргумент — запись типа TLogFont, как показано на рисунке. 9.
Хотя эта функция принимает множество параметров, обычно вам нужно изменить только одно или два свойства текста. В этом случае вместо этого вы должны использовать функцию CreateFontIndirect. Для этого требуется только один параметр — параметр типа записи TlogFont, как показано на рисунке 9.
tagLOGFONTA = упакованная запись
lfHeight: Лонгинт;
lfWidth: Лонгинт;
lfEscapement: Лонгинт;
lfOrientation: Longint;
lfWeight: Лонгинт;
lfItalic: Байт;
lfUnderline: Байт;
lfStrikeOut: Байт;
lfCharSet: Байт;
lfOutPrecision: Байт;
lfClipPrecision: Байт;
lfQuality: Байт;
lfPitchAndFamily: Байт;
lfFaceName: массив [0..LF_FACESIZE - 1] из AnsiChar;
конец;
ТЛогФонтА = тегЛОГФОНТА;
ТЛогФонт = ТЛогФонтА;
Рисунок 9: Запись TLogFont.
Глядя на эту запись, вы заметите, что ее элементы соответствуют параметрам функции CreateFont. Преимущество использования этой комбинации функция/запись заключается в том, что вы можете заполнить элементы записи известным шрифтом с помощью функции GetObject API, а затем изменить элементы. хотите, и создайте новый шрифт.
Если вы внимательно посмотрите на этот тип записи, вы обнаружите, что его члены очень похожи на параметры функции CreateFont. Преимущество использования этой комбинации функция/запись заключается в том, что вы можете использовать функцию API GetObject для заполнения значений элементов этой записи известным шрифтом, а затем изменить значение элемента, которое вы хотите изменить, для создания нового шрифта.
Чтобы нарисовать повернутый текст, вам необходимо изменить единственный элемент — lfEscapement, который устанавливает угол текста в десятых долях градусов. Итак, если вы хотите, чтобы текст рисовался под углом 45 градусов, вы должны установить для lfEscapement значение 450.
Чтобы нарисовать повернутый текст, вам нужно изменить единственный элемент — lfEscapement, который устанавливает угол шрифта в десятых долях градуса. Итак, если вы хотите, чтобы персонаж поворачивался на 45 градусов, вам нужно установить
lfEscapement — 450.
Обратите внимание, что есть флаги для рисования курсива, подчеркивания и зачеркивания текста, но нет флага для рисования жирного текста. Это делается с помощью элемента lfWeight, числа от 0 до 1000. 400 — это обычный текст, значения выше этого. нарисуйте жирный текст, а значения под ним — светлый текст.
Обратите внимание, что существует довольно много маркеров для выделения текста курсивом, подчеркивания и выделения, но нет маркеров для выделения текста жирным шрифтом. Это связано с тем, что вместо этого используется член lfWeight, а значение этого члена находится в диапазоне от 0 до 1000. 400 — нормальное значение, все, что выше этого значения, выделено жирным шрифтом, а все, что ниже этого, — тонким.
Код на рис. 10 рисует текст под углами от 0 до 360 градусов с интервалом в 20 градусов. Это обработчик события OnPaint формы, поэтому текст перерисовывается каждый раз при рисовании формы. На рис. 11 показан результат.
Код на рис. 10 рисует символы каждые 20 градусов от 0 до 360 градусов. Это запускается в событии OnPaint формы, поэтому текст перерисовывается каждый раз при рисовании формы. Эффект можно увидеть на рисунке 11.
процедура TForm1.FormPaint(Отправитель: TObject);
вар
Старый шрифт, Новый шрифт: hFont;
ЛогФонт: ТЛогФонт;
я: целое число;
начинать
// Получаем дескриптор шрифта холста.
Получает дескриптор объекта шрифта формы.
OldFont := Canvas.Font.Handle;
я := 0;
// Прозрачный рисунок.
Установить свойство прозрачности
SetBkMode(Canvas.Handle, Прозрачный);
// Заполняем структуру LogFont информацией
Заполните структуру LogFont информацией.
// из текущего шрифта.
из текущего шрифта
GetObject(OldFont, Sizeof(LogFont), @LogFont);
// Углы варьируются от 0 до 360.
от 0 до 360 градусов
пока я < 3600, начну
// Установите спусковой механизм на новый угол.
Установить ориентацию текста под новым углом
LogFont.lfEscapement: = я;
//Создаем новый шрифт.
Создать новый шрифт
NewFont := CreateFontIndirect(LogFont);
// Выбор шрифта для рисования.
Выбор шрифтов для вывода
SelectObject(Canvas.Handle, NewFont);
// Рисуем текст в середине формы.
Вывод текста в середине формы
TextOut(Canvas.Handle, ClientWidth div 2,
ClientHeight div 2, «Повернутый текст», 21);
// Очистка.
Прозрачный
УдалитьОбъект(ВыбратьОбъект(Canvas.Handle, OldFont));
// Увеличиваем угол на 20 градусов.
увеличивается каждые 20 градусов
Inc(я, 200);
конец;
конец;
Рис. 10. Код для рисования текста, повернутого с интервалом в 20 градусов.
Рис. 11. Текст повернут на 360 градусов.
В форме установлен шрифт Arial, шрифт TrueType. Этот код работает только со шрифтами TrueType; другие типы шрифтов не поддерживают поворот текста. Чтобы получить текущие настройки шрифта и заполнить структуру TLogFont, необходимо использовать функцию GetObject API. Код на рисунке 12 показывает, как заполнять и отображать настройки TLogFont для шрифта формы.
Шрифт этой формы установлен на Arial, шрифт TrueType. Этот код работает только со шрифтами TrueType; другие шрифты не поддерживают поворот текста. Чтобы получить текущие настройки шрифта и заполнить структуру TlogFont, необходимо использовать API-функцию GetObject. В коде на рисунке 12 можно увидеть, как заполнять и отображать настройки TlogFont в форме.
процедура TForm1.Info1Click(Отправитель: TObject);
вар
ЛогФонт: ТЛогФонт;
начинать
// Заполняем структуру LogFont информацией
Заполняем значения членов структуры LogFont
// из текущего шрифта.
из текущего шрифта
GetObject(Canvas.Font.Handle, Sizeof(LogFont), @LogFont);
// Отображение информации о шрифте.
Показать информацию о шрифте
с помощью LogFont выполните ShowMessage(
'lfHeight: ' + IntToStr(lfHeight) + #13 +
'lfWidth: ' + IntToStr(lfWidth) + #13 +
'lfEscapement: '+IntToStr(lfEscapement) + #13 +
'lfOrientation: ' + IntToStr(lfOrientation) + #13 +
'lfWeight: ' + IntToStr(lfWeight) + #13 +
'lfItalic: ' + IntToStr(lfItalic) + #13 +
'lfUnderline: ' + IntToStr(lfUnderline) + #13 +
'lfStrikeOut: ' + IntToStr(lfStrikeOut) + #13 +
'lfCharSet: ' + IntToStr(lfCharSet) + #13 +
'lfOutPrecision: ' + IntToStr(lfOutPrecision) + #13 +
'lfClipPrecision: ' + IntToStr(lfClipPrecision) + #13 +
'lfQuality: ' + IntToStr(lfQuality) + #13 +
'lfPitchAndFamily: '+IntToStr(lfPitchAndFamily) + #13 +
'lfFaceName: ' + строка (lfFaceName));
конец;
Рис. 12. Получение и отображение атрибутов шрифта.
После того, как у вас есть настройки в структуре TLogFont, единственное изменение — это установить желаемый угол lfEscapement и создать новый шрифт с помощью CreateFontIndirect. Прежде чем использовать этот новый шрифт, его необходимо выбрать с помощью SelectObject. Другой способ — назначить дескриптор. этого нового шрифта к дескриптору шрифта холста перед рисованием текста. После рисования текста эту работу необходимо отменить, а старый шрифт необходимо выбрать, а новый шрифт удалить. не будет удален, произойдет утечка памяти, и - если процедура будет выполняться много раз - Windows (особенно 95/98) исчерпает ресурсы и произойдет сбой.
После того как вы настроили структуру TlogFont, единственное, что вам осталось сделать, — это изменить значение lfEscapement на целевое значение и использовать CreateFontIndirect для создания нового шрифта. Прежде чем использовать этот новый шрифт, вы должны использовать SelectObject, чтобы выбрать его. Другой метод — использовать дескриптор этого нового объекта шрифта для дескриптора объекта шрифта на холсте формы перед рисованием текста. После того, как текст нарисован, начинается процесс; необходимо выбрать старый шрифт, а новый удалить. Если новый шрифт не удалить, это приведет к утечке памяти, и ----- если программа запускается несколько раз ------ в Windows (особенно 95/98) не закончатся ресурсы, и
крушение.
Стильные линии
популярные строки
Когда вы рисуете линии, отдельные пиксели обычно не имеют значения; вы просто устанавливаете стиль линии, и она рисуется Windows. Иногда вам нужно сделать что-то особенное и нарисовать стиль линии, не предусмотренный Windows. Это можно сделать. используя функцию Windows API с именем LineDDA, определенную на рисунке 13.
Когда вы рисуете линии, отдельные пиксели обычно не имеют значения; вы просто задаете тип линии, и ее рисование остается на усмотрение Windows. Однако иногда вам нужно использовать некоторые специальные типы строк, которые Windows не предоставляет. Этого можно добиться с помощью функции API под названием LineDDA, определение которой можно увидеть на рисунке 13.
функция LineDDA(
nXStart, // координата x начальной точки линии.
Начальная точка координаты X
nYStart, // координата y начальной точки линии.
Начальная точка координаты Y
nXEnd, // координата x конечной точки линии.
Конечная точка координаты X
YEnd : Integer; // координата y конечной точки линии.
Конечная точка координаты Y
// Адрес определяемой приложением функции обратного вызова.
Адрес определяемой приложением функции обратного вызова
lpLineFunc: TFNLineDDAProc;
lpData : LPARAM // Адрес данных, определенных приложением.
Адрес данных, определяемых приложением
): БООЛ;
Рис. 13. Объявление Object Pascal для функции Windows API LineDDA.
Первые четыре параметра — это начальная и конечная точки линии. Пятый параметр — это функция обратного вызова, которая будет вызываться каждый раз, когда вы помещаете туда свои процедуры рисования. Последний параметр — это пользовательский параметр. передается в функцию обратного вызова. Вы можете передать в функцию любое целое число или указатель, поскольку это LParam (в Win32 он преобразуется в Longint). Функция обратного вызова должна иметь форму, показанную здесь:
Первые четыре параметра — это начальная и конечная точки линии. Пятый параметр — это функция обратного вызова, которая будет вызываться каждый раз при отрисовке пикселя. Здесь вы можете написать о своем процессе рисования. Последний параметр определяется пользователем и может быть передан в функцию обратного вызова. Вы можете передать в эту функцию любое целое число или указатель, потому что это
Тип Lparam (в WIN32 интерпретируется как тип Longint). Эта функция обратного вызова должна использовать форму, подобную следующей:
процедура CallBackDDA(x, y: Integer;
ПользовательскийПарам: LParam);
где x и y — координаты нарисованной точки, а UserParam — параметр, передаваемый функции. Эту функцию необходимо объявить как stdcall. Процедура на рис. 14 рисует строку растровых изображений, а на рис. 15 показан результат.
Здесь X и Y — это координаты рисуемых точек, а UserParam — параметр. Эта функция должна быть определена как stdcall. Программа на рисунке 14 строит линию BMP, а на рисунке 15 отображаются результаты.
тип
ТФорм1 = класс (ТФорма)
Список изображений1: TImageList;
процедура FormPaint (Отправитель: TObject);
процедура FormResize (Отправитель: TObject);
конец;
вар
Форма1: ТФорм1;
процедура CallDDA(x, y: Integer; Форма: TForm1);
выполнение
{ $R *.DFM }
процедура CallDDA(x, y: Integer; Форма: TForm1);
начинать
если x mod 13 = 0, то
Form.ImageList1.Draw(Form.Canvas, x, y, 0);
конец;
процедура TForm1.FormPaint(Отправитель: TObject);
начинать
LineDDA(0, 0, ClientWidth, ClientHeight,
@CallDDA, Integer(Self));
конец;
процедура TForm1.FormResize(Отправитель: TObject);
начинать
Недействителен;
конец;
Рис. 14. Код для рисования линии растровых изображений.
Рисунок 15: Окно с пользовательской линией.
Эта подпрограмма обрабатывает событие OnPaint формы, вызывая LineDDA, поэтому каждый раз, когда форма должна быть нарисована, она перерисовывает строку. Еще одно обрабатываемое событие — OnResize, которое делает клиентскую область формы недействительной, поэтому строку необходимо перерисовывать, когда кто-то меняет ее. size. Функция обратного вызова LineDDA, CallDDA, очень проста. При каждом 13-м вызове она рисует растровое изображение, хранящееся в ImageList. Как вы можете заметить, Self передается в качестве последнего параметра. функцию обратного вызова, чтобы она могла получить доступ к данным экземпляра.
Эта программа обрабатывает событие OnPaint формы, вызывая LineDDA, поэтому она будет перерисовывать линию каждый раз при рисовании формы. Еще одно событие — OnResize, которое делает недействительной клиентскую область формы, поэтому строки будут перерисовываться, когда кто-то изменит ее размер. Функция обратного вызова LineDDA и CallDDA очень просты. При каждом вызове 13 раз он будет рисовать растровое изображение, хранящееся в ImageList. Возможно, вы заметили, что SELF передается в качестве последнего параметра функции обратного вызова, поэтому она может получить доступ к данным программы.
Заключение
в заключение
Поскольку рисование владельца было доступно в TMainMenu в Delphi 4, существовало множество способов дополнить ваши меню. Используя методы, которые мы здесь обсуждали, вы можете легко улучшить меню вашего приложения Delphi с помощью специального текста, растровых изображений и цветов.
Теперь, когда рисунок владельца появился в TmainMenu в Delphi 4, у него есть множество способов расширить функциональность вашего меню. Используя методы, которые мы обсуждали выше, вы можете легко расширить функциональность меню вашего приложения DELPHI, добавив собственный текст, растровые изображения и цвета.