Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Фон программы   Найти похожие ветки 

 
S!R!X   (2003-11-05 21:49) [0]

Пишу программу на MCK. У нее фон - картинка JPG (натянута на саму форму), форма - прямоугольник с закругленными краями. При перетаскивании мышкой за клиентскую облать идет перерисовка фона. Пробовал различные варианты, но правильно только с перерисовкой:

procedure TForm1.KOLForm1Show(Sender: PObj);
begin
jpg := Newjpeg;
jpg.LoadFromFile("fon.jpg");
applet.Width:=jpg.Width;
applet.Height:=jpg.Height;

end;

procedure TForm1.KOLForm1Paint(Sender: PControl; DC: HDC);
begin
jpg.Draw(applet.Canvas.Handle,0,0);
end;


Как от этого избавиться?


 
BelchonokH ©   (2003-11-05 22:09) [1]

У тебя XP наверное, у меня тоже перерисовка идёт, и ничего страшного, это от настроек винды зависит, в 98м вот у меня не отображать содержимое окна при перетаскивании стоит и всё нормально, ничего не перерисовывается...
ТОлько я не понял, почему картинка на апплет натягивается а не форму?


 
S!R!X   (2003-11-05 22:27) [2]

винды у меня 2000....
насчет ничего страшного я сомневаюсь, т.к. при перерисовки начинает моргать форма (видно перерисовку). На 98 тоже самое


 
Gandalf ©   (2003-11-05 22:39) [3]

Ну флаг ставь при перетаскивании, который будет блокировать отрисовку.


 
S!R!X   (2003-11-05 23:15) [4]

Точно... про флаги то я и забыл
спасибо Gandalf


 
SPeller ©   (2003-11-06 01:30) [5]

А зачем при каждой перерисовке загружать картинку из файла??? Это тормоз для перерисовки. Может, если не грузить каждый раз, то и перерисовка незаметна будет?


 
Vladimir Kladov   (2003-11-06 12:39) [6]

procedure TForm1.KOLForm1Show(Sender: PObj);
почему в OnShow? Это событие вызывается несколько чаще, чем 1 раз. Например, если форму минимизировать, а потом восстановить.
Будет как минимум потеря ресурсов, из-за того, что каждый раз создается новый jpg.


begin
jpg := Newjpeg;
jpg.LoadFromFile("fon.jpg");
applet.Width:=jpg.Width;
И почему applet, а не Form ?
applet.Height:=jpg.Height;

end;

procedure TForm1.KOLForm1Paint(Sender: PControl; DC: HDC);
begin
jpg.Draw(applet.Canvas.Handle,0,0);
а почему не jpg.Draw(DC,0,0); ?
end;


 
S!R!X   (2003-11-06 23:30) [7]

работает только в OnShow, иначе не хочет запускаться
applet на form уже исправил
jpg.Draw(form.canvas.handle,0,0) прочитал в уроках по KOL


 
S!R!X   (2003-11-06 23:38) [8]

сделал так:

procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var windowrgn:HRGN;
begin
jpg := Newjpeg;
jpg.LoadFromFile("fon.jpg");
windowrgn:=createroundrectrgn(0,0,form.Width,form.Height,100,100);
Setwindowrgn(form.Handle,windowrgn,true);
end;

procedure TForm1.KOLForm1Paint(Sender: PControl; DC: HDC);
begin
jpg.Draw(DC,0,0);
end;

все равно тоже самое =(


 
Gandalf ©   (2003-11-07 00:04) [9]

А флаг?


 
Vladimir Kladov   (2003-11-07 09:11) [10]

Еще одна возможная причина - тормоза при рисовании на канве контрола битмапа (который получился в jpg) с нессответствующими экрану параметрами. Можно попробовать создать bitmap нужной ширины/высоты и нарисовать jpg на нем, а потом рисовать уже этот битмап (jpg уже не нужен).

bmp := NewBitmap(jpg.Width, jpg.Height);
jpg.Draw( bmp.Canvas.Handle, 0, 0 );
jpg.Free;

....

bmp.Draw( DC, 0, 0 );


 
S!R!X   (2003-11-07 12:16) [11]

2 Gandalf: с флагами пробовал, все равно перерисовывается
2 Vladimir Kladov: сделал, результат - аналогичный
Выкладываю код программы
[CODE]
....
procedure TForm1.KOLForm1FormCreate(Sender: PObj);
var windowrgn:HRGN;
begin
jpg := Newjpeg;
jpg.LoadFromFile("fon.jpg");
bmp := NewBitmap(jpg.Width, jpg.Height);
jpg.Draw( bmp.Canvas.Handle, 0, 0 );
jpg.Free;
dragging:=false;
windowrgn:=createroundrectrgn(0,0,form.Width,form.Height,100,100);
Setwindowrgn(form.Handle,windowrgn,true);
end;

procedure TForm1.KOLForm1MouseUp(Sender: PControl;
 var Mouse: TMouseEventData);
begin
dragging:=false;
end;

procedure TForm1.KOLForm1MouseDown(Sender: PControl;
 var Mouse: TMouseEventData);
begin
if mouse.Button=mbleft then
 begin
 dragging:=true;
 oldleft:=mouse.x;
 oldtop:=mouse.y;
 end;
end;

procedure TForm1.KOLForm1MouseMove(Sender: PControl;
 var Mouse: TMouseEventData);
begin
if dragging then
 begin
 form.left:=form.left+mouse.X-oldleft;
 form.Top:=form.top+mouse.Y-oldtop;
 end;
end;

procedure TForm1.KOLForm1Paint(Sender: PControl; DC: HDC);
begin
bmp.Draw(DC,0,0);
end;
[/CODE]


 
SPeller ©   (2003-11-07 13:46) [12]

Попробовал код. Как я и раньше предполагал, надо отлавливать сообщение формы WM_ERASEBKGND:

function TForm1.KOLForm1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
 Result := False;
 case Msg.message of
   WM_ERASEBKGND: Result := True;
 end;
end;


 
S!R!X   (2003-11-07 23:19) [13]

2 SPeller:
Спасибо огромное, а то я уж запарился с этой проблемой...


 
Lev   (2003-11-11 12:00) [14]

подскажите какой тип у переменных bmp, jpg?


 
SPeller ©   (2003-11-11 14:41) [15]


> подскажите какой тип у переменных bmp, jpg?

Абстрактный



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
3-1078830044
Stas
2004-03-09 14:00
2004.04.11
Delphi8 и ADO


14-1079155092
Nurali
2004-03-13 08:18
2004.04.11
На TWebBrowser свой PopupMenyu


1-1082613994
EvgeniyR
2004-04-22 10:06
2004.04.11
Rave Reports


1-1082628607
alextov
2004-04-22 14:10
2004.04.11
Нужно запустить ХП в отдельном потоке


14-1079708935
AsD
2004-03-19 18:08
2004.04.11
Large HDD