|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
22.06.2009, 21:12 | #1 |
Пользователь
Регистрация: 02.06.2009
Сообщений: 13
|
рисование на канве и сообщения windows
Имеется проблема: Необходимо на форму вывести только часть (300х300 пикселей) изображения, т.е. вырезать нужную часть из рисунка и отобразить ее на канве формы. Для простоты пусть изображение будет храниться в файле 1.jpg. Обязательно нужно выводить на канву формы.
Действую так: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, jpeg; Const WM_draw=WM_USER+1; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); private procedure mydraw (var mes : TMessage); message WM_draw ; { Private declarations } public { Public declarations } end; var Form1: TForm1; MyRect: TRect; MyBmp: TBitmap; MyJpg: TJPEGImage; implementation {$R *.dfm} procedure TForm1.MyDraw(var Mes: TMessage); begin Canvas.StretchDraw(MyRect, MyBmp); InvalidateRect(Handle, @MyRect, FALSE); end; procedure TForm1.FormCreate(Sender: TObject); begin MyBmp := TBitmap.Create; MyJpg := TJPEGImage.Create; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin MyBmp.Free; MyJpg.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin MyJpg.LoadFromFile('1.jpg'); MyBmp.Assign(MyJpg); SetRect(MyRect, 100, 100, 400, 400); PostMessage(Handle, WM_draw, 0, 0); end; end. Все нормально, но когда форму с отрисованным нужным куском изображения, например, сворачиваешь, а потом разворачиваешь то изображение пропадает. Такая же проблема возникает когда над формой появляется другое окно, или при изменении размеров формы и др. В коде используется подход с сообщениями Windows для отрисовки, но это нужно в моей программе с полными функциональными возможностьями. Помогите устранить возникшую проблему. |
22.06.2009, 21:14 | #2 |
Пользователь
Регистрация: 06.02.2009
Сообщений: 71
|
Надо код отрисовки поместить в процедуру OnPaint для твоей формы, и тогда проблем не будет.
Тоесть вот так: Код:
╓-----┴-----╜
╝mFlat Последний раз редактировалось mflat; 22.06.2009 в 21:31. |
22.06.2009, 21:38 | #3 |
Пользователь
Регистрация: 02.06.2009
Сообщений: 13
|
Все хорошо, но вот появляется проблема - мерцание
|
22.06.2009, 21:47 | #4 |
Пользователь
Регистрация: 06.02.2009
Сообщений: 71
|
Напиши при загрузке формы этот код:
DoubleBuffered := true;
╓-----┴-----╜
╝mFlat |
22.06.2009, 21:52 | #5 |
Пользователь
Регистрация: 02.06.2009
Сообщений: 13
|
|
23.06.2009, 11:14 | #6 |
Пользователь
Регистрация: 06.02.2009
Сообщений: 71
|
Код:
Насчёт кода. Мелькание происходит только тогда, когда вы перемещаете форму.
╓-----┴-----╜
╝mFlat |
23.06.2009, 11:57 | #7 |
Участник клуба
Регистрация: 12.08.2008
Сообщений: 1,977
|
Есть же простой метод Canvas.CopyRect
Код:
И не сомневайся даже ... отдых - кайф, работа - лажа!
|
23.06.2009, 14:06 | #8 |
Пользователь
Регистрация: 02.06.2009
Сообщений: 13
|
Проблема даже нестолько в затирании куска изображения, а в следующем:
Это клиент-серверное приложение. На сервере, в самый первый раз, делается снимок всего экрана, затем он передается клиенту, клиент отрисовывает его на своей форме, затем на сервере копируется случайная часть экрана - прямоугольник с заданными шириной и высотой (300х300), на клиент передаются координаты этого прямоугольника и сам прямоугольник в виде потока. Клиент получает координаты прямоугольника и поток с прямоугольником и меняет первоначальное изображение, добавив до него в нужную позицию полученый кусок изображения. Именно по этому выбрала подход для рисования через сообщения. Если бы это делать в image или чем-то подобном, получается постоянное мерцание. Кроме всего, как и при рисовании на канве формы, так и при рисовании в графическом компоненте возникает главная проблема нашей дискусии - при перемещении формы, или при изменении ее размеров, или при помещении над канвой чужого окна, или даже при открытии меню ПУСК, часть предыдущего изображения стирается - что совсем не нужно. Вот и мучаюсь с этой проблемой... А если вопрос звучит в первоначальной формулировке, то есть еще одно решение избавления от мерцания, но при этом не пропадает самая главная проблема. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, jpeg; Const WM_draw=WM_USER+1; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Button1Click(Sender: TObject); private procedure mydraw (var mes : TMessage); message WM_draw ; procedure WMPaint(var Message: TWMPaint); message WM_PAINT; { Private declarations } public { Public declarations } end; var Form1: TForm1; MyRect: TRect; MyBmp: TBitmap; MyJpg: TJPEGImage; implementation {$R *.dfm} procedure TForm1.MyDraw(var Mes: TMessage); begin Canvas.StretchDraw(MyRect, MyBmp); //InvalidateRect(Handle, @MyRect, FALSE); end; procedure TForm1.FormCreate(Sender: TObject); begin MyBmp := TBitmap.Create; MyJpg := TJPEGImage.Create; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin MyBmp.Free; MyJpg.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin MyJpg.LoadFromFile('1.jpg'); MyBmp.Assign(MyJpg); form1.Canvas.Draw(0,0,mybmp); SetRect(MyRect, 100, 100, 400, 400); end; procedure TForm1.WMPaint(var Message: TWMPaint); var PS: TPaintStruct; begin BeginPaint(Handle, PS); PostMessage(Handle, WM_draw, 0, 0); EndPaint(Handle, PS); end; end. |
23.06.2009, 14:52 | #9 |
Пользователь
Регистрация: 02.06.2009
Сообщений: 13
|
Нашла ответ - всем спасибо за советы
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Рисование пирамиды на канве | Eugene | Общие вопросы Delphi | 4 | 17.10.2013 17:27 |
цвета на канве | Juffin | Общие вопросы Delphi | 3 | 17.05.2009 21:57 |
поиск по канве | Bayazet | Мультимедиа в Delphi | 3 | 28.01.2009 14:52 |
Мерцание на Канве | SERG1980 | Мультимедиа в Delphi | 3 | 30.04.2008 08:14 |
построение графика на Канве | Chepa | Общие вопросы Delphi | 2 | 19.01.2007 22:59 |