Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Canvas, Brush.Color,FillRect. [D6, XP]


Страницы:   1 2

Drowsy ©   (2009-11-19 15:16:00) 

Почему в данном случае при отрисовке  LeftSide и RightSide линии рисуются установленным цветом карандаша, а FillRect цветом кисти фона?

type

GrSidePro = class(TPaintBox)
private
   procedure Show(Sender: TObject);
published
public
end;

grProlet = class (TComponent)
LeftSide : GrSidePro;
RightSide : GrSidePro;
private
end;

implementation

....
....

constructor grProlet.CreateR(AOwner: TWinControl ; ProletsList : TList;  var PRol : TProlet; Colwid : double);
begin
 inherited Create(AOwner);
...
...
 LeftSide  := GrSidePro.Create(Self);
 LeftSide.Parent := AOwner;

 RightSide := GrSidePro.Create(Self);
 RightSide.Parent := AOwner;

...
...

 LeftSide.Canvas.Pen.Color := clRed;
 LeftSide.Canvas.Brush.Color := clGreen;
 LeftSide.OnPaint := LeftSide.Show;

 RightSide.Canvas.Pen.Color := clYellow;
 RightSide.Canvas.Brush.Color := clBlue;
 RightSide.OnPaint := RightSide.Show;

end;

procedure GrSidePro.Show(Sender: TObject);
begin
 with Canvas do
 begin
   FillRect(ClientRect);
   MoveTo(0, 0);
   LineTo(0, ClientHeight);
   MoveTo(ClientWidth-1, 0);
   LineTo(ClientWidth-1, ClientHeight);
 end;
end;


Cobalt   (2009-11-20 14:48:00) [1]

Лучше использовать для отладки не ShowMessage, а
OutputDebugString(PChar(IntToHex(Color, 8)));


Омлет   (2009-11-19 16:52:00) [2]

Где-то косяк. Возможно переопределение цвета..
Перед FillRect поставьте ShowMessage, чтобы узнать истинный номер цвета кисти.


Игорь Шевченко   (2009-11-19 16:49:00) [3]

Ищи разницу:

unit main;

interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls;

type
 TFoo = class(TPaintBox)
 private
   FBkColor: TColor;
 protected
   procedure Paint; override;
 public
   property BkColor: TColor read FBkColor write FBkColor;
 end;

 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   FFoo, FBar: TFoo;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 FFoo := TFoo.Create(Self);
 FFoo.Parent := Self;
 FFoo.BoundsRect := Rect(10, 10, 100, 100);
 FFoo.BkColor := clRed;
 FBar := TFoo.Create(Self);
 FBar.Parent := Self;
 FBar.BoundsRect := Rect(110, 110, 200, 200);
 FBar.BkColor := clBlue;
end;

{ TFoo }

procedure TFoo.Paint;
begin
 with Canvas do
 begin
   Brush.Color := FBKColor;
   FillRect(ClientRect);
 end;
end;

end.


Drowsy   (2009-11-19 16:40:00) [4]


> А Brush.Style какой?

bsSolid


Омлет   (2009-11-19 16:37:00) [5]

А Brush.Style какой?


Drowsy   (2009-11-19 16:27:00) [6]


> PaintBox использует Form.Canvas, значит, последние установки
> и будут использоваться при рисовании


У меня только главная форма.
Попробовал так:

procedure GrSidePro.Show(Sender: TObject);
var LH, RH : integer;
begin
 with Canvas do
 begin
   Application.MainForm.Canvas.Brush.Color := clRed;
   FillRect(ClientRect);

Всё равно цветом фона заливает.


Drowsy   (2009-11-19 16:22:00) [7]


> PaintBox использует Form.Canvas, значит, последние установки
> и будут использоваться при рисовании


A TImage тоже использует Form.Canvas?


Игорь Шевченко   (2009-11-19 16:03:00) [8]

или устанавливай атрибуты Canvas непосредственно в методе OnPaint


Игорь Шевченко   (2009-11-19 16:02:00) [9]

Drowsy   (19.11.09 15:58) [10]

PaintBox использует Form.Canvas, значит, последние установки и будут использоваться при рисовании

RTFM: TCustomControl


Drowsy   (2009-11-19 16:01:00) [10]

и карандаш-то цвет сохраняет.


Drowsy   (2009-11-19 16:00:00) [11]

а при определении:
LeftSide.Canvas.Brush.Color := clGreen;
RightSide.Canvas.Brush.Color := clBlue;


Drowsy   (2009-11-19 15:58:00) [12]


> потому что Canvas чужой

не понимаю.
я ведь явно указываю:

procedure GrSidePro.Show(Sender: TObject);
begin
with Canvas do
begin
  FillRect(ClientRect);


Игорь Шевченко   (2009-11-19 15:56:00) [13]

потому что Canvas чужой


Drowsy   (2009-11-19 15:52:00) [14]

установил в false.

 LeftSide  := GrSidePro.Create(Self);
 LeftSide.Parent := AOwner;
 LeftSide.ParentColor := false;

 RightSide := GrSidePro.Create(Self);
 RightSide.Parent := AOwner;
 RightSide.ParentColor := false;

рисует как прежде.


Германн   (2009-11-19 15:42:00) [15]

ParentColor?


Drowsy   (2009-11-19 15:36:00) [16]

Почему в данном случае при отрисовке  LeftSide и RightSide линии рисуются установленным цветом карандаша, а FillRect цветом кисти фона а не цветом кисти, установленным для LeftSide и RightSide


antonn   (2009-11-19 15:33:00) [17]

ты вопрос переформулируй, т.к. вот тут все уже рассказано:

> Почему в данном случае при отрисовке  LeftSide и RightSide
> линиирисуются установленным цветом карандаша, а FillRect
> цветом кисти фона?
>


Drowsy   (2009-11-19 15:23:00) [18]


> потому что линии рисуются через pen, а fillrect заливается
> используя brush

LeftSide.Canvas.Pen.Color := clRed;
LeftSide.Canvas.Brush.Color := clGreen;
LeftSide.OnPaint := LeftSide.Show;

RightSide.Canvas.Pen.Color := clYellow;
RightSide.Canvas.Brush.Color := clBlue;
RightSide.OnPaint := RightSide.Show;


Drowsy   (2009-11-19 15:22:00) [19]

по определению чего?


antonn   (2009-11-19 15:22:00) [20]


> Почему в данном случае при отрисовке  LeftSide и RightSide
> линии рисуются установленным цветом карандаша, а FillRect
> цветом кисти фона?

потому что линии рисуются через pen, а fillrect заливается используя brush


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо