Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"перерисовать" экран [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]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо