|
Вопрос # 4 549/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Мой вопрос касается компонента TPanel и его свойства Canvas.
Когда я пытаюсь скопировать изображение из TImage так
MyRect:=Rect(0,0,100,80);
ImgRect:=Rect(80,100,180,180);
Panel1.Brush.Bitmap.Canvas.CopyRect(MyRect,Image1.Picture.Bitmap.Canvas,ImgRect);
компилятор почему то ругается, когда создаю новый тип, где прописываю свойство canvas как public компилятор не ругается, но программа работает не корректно, т.к. если добавить кнопку и всавить в обработчик события кнопки OnClick код из Form1Create() то картинка копируется.
(привожу код в приложении)
Возможно кто нибудь знает путь решения этой проблемы.
Приложение: Переключить в обычный режим- {{code}}
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ExtCtrls, jpeg, StdCtrls;
-
- type
- TForm1 = class(TForm)
- Image1: TImage;
- procedure FormCreate(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- type TMyPanel = class(TPanel)
- protected
- property Canvas;
- End;
-
-
- var
- Form1: TForm1;
- Panel: TMyPanel;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.FormCreate(Sender: TObject); //
Ñîçäàåì
ôîðìó
- var
- MyRect,ImgRect: TRect;
- begin
- MyRect:=Rect(0,0,100,80);
- ImgRect:=Rect(80,100,180,180);
- Panel:=TMyPanel.Create(Self);
- Panel.Width:=185;
- Panel.Height:=137;
- Panel.Parent:=Self;
- Panel.SetBounds(0,0,Panel.Width,Panel.Height);
-
- Panel.Canvas.CopyRect(Panel.ClientRect,Image1.Picture.Bitmap.Canvas,Panel.BoundsRect);
-
- end;
-
- end.
-
- {{/code}}
 |
Вопрос задал: SOA (статус: Посетитель)
Вопрос отправлен: 31 августа 2010, 15:10
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 5; последнее сообщение — 31 августа 2010, 21:21; участников в обсуждении: 2.
|
min@y™ (статус: Доктор наук), 31 августа 2010, 15:36 [#1]:
Понятно, что и в FormCreate картинка копируется, но при перерисовке (при показе формы) затирается. Если поставить кнопку, картинка копируется, но если теперь форму затащить за пределый экрана, а потом снова вытащить на центр, она опять сотрётся. Такой же эффект будет при перекрывании панели любыми чужими окнами.
Кроме выноса свойства Canvas в видимую область, нужно ещё перекрывать метод TPanel.Paint(), где снова отрисовывать всю графику.
Вопрос: нафига козе баян? Может всё сделать попроще? Зачем всё это?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 31 августа 2010, 17:03 [#2]:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, jpeg, StdCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type TMyPanel = class(TPanel)
private
FSrcCanvas: TCanvas;
protected
property Canvas;
procedure Paint();Override;
property SrcCanvas:TCanvas read FSrcCanvas write FSrcCanvas;
End;
var
Form1: TForm1;
Panel: TMyPanel;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i1,i2: Integer;
c: TColor;
r,g,b:byte;
rgn: HRgn;
begin
Panel:=TMyPanel.Create(Self);
Panel.FSrcCanvas:=Image1.Picture.Bitmap.Canvas;
Panel.Width:=185;
Panel.Height:=137;
Panel.Parent:=Self;
Panel.SetBounds(0,0,Panel.Width,Panel.Height);
Panel.Canvas.CopyRect(Panel.ClientRect,Image1.Picture.Bitmap.Canvas,Panel.BoundsRect);
end;
Procedure TMyPanel.Paint();
Begin
Canvas.CopyRect(Panel.ClientRect,SrcCanvas,Panel.BoundsRect);
End;
Действительно так работает.
Спасибо.

|
|
min@y™ (статус: Доктор наук), 31 августа 2010, 17:12 [#3]:
Цитата (SOA):
Действительно так работает. Спасибо.
Почему не ответил на мои вопросы?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
SOA (статус: Посетитель), 31 августа 2010, 17:46 [#4]:
Потому что TPanel должно использоваться и проще, например с помощью TImage сделать не получится.(По условиям проекта)
>Зачем все это?
программу пишу ))
|
|
min@y™ (статус: Доктор наук), 31 августа 2010, 21:21 [#5]:
Ога, всё очень понятно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|