|
Вопрос # 5 036/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Написал код по перетаскиванию графика функции мышью, но перетаскивается некорректно и с мерцанием помогите от этого избавиться прилагаю полный код:
Приложение: Переключить в обычный режим- unit Unit3;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ExtCtrls, math;
-
- type
- TForm3 = class(TForm)
- Button1: TButton;
- Image1: TPaintBox;
- procedure Button1Click(Sender: TObject);
- procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form3: TForm3;
- Xmax,Xmin,Ymax,Ymin:real;
- b:boolean;
- vx,vy:integer;
-
- implementation
-
- {$R *.dfm}
-
- Function DrawSin(x1:real; var Xmax,Xmin,Ymax,Ymin:real):Real;
- begin
- DrawSin:=Cos(X1);
- Xmax:=pi;
- Xmin:=-pi;
- Ymax:=pi;
- Ymin:=-pi;
- end;
-
- procedure TForm3.Button1Click(Sender: TObject);
- var X1,Y:real;
- px,py:LongInt;
- begin
- image1.Canvas.FillRect(rect(0,0,width,height));
- for PX:=1 to Image1.Width do
- begin
- X1:=Xmin+PX*(Xmax-Xmin)/(Image1.Width)-2*vx*pi/500;
- Y:=DrawSin(X1,Xmax,Xmin,Ymax,Ymin)-2*vy*pi/500;
- PY:=trunc((Image1.Height)-(Y-Ymin)*(Image1.height)/(Ymax-Ymin));
- image1.Canvas.Pixels[PX,PY]:=clBlack;
- end;
- end;
-
- procedure TForm3.Image1MouseDown(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- b:=true;
- vx:=x;
- vy:=y;
- end;
-
- procedure TForm3.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
- Y: Integer);
- var rx,ry:Integer;
- begin
- rx:=x;
- ry:=y;
- if b = true then
- begin
- vx:=rx-vx;
- vy:=ry-vy;
- Button1Click(Sender);
- end;
- if b = false then
- begin
- exit;
- end;
- end;
-
- procedure TForm3.Image1MouseUp(Sender: TObject; Button: TMouseButton;
- Shift: TShiftState; X, Y: Integer);
- begin
- b:=False;
- vx:=0;
- vy:=0;
- end;
-
- end.
 |
Вопрос задал: ierihon1 (статус: 1-ый класс)
Вопрос отправлен: 20 февраля 2011, 10:23
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, ierihon1!
Просмотрел бегло Ваш код - классическая проблема. Мерцания возникают потому, что изображение перерисовывается много-много раз.
А учитывая то, что метод установки цвета конкретного пискеля очень медленный, это ещё больше замедляет код.
Что бы ничего не мерцало и рисовалось красиво, нужно рисовать картинку в памяти, а потом в нужный момент копировать готовую на экран.
Для этого вначале заводим себе TBitmap, нужно размера, на котором рисуем картинку. Когда вся картинка готова, методом Draw переносим ее по назначению. Но перенос делается в методе OnPaint нужного компонента. Так как Windows не знает, когда рисовать, то можно вызывать методо Repaint или Refresh по окончанию прорисовки картинки на TBitmap.
Читайте статью тут http://www.beluch.ru/progr/100comp/4_2.htm и немного тут http://forums.overclockers.ru/viewtopic.php?f=28&t=44662&start=600
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 20 февраля 2011, 17:04
Оценка за ответ: 5
Комментарий к оценке: хех о чём я думал) спасибо)
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 20 февраля 2011, 20:31; участников в обсуждении: 2.
|
Amidamaru (статус: 4-ый класс), 20 февраля 2011, 17:30 [#1]:
очень интересный способ, я правда делал проще, хотя не знаю насколько это эффективно в плане скорости:
установить ParentBackGround:=false; и DoubleBuffered:=true; (второе можно установить только во время выполнения, т.е. в коде), если не получиться на форме (хотя должно получиться), ставишь панельку на всю форму, на неё уже нужные компоненты, и устанавливаешь эти свойства для неё, а не для формы.
|
|
ierihon1 (статус: 1-ый класс), 20 февраля 2011, 20:31 [#2]:
Amidamaru: ну с мерцанием можно сказать разобрался но график всё равно через пень колоду отрисовывается... если слишком переместить вниз то та часть что исчезает снизу появляется сверху... и наоборот... может сам способ построения графика не подходит под такие испытания?
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|