![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Фон программы
S!R!X © (2003-11-05 21:49:00)Пишу программу на 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;
Как от этого избавиться?
SPeller (2003-11-11 14:41:00) [1]
> подскажите какой тип у переменных bmp, jpg?
Абстрактный
Lev (2003-11-11 12:00:00) [2]подскажите какой тип у переменных bmp, jpg?
S!R!X (2003-11-07 23:19:00) [3]2 SPeller:
Спасибо огромное, а то я уж запарился с этой проблемой...
SPeller (2003-11-07 13:46:00) [4]Попробовал код. Как я и раньше предполагал, надо отлавливать сообщение формы 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 12:16:00) [5]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]
Vladimir Kladov (2003-11-07 09:11:00) [6]Еще одна возможная причина - тормоза при рисовании на канве контрола битмапа (который получился в jpg) с нессответствующими экрану параметрами. Можно попробовать создать bitmap нужной ширины/высоты и нарисовать jpg на нем, а потом рисовать уже этот битмап (jpg уже не нужен).
bmp := NewBitmap(jpg.Width, jpg.Height);
jpg.Draw( bmp.Canvas.Handle, 0, 0 );
jpg.Free;
....
bmp.Draw( DC, 0, 0 );
Gandalf (2003-11-07 00:04:00) [7]А флаг?
S!R!X (2003-11-06 23:38:00) [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;
все равно тоже самое =(
S!R!X (2003-11-06 23:30:00) [9]работает только в OnShow, иначе не хочет запускаться
applet на form уже исправил
jpg.Draw(form.canvas.handle,0,0) прочитал в уроках по KOL
Vladimir Kladov (2003-11-06 12:39:00) [10]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;
SPeller (2003-11-06 01:30:00) [11]А зачем при каждой перерисовке загружать картинку из файла??? Это тормоз для перерисовки. Может, если не грузить каждый раз, то и перерисовка незаметна будет?
S!R!X (2003-11-05 23:15:00) [12]Точно... про флаги то я и забыл
спасибо Gandalf
Gandalf (2003-11-05 22:39:00) [13]Ну флаг ставь при перетаскивании, который будет блокировать отрисовку.
S!R!X (2003-11-05 22:27:00) [14]винды у меня 2000....
насчет ничего страшного я сомневаюсь, т.к. при перерисовки начинает моргать форма (видно перерисовку). На 98 тоже самое
BelchonokH (2003-11-05 22:09:00) [15]У тебя XP наверное, у меня тоже перерисовка идёт, и ничего страшного, это от настроек винды зависит, в 98м вот у меня не отображать содержимое окна при перетаскивании стоит и всё нормально, ничего не перерисовывается...
ТОлько я не понял, почему картинка на апплет натягивается а не форму?