Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
ВнизКак избавиться от двойной прорисовке окна Найти похожие ветки
← →
Дмитрий_05 (2005-08-21 18:20) [0]Проблема заключается в следующем... У меня на Form.Canvas рисуется изображение... При программном изменении размера окна форма перерисовывается, а потом приходится еще раз перерисовывать. Получается так, что при уменьшении Form.Left, изображение сначала прыгает влево, а потом рисуется как надо...:
var
BMPMain: TBitmap;
procedure TForm1.WMEraseBkGnd(var Msg: TWMERASEBKGND);
begin
BitBlt(Msg.DC, 0, 0, Form1.ClientWidth, Form1.ClientHeight, BMPMain.Canvas.Handle, 0, 0, SRCCOPY);
Msg.Result := 1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
...
BoundsRect := WRect;
GenerateBMPMain; //функция генерирует изображение под размеры окна
Form1.Invalidate; //перерисовываем форму, точнее рисуем сгенерированное изображение на Form.Canvas
end;
Как бы мне от этого избавиться?
← →
Alexander Panov © (2005-08-21 18:33) [1]Прорисовка на канве формы должна быть в OnRepaint:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormPaint(Sender: TObject);
begin
with TForm(Sender) do
begin
Canvas.Brush.Color := clGreen;
Canvas.Ellipse(
20,
20,
TForm(Sender).ClientWidth-20,
TForm(Sender).Clientheight-20);
end;
end;
procedure TForm1.FormResize(Sender: TObject);
begin
Repaint;
end;
end.
← →
Юрий Зотов © (2005-08-21 18:40) [2]> Дмитрий_05 (21.08.05 18:20)
Выкиньте все (включая GenerateBMPMain) и напишите StretchBlt в обработчике события OnPaint. Больше ничего не надо.
← →
KilkennyCat © (2005-08-21 18:49) [3]
> [1] Alexander Panov © (21.08.05 18:33)
Разве ресайз не вызовет перерисовку автоматически?
← →
Alexander Panov © (2005-08-21 19:13) [4]втоматически будт перерисованы только области, которые либо были перекрыты до этого, либо появившиеся области клиентскогй области, появившиеся в результате измененияя размеров окна.
← →
Дмитрий_05 (2005-08-21 21:39) [5]У меня изображение немного по другому создается, которое надо нарисовать на форме... Stretch не поможет...
← →
Дмитрий_05 (2005-08-21 22:02) [6]Всеравно "прыгает" изображение при программном изменении размера окна, когда Form.Left изменяется в меньшую сторону... Получается так, когда форма поменяет размер, т.е. BoundsRect := WRect; выполнитля, и т.к. Form.Left уменьшится то изображение какое было нарисуется с новыми координатами... а потом когда выполнится FormResize перерисовывается еще раз, но уже нормально...
Сделал так:
procedure TForm1.Button1Click(Sender: TObject);
begin
...
BoundsRect := WRect;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
BitBlt(Form1.Canvas.Handle, 0, 0, Form1.ClientWidth, Form1.ClientHeight, BMPMain.Canvas.Handle, 0, 0, SRCCOPY);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
GenerateBMPMain;
Repaint;
end;
А вот как сделать чтобы не прыгало ума не приложу...
← →
Турист (2005-08-21 23:05) [7]>Дмитрий_05
Без тестового кода, демонстрирующего проблему, как-то сложно
← →
Дмитрий_05 (2005-08-22 11:39) [8]Немного переделал, вроде нормально сейчас... А чтоб вообще не прыгало сделал с исчезновением и появлением формы. Но теперь у меня почему-то кнопки(TButton) стали пропадать при изменении размера окна, почему? Сделал я вот как:
procedure TForm1.FormPaint(Sender: TObject);
begin
BitBlt(Form1.Canvas.Handle, 0, 0, WRect.Right, WRect.Bottom, BMPMain.Canvas.Handle, 0, 0, SRCCOPY);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
Form1.Invalidate;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
...
AnimateWindow(Form1.Handle, 50, AW_BLEND or AW_HIDE); //форма исчезает
GenerateBMPMain;
Form1.Invalidate;
BoundsRect := WRect;
AnimateWindow(Form1.Handle, 50, AW_BLEND); //форма появляется
end;
← →
Дмитрий_05 (2005-08-22 11:41) [9]P.S. Вот когда наведешь курсором на кнопку, когда она исчезнет, где она должна быть, кнопка появляется...
← →
Дмитрий_05 (2005-08-22 22:59) [10]Ау!
← →
Турист (2005-08-22 23:19) [11]Турист (21.08.05 23:05) [7]
← →
KilkennyCat © (2005-08-22 23:40) [12]кинул на форму тулбар, и как хранитель картинки TImage (visible=false).
написал следующее:procedure TForm1.FormResize(Sender: TObject);
begin
stretchblt(canvas.Handle,0,0,width,height,image1.Canvas.Handle,0,0,640,480,srccopy);
end;
procedure TForm1.ToolButton2Click(Sender: TObject);
begin
left := 20;
width := 500;
FormResize(sender);
end;
procedure TForm1.ToolButton3Click(Sender: TObject);
begin
height := 800;
top := 40;
FormResize(sender);
end;
Ничего не прыгает, ничего не исчезает...
← →
Дмитрий_05 (2005-08-23 00:18) [13]исчезает почему-то при использовании функции AnimateWindow...
← →
KilkennyCat © (2005-08-23 00:30) [14]ок.
добавил ещеprocedure TForm1.ToolButton1Click(Sender: TObject);
begin
AnimateWindow(Handle, 50, AW_BLEND or AW_HIDE);
AnimateWindow(Handle, 50, AW_BLEND);
FormResize(Sender);
end;
Опять все нормально, ничего не прыгает, ничего не исчезает...
← →
Дмитрий_05 (2005-08-23 00:30) [15]Вот грубый пример, на форму кинул кнопку и создал на нее событие:
procedure TForm1.Button1Click(Sender: TObject);
begin
AnimateWindow(Form1.Handle, 50, AW_BLEND or AW_HIDE); //исчезает
AnimateWindow(Form1.Handle, 50, AW_BLEND); //появляется
end;
Кнопка исчезает... И почему???
← →
KilkennyCat © (2005-08-23 00:41) [16]а... понятно.
Используйте SpeedButton.
← →
Дмитрий_05 (2005-08-23 00:44) [17]И правда не исчезает...)))
← →
Дмитрий_05 (2005-08-23 00:58) [18]А... оказывается этот глюк не только с TButton, а со многими компонентами... У Edit-а и Memo исчезают бордюры, другие еще пока не смотрел... Что-то меня разочаровала эта функция... Есть ли какойнибудь аналог ей?
← →
Дмитрий_05 (2005-08-23 00:58) [19]А... оказывается этот глюк не только с TButton, а со многими компонентами... У Edit-а и Memo исчезают бордюры, другие еще пока не смотрел... Что-то меня разочаровала эта функция... Есть ли какойнибудь аналог ей?
← →
Defunct © (2005-08-23 01:04) [20]Дмитрий_05
Почему вы всегда со всем соглашаетесь?
Думал спросите:
А в чем отличие спид батона, от обычного батона? :)
А можно вместо батона использовать ну... хлеб например, или булку?
:)
← →
KilkennyCat © (2005-08-23 01:17) [21]
> [20] Defunct © (23.08.05 01:04)
я тоже так думал :)
← →
Дмитрий_05 (2005-08-23 01:27) [22]Большая разница... родительские классы разные... у TButton - TButtonControl, а он в свою очередь наследник TWinControl, а у TSpeedButton - TGraphicControl. Вот с TGraphicControl функция вроде как нормально работает, а с TWinControl неочень...(((
← →
Дмитрий_05 (2005-08-23 15:08) [23]Я что-то так никак не разберусь почему они исчезают... Есть ли какойнибудь другой способ плавного исчезновения, а потом появления формы?
← →
Турист (2005-08-23 20:32) [24]>Дмитрий_05 (23.08.05 15:08) [23]
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if FDelta > 0 then begin
if AlphaBlendValue + FDelta < 255 then
AlphaBlendValue := AlphaBlendValue + FDelta
else begin
AlphaBlendValue := 255;
FDelta := - FDelta
end
end else begin
if AlphaBlendValue + FDelta > 0 then
AlphaBlendValue := AlphaBlendValue + FDelta
else begin
AlphaBlendValue := 0;
FDelta := -FDelta
end
end
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled := True
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FDelta := 10;
Timer1.Interval := 100;
end;
← →
Турист (2005-08-23 20:35) [25]AlphaBlend = True
← →
KilkennyCat © (2005-08-23 23:07) [26]
> [24] Турист (23.08.05 20:32)
Вау!
Намного лучше было бы работать с двумя скриншотами: формой, и то, что под формой, чем так извращать.
← →
Турист (2005-08-23 23:16) [27]>KilkennyCat © (23.08.05 23:07) [26]
Поясни, пожалуйста
← →
KilkennyCat © (2005-08-24 01:30) [28]Когда нам нужно иметь эффект, мы делаем скриншот области формы, и рабочего стола под формой. Далее форму убиваем, оставляя на ее месте только ее картинку. Любым эффектом меняем ее с картинкой рабочего стола. По окончании эффекта восстанавливаем (или убиваем) форму в нормальное состояние. Идея не нова, даже компонент где-то видел. Преимущество: работа в вин 9х, нет дерганья, как в Вашем варианте (на старых машинах заметно), и особенный плюс - целая гамма эффектов. Посмотрите компонент PicShow: http://www.delphiarea.com/products/picshow/
← →
Турист (2005-08-24 07:26) [29]>KilkennyCat © (24.08.05 01:30) [28]
Вы видимо хорощо в этом разбираетесь, если не затруднит, Ваш вариант, аналогичный Турист (23.08.05 20:32) [24]
Посмотреть PicShow я могу, только вот не пойму зачем ?
← →
KilkennyCat © (2005-08-24 08:08) [30]
> если не затруднит, Ваш вариант
вечером. спать пошел. или днем, если опять нихрена спать не дадут.
← →
Дмитрий_05 (2005-08-25 08:10) [31]KilkennyCat не пропадай...
← →
KilkennyCat © (2005-08-25 08:50) [32]:) сейчас, еще немного осталось ;)
← →
Дмитрий_05 (2005-08-26 19:51) [33]KilkennyCat совсем пропал куда-то...(((
← →
Дмитрий_05 (2005-08-29 15:08) [34]KilkennyCat ау!!!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.044 c