Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1124470769
Пантелеев Иван
2005-08-19 20:59
2005.09.11
Фокус приложения


3-1121670371
passs
2005-07-18 11:06
2005.09.11
сохранение изменённых данных в БД


3-1122486388
Djek
2005-07-27 21:46
2005.09.11
Добавление значений в список Items в ComboBox


1-1124367880
nitrino
2005-08-18 16:24
2005.09.11
Access Violation


3-1122909888
ArchValentin
2005-08-01 19:24
2005.09.11
Сохранение информации из DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский