![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"перерисовать" экран [D6, WinXP]
BBoost © (2005-08-20 01:23:00)Здравствуйте, мастера! скажите пожалуйста как можно "перерисовать" экран, т.е. "стереть" с него все, что было раньше нарисовано? Пробовал так:
SendMessage(Scr.Handle,WM_PAINT,0,0), где SCR.Handle - указатель на экран. Не помогло. Может, я что-то не так делаю?
Eraser (2005-08-21 00:23:00) [1]http://kladovka.net.ru/index.cgi?pid=dir&rid=8&ppn=2
screenmate.zip by Kerk
BBoost (2005-08-21 00:17:00) [2]
> Может поискать информацию о том, как делаются скрин-мэйт
это что такое,если не секрет ?
Deka (2005-08-20 17:11:00) [3]Может поискать информацию о том, как делаются скрин-мэйт? Там по экрану не то что точка движется...
Defunct (2005-08-20 02:12:00) [4]BBoost © (20.08.05 02:09) [12]
> Код понял, но только это не экран
это как раз экран.
Рисуй на форме, либо в Image, и проблем таких не возникнет.
BBoost (2005-08-20 02:11:00) [5]
> Только не пойму, зачем рисовать, чтобы тут же стереть %)
идея - в движении точки по экрану
BBoost (2005-08-20 02:09:00) [6]Код понял, но только это не экран , а картинка экрана до изменения. Поэтому если, скажем я нажал кнопку - появился круг, сдвинул окно, нажал кнопку, а окно уже на прежнем месте (якобы, ведь на экране картинка состояния исходного экрана), а это уже все портит...
Adder (2005-08-20 02:06:00) [7]Тогда уж так:
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;
Только не пойму, зачем рисовать, чтобы тут же стереть %)
Джо (2005-08-20 02:02:00) [8]
> [8] BBoost © (20.08.05 01:56)
Упаси Господь такое делать, как ты делаешь...
Сделай копию экрана, выведи ее на полноэкранную форму, рисуй на ней что захочешь, а затем убирай. Или же используй возможности видеодрайвера. Или же, перед тем, как выводить что-то в определенное место экрана - запоминай старое состояние этого места. Затем возвращай как было. А то, что ты привел в купе с [0] - нереальное требование, вызывающее у нервных людей, таких как, например, я, тики по всему телу и немотивированные реакции. Удачи.
Defunct (2005-08-20 02:00: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;
BBoost (2005-08-20 01:56:00) [10]
> 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;
при движении точки экран не прорисовывается до конца, и на кнопках остается след движения
Джо (2005-08-20 01:49:00) [11]
InvalidateRect(0,nil,True)
BBoost (2005-08-20 01:46:00) [12]
> Первый раз слышу, чтобы эллипс рисовался "поверх всех окон".
var Scr:TCanvas;
begin
Scr:=TCanvas.Create;
Scr.Handle:=GetDC(0);
Ellipse(Scr.Handle,0,0,100,100);
Scr.Free;
end;
вот так он рисуется поверх всего.
UpdateWindow не работает
Defunct (2005-08-20 01:46:00) [13]BBoost © (20.08.05 01:40) [3]
> Я нарисовал на экране Еллипс (как известно, он рисуется поверх ввсех окон),
Так... мне не известно о том, что эллипсы рисуются поверх всех окон. Отсюда следуюет вполне справедливая просьба:
Покажи кусок кода которым рисуется эллипс.
Джо (2005-08-20 01:42:00) [14]
> Я нарисовал на экране Еллипс (как известно, он рисуется
> поверх ввсех окон),
Первый раз слышу, чтобы эллипс рисовался "поверх всех окон".
BBoost (2005-08-20 01:40:00) [15]Я нарисовал на экране Еллипс (как известно, он рисуется поверх ввсех окон), теперь я хочу, чтобы экран принял прежний вид, т.е. без Еллипса. Может так доходчивее: "Screen Refresh"
Джо (2005-08-20 01:39:00) [16]
UpdateWindow, что ли?
Defunct (2005-08-20 01:35:00) [17]> "перерисовать" экран, т.е. "стереть"
перерисовать <> стереть.
более четко сформулируй задачу.