Форум: "Основная";
Текущий архив: 2005.09.11;
Скачать: [xml.tar.bz2];
Вниз"перерисовать" экран Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c