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

Вниз

"перерисовать" экран   Найти похожие ветки 

 
BBoost ©   (2005-08-20 01:23) [0]

Здравствуйте, мастера! скажите пожалуйста как можно  "перерисовать" экран, т.е. "стереть" с него все, что было раньше нарисовано? Пробовал так:
SendMessage(Scr.Handle,WM_PAINT,0,0), где SCR.Handle - указатель на экран. Не помогло. Может, я что-то не так делаю?


 
Defunct ©   (2005-08-20 01:35) [1]

> "перерисовать" экран, т.е. "стереть"

перерисовать <> стереть.
более четко сформулируй задачу.


 
Джо ©   (2005-08-20 01:39) [2]

UpdateWindow, что ли?


 
BBoost ©   (2005-08-20 01:40) [3]

Я нарисовал на экране Еллипс (как известно, он рисуется поверх ввсех окон), теперь я хочу, чтобы экран принял прежний вид, т.е. без Еллипса. Может так доходчивее: "Screen Refresh"


 
Джо ©   (2005-08-20 01:42) [4]


> Я нарисовал на экране Еллипс (как известно, он рисуется
> поверх ввсех окон),

Первый раз слышу, чтобы эллипс рисовался "поверх всех окон".


 
Defunct ©   (2005-08-20 01:46) [5]

BBoost ©   (20.08.05 01:40) [3]
> Я нарисовал на экране Еллипс (как известно, он рисуется поверх ввсех окон),

Так... мне не известно о том, что эллипсы рисуются поверх всех окон. Отсюда следуюет вполне справедливая просьба:
Покажи кусок кода которым рисуется эллипс.


 
BBoost ©   (2005-08-20 01:46) [6]


> Первый раз слышу, чтобы эллипс рисовался "поверх всех окон".


var Scr:TCanvas;
begin

Scr:=TCanvas.Create;
Scr.Handle:=GetDC(0);
Ellipse(Scr.Handle,0,0,100,100);
Scr.Free;
end;

вот так он рисуется поверх всего.
UpdateWindow не работает


 
Джо ©   (2005-08-20 01:49) [7]

 InvalidateRect(0,nil,True)


 
BBoost ©   (2005-08-20 01:56) [8]


> InvalidateRect(0,nil,True)

Это, конечно, хорошо, но не со всего стирает:
var Scr:TCanvas;
x:integer;
begin
Scr:=TCanvas.Create;
Scr.Handle:=GetDC(0);
Ellipse(Scr.Handle,0,0,100,100);
for x:=1 to 1000 do begin
Lineto(scr.handle,x,round(sin(x*pi/360)*100)+100);
InvalidateRect(0,nil,True);
end;
ReleaseDC(0,Scr.Handle);
Scr.Free;
end;

при движении точки экран не прорисовывается до конца, и на кнопках остается след движения


 
Defunct ©   (2005-08-20 02:00) [9]

BBoost ©   (20.08.05 01:46) [6]

Понятно, в таком случае надо самостоятельно запоминать участок экрана в буфер (например в bitmap) и потом также самостоятельно его восстанавливать.

небольшой пример:

var
 HoldingImage : boolean = false;

procedure TForm1.Button1Click(Sender: TObject);
var
 Scr : TCanvas;
 Bmp : TBitmap;
begin
 if HoldingImage then
 begin
    HoldingImage := false;
    exit;
 end;

 Scr := TCanvas.Create;
 Scr.Handle := GetDC( 0 );
 try
    HoldingImage := True;

    Bmp := TBitmap.Create;
    with Bmp do
    try
       Width := Screen.Width;
       Height := Screen.Height;

       Canvas.CopyRect( Rect(0,0, Width, Height), Scr, Rect(0,0, Width, Height) );

       Scr.Ellipse( Rect(0,0, Width, Height)  );

       while HoldingImage do Application.ProcessMessages;

       Scr.CopyRect( Rect(0,0, Width, Height), Canvas, Rect(0,0, Width, Height) );

    finally
       free
    end;
 finally
    ReleaseDC( 0, Scr.Handle );
    Scr.Free;
 end;
end;


 
Джо ©   (2005-08-20 02:02) [10]


>  [8] BBoost ©   (20.08.05 01:56)

Упаси Господь такое делать, как ты делаешь...
Сделай копию экрана, выведи ее на полноэкранную форму, рисуй на ней что захочешь, а затем убирай. Или же используй возможности видеодрайвера. Или же, перед тем, как выводить что-то в определенное место экрана - запоминай старое состояние этого места. Затем возвращай как было. А то, что ты привел в купе с [0] - нереальное требование, вызывающее у нервных людей, таких как, например, я, тики по всему телу и немотивированные реакции. Удачи.


 
Adder ©   (2005-08-20 02:06) [11]

Тогда уж так:

var Scr:TCanvas;
x:integer;
begin
Scr:=TCanvas.Create;
Scr.Handle:=GetDC(0);
Ellipse(Scr.Handle,0,0,100,100);
for x:=1 to 1000 do begin
Lineto(scr.handle,x,round(sin(x*pi/360)*100)+100);
//InvalidateRect(0,nil,True);
end;
InvalidateRect(0,nil,True);
ReleaseDC(0,Scr.Handle);
Scr.Free;
end;

Только не пойму, зачем рисовать, чтобы тут же стереть %)


 
BBoost ©   (2005-08-20 02:09) [12]

Код понял, но только это не экран , а картинка экрана до изменения. Поэтому если, скажем я нажал кнопку - появился круг, сдвинул окно, нажал кнопку, а окно уже на прежнем месте (якобы, ведь на экране картинка состояния исходного экрана), а это уже все портит...


 
BBoost ©   (2005-08-20 02:11) [13]


> Только не пойму, зачем рисовать, чтобы тут же стереть %)

идея - в движении точки по экрану


 
Defunct ©   (2005-08-20 02:12) [14]

BBoost ©   (20.08.05 02:09) [12]
> Код понял, но только это не экран

это как раз экран.

Рисуй на форме, либо в Image, и проблем таких не возникнет.


 
Deka ©   (2005-08-20 17:11) [15]

Может поискать информацию о том, как делаются скрин-мэйт? Там по экрану не то что точка движется...


 
BBoost ©   (2005-08-21 00:17) [16]


> Может поискать информацию о том, как делаются скрин-мэйт

это что такое,если не секрет ?


 
Eraser ©   (2005-08-21 00:23) [17]

http://kladovka.net.ru/index.cgi?pid=dir&rid=8&ppn=2

screenmate.zip by Kerk



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

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

Наверх




Память: 0.51 MB
Время: 0.028 c
1-1124236886
rosl
2005-08-17 04:01
2005.09.11
XML


1-1123694728
Starcom
2005-08-10 21:25
2005.09.11
Как у MessageDlg сделать фон к примеру Белым?


2-1123572231
Андрей235
2005-08-09 11:23
2005.09.11
Как сделать иконку в трее?


14-1124298671
lookin
2005-08-17 21:11
2005.09.11
Подсветка синтаксиса в Delphi6


6-1116936282
ZedeS
2005-05-24 16:04
2005.09.11
Access Violation и функция move