У
ряда объектов из библиотеки визуальных
компонент есть свойство Canvas (канва),
которое предоставляет простой путь для
рисования на них. Эти объекты — TBitmap,
TComboBox, TDBComboBox, TDBGrid, TDBListBox, TDirectoryListBox,
TDrawGrid, TFileListBox, TForm, TImage, TListBox, TOutline,
TPaintBox, TPrinter, TStringGrid. Canvas является в свою
очередь объектом, объединяющим в себе
поле для рисования, карандаш (Pen),
кисть (Brush)
и шрифт (Font).
Canvas
обладает также рядом графических методов
: Draw,
TextOut, Arc, Rectangle
и др. Рассмотрим подробнее свойства и
методы объекта Canvas.
Использование
перьев
С
помощью перьев на канве рисуются линии..
Доступ к пкрьям осуществляется через
свойство Canvas.Pen
Для изменения
способа рисования линий следует
модифицировать свойства объекта пера:
Color,
Width,
Style,
и Mode.
Свойство
Color
определяет
цвет пера. В Delphi предусмотрены
предопределенные цветовые константы,
например, clRed,
clYellow соответствуют
красному и желтому цветам. Кроме того,
определены константы для представления
системных цветов экранных элементов
системы Win32. Например, константы
clActiveCaption
и
clHighliteText
соответствуют
цветам активных заголовков и выделенного
текста в данной системе Win32. Приведенная
ниже строка назначает перу канвы синий
цвет.
Canvas.Pen.Color
:= clBlue;
С
помощью пера можно рисовать линии,
отличающиеся друг от друга стилем,
который определяется свойством Style.
В таблице
показаны различные стили, которые можно
устанавливать для свойства
Pen.Style:
Стиль |
Что рисуется |
psClear |
Невидимая линия |
psDash |
Линия, состоящая |
psDashDot |
Линия, состоящая |
psDashDotDot |
Линия, состоящая |
psDot |
Линия, состоящая |
psInsideFrame |
Линия внутри |
psSolid |
Сплошная линия |
Следующая
строка демонстрирует, как изменить
стиль рисования пером:
Canvas.Pen.Stylel
:= psDashDot;
Свойство
Pen.Width
позволяет указать ширину линии
в пикселях, проводимую пером при
рисовании. При установке большего
значения перо рисует более толстую
линию.
На |
Стиль |
Использование
кисти
Если
перо (объект TPen)
позволяет рисовать на канве линии, то
с помощью кисти (объекта TBrush)
выполняется закрашивание областей и
фигур, нарисованных на этой канве. При
этом могут использоваться различные
цвета, стили и узоры.
Объект
TBrush
обладает тремя важными свойствами
Color,
Style
и BitMap,
которые определяют, как кисть будет
закрашивать поверхность канвы. Свойство
Color
определяет цвет кисти, Style
— узор
фона кисти, а BitMap
задает
растр, который можно использовать для
создания пользовательских орнаментов,
служащих фоном кисти.
Свойство
Style
кисти может
принимать одно из восьми допустимых
значений: bsSolid,
bsClear,
bsHorizontal,
bsVertical,
bcFDiagonal,
bsBDiagonal,
bsCross
и bsDiagCross.
По умолчанию
цвет кисти устанавливается равным
константе clWhite,
стиль — константе bsSolid,
а растр не задается. В вашей власти
изменять стандартные цвет и стиль работы
кисти при выполнении закрашивания
областей различными узорами.
Использование
шрифтов
С
помощью свойства Canvas.Font
можно выводить на канву текст, используя
любой из доступных в интерфейсе Win32
шрифтов. При этом существует возможность
изменять внешний вид помещаемого на
канву текста путем модификации такого
свойства шрифта, как Color,
Name,
Size,
Height
или Style.
Свойству
Font.Color
можно
присвоить любой определенный в Delphi
цвет. Например, с помощью следующей
строки можно получить шрифт красного
цвета:
Canvas.Font.Color
:= clRed;
Свойство
Name
предназначено
для указания имени шрифта Windows.
Так, используя следующую строку, в
качестве шрифта канвы можно установить
любой требуемый шрифт:
Canvas.Font.Name
:= ‘Times New Roman’;
Свойство
Canvas.Font.Size
задает размер шрифта в пунктах.
Свойство
Canvas.Font.Stile
представляет
собой множество, которое может состоять
из одного или произвольной комбинации
стилей, приведенных в таблице.
Значение |
Стиль |
fsBold |
Полужирный |
fsItalic |
Курсив |
fsUnderline |
Подчеркивание |
fsStrikeOut |
Перечеркнутый |
Для
объединения двух стилей используйте
следующий синтаксис:
Canvas.Font.Style
:= [fsBold, fsItalic];
Для
выбора определенного шрифта и присвоения
его свойству Tmemo.Font
можно использовать объект TfontDialog:
If
FontDialog1.Execute then
Memo1.Font.Assign(FontDialog1.Font);
Тот
же результат будет достигнут, если
присвоить шрифт, выбранный с помощью
объекта TfontDialog,
свойству объекта Canvas,
отвечающему за шрифт:
Canvas.Font.Assign(FontDialog1.Font);
Кроме
того, шрифту объекта Canvas
можно присвоить отдельные атрибуты,
принадлежащие шрифту, выбранному с
помощью объекта TfontDialog:
Canvas.Font.Name
:= Font.Dialog1.Font.Name;
Canvas.Font.Size
:= Font.Dialog1.Font.Size;
Задание 1. Редактор
надписей
В
том месте окна, где был щелчок левой
кнопки мыши, появляется надпись. Текст
надписи, а также параметры шрифта (размер
букв, наклон, цвет текста и фона и т.д.)
задаются в диалоговом окне
Задание
2. Грифики функций
Программа
выводит по выбору пользователя график
одной из трех функций: прямая, парабола
или синусоида. В диалоговом окне задаются
параметры графика (коэффициенты a,b
для прямой и a,b,c
для параболы или синусоиды, расположение
графика, масштаб и т.д.).
Задание 3
Написать
проект, в котором был бы реализован
интерфейс для любого из численных
методов. В проекте обязательно использовать
графику.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Как можно изменить цвет текста в Edit’е?
Решить данную проблему пробовал как с использованием диалоговой панели «Цвет», так и с использованием диалогового окна «Шрифт»:
Код:
Var lf:LOGFONT;
hParentDC:HDC;
Font:HFONT;
CF:TCHOOSEFONT;
acrCustClr:array[0..15] of COLORREF;
…
function WndProc(wnd:HWND; msg, wParam, lPapram:longint):longint; stdcall;
begin
result:=DefWindowProc(wnd, msg, wParam, lParam);
case msg of
WM_CREATE: begin
hParentDC:=GetDC(Edit);
lf.lfHeight:= -MulDiv( 10, GetDeviceCaps(hParentDC,LOGPIXELSY), 72);
lf.lfWidth:= 0;
lf.lfEscapement:= 0;
lf.lfOrientation:=0;
lf.lfWeight:= FW_NORMAL;
lf.lfItalic:= 0;
lf.lfUnderline:= 0;
lf.lfStrikeOut:= 0;
lf.lfCharSet:= ANSI_CHARSET;
lf.lfOutPrecision:= OUT_TT_PRECIS;
lf.lfClipPrecision:= CLIP_DEFAULT_PRECIS;
lf.lfQuality:= DEFAULT_QUALITY;
lf.lfPitchAndFamily:= DEFAULT_PITCH or FF_DONTCARE;
lf.lfFaceName:=’Arial’;
Font:=CreateFontIndirect(lf);
Edit:=CreateWindowEx(0,’Edit’,»,WS_CHILD or WS_VISIBLE or ES_MULTILINE or
ES_AUTOVSCROLL or WS_VSCROLL, 0, 0, 0, 0, wnd,
HMENU(20), hInstance, nil);
SendMessage(Edit, WM_SETFONT, integer(Font),MakelParam(0,1));
SetFocus(Edit);
//Инициализация диалога «Цвет»
FillChar(CC, SizeOf(TCHOOSECOLOR),0);
CC.lStructSize:=SizeOf(TCHOOSECOLOR);
CC.hWndOwner:=wnd;
CC.hInstance:=hInstance;
CC.lpCustColors:=@acrCustClr;
CC.Flags:=CC_FULLOPEN;
//Инициализация диалога «Шрифт»
FillChar(CF, SizeOf(TCHOOSEFONT),0);
CF.lStructSize:=SizeOf(TCHOOSEFONT);
CF.hWndOwner:=Wnd;
CF.lpLogFont:=@lf;
CF.Flags:=CF_SCREENFONTS or CF_EFFECTS;
CF.hDC:=hParentDC;
end;
WM_COMMAND: case wParam of
118: begin //Использование диалога «Цвет»
ChooseColor(CC);
CF.rgbColors:=CC.rgbResult;
Font:=CreateFontIndirect(CF.lpLogFont^);
PrevFont:=SelectObject(hParentDC, Font);
SendMessage(Edit, WM_SETFONT, Font, MakelParam(0, 1));
SetFocus(Edit);
end;
119: begin //Использование диалога «Шрифт»
ChooseFont(CF);
Font:=CreateFontIndirect(CF.lpLogFont^);
PrevFont:=SelectObject(hParentDC, Font);
SendMessage(Edit, WM_SETFONT, integer(PrevFont),MakelParam(0,1));
SetFocus(Edit);
end;
end;
end;
end;
Диалог «Шрифт» изменяет шрифт текста. Цвет текста остаётся без изменений (чёрным). Даже явное задание цвета ни к чему не приведёт:
Код:
CF.rgbColors:=RGB(255, 0, 0);
Также пробовал решить проблему так:
Код:
SetTextColor(hParentDC, CF.rgbColors);
…
SetTextColor(hParentDC, CC.rgbResult);
Возникают проблемы и при изменении цвета фона Edit’a.
Цвет фона изменяю так:
Код:
function WndProc(wnd:HWND; msg, wParam, lParam:longint):longint; stdcall;
Begin
result:=DefWindowProc(wnd, msg, wParam, lParam);
case msg of
WM_COMMAND: case wParam of
…
117: begin
ChooseColor(CC);
SendMessage(Edit, WM_CTLCOLOREDIT, hParentDC, Edit);
SetFocus(Edit);
end;
end;
WM_CTLCOLOREDIT: begin
SetBkColor(HDC(wParam), CC.rgbResult);
result:=longint(CreateSolidBrush(CC.rgbResult));
end;
end;
End;
В этом случае цвет фона Edit’а изменяется, но возникают серьёзные проблемы с прорисовкой всего окна в случае многострочного редактора текста. При этом также следует учесть, что строка
Код:
result:=DefWindowProc(wnd, msg, wParam, lParam)
должна предшествовать обработке сообщений; в противном случае цвет фона не изменяется.
unit DefEdit;
interface
uses
SysUtils, Classes, Controls, StdCtrls, Graphics, Messages, JvStrUtils;
type
TDefEdit = class(TEdit)
private
FDefaultText: string;
FColorDefaultText: TColor;
FColorUserText: TColor;
procedure SetDefText(aText: string);
procedure SetDefColor(aColor: TColor);
procedure Loaded(); override;
procedure SetTextColor();
{ Private declarations }
protected
{ Protected declarations }
public
procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
procedure CMExit(var Message: TCMExit); message CM_EXIT;
procedure CMChanged(var Message: TMessage); message CM_CHANGED;
constructor Create(aOwner: TComponent); override;
{ Public declarations }
published
property DefaultText: string read FDefaultText write SetDefText;
property ColorDefaultText: TColor read FColorDefaultText write SetDefColor;
property ColorUserText: TColor read FColorUserText write FColorUserText;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(‘My’, [TDefEdit]);
end;
{ TDefEdit }
procedure TDefEdit.CMChanged(var Message: TMessage);
begin
inherited;
SetTextColor();
end;
procedure TDefEdit.CMEnter(var Message: TCMEnter);
begin
if Text = DefaultText then Text := »;
inherited;
end;
procedure TDefEdit.CMExit(var Message: TCMExit);
begin
if IsEmptyStr(Text,[‘ ‘]) then Text := DefaultText;
SetTextColor();
inherited;
end;
constructor TDefEdit.Create(aOwner: TComponent);
begin
inherited;
ColorDefaultText := clSilver;
ColorUserText := clBlack;
end;
procedure TDefEdit.Loaded;
begin
inherited;
if IsEmptyStr(Text,[‘ ‘]) then DefaultText := ‘Enter your text here’;
end;
procedure TDefEdit.SetDefColor(aColor: TColor);
begin
FColorDefaultText := aColor;
Font.Color := aColor;
SetTextColor();
end;
procedure TDefEdit.SetDefText(aText: string);
begin
FDefaultText := aText;
if IsEmptyStr(Text,[‘ ‘]) then Text := aText;
end;
procedure TDefEdit.SetTextColor;
begin
if Text = DefaultText
then Font.Color := ColorDefaultText
else Font.Color := ColorUserText;
end;
end.