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

Вниз

Canvas&Desktop   Найти похожие ветки 

 
kernel ©   (2006-12-02 15:36) [0]

Доброго времени суток.

Рисую на рабочем столе с помощью этого:

var
 c: TCanvas;
begin
 c := TCanvas.Create;
 c.Handle := GetDC(0);
//тут само рисование  
ReleaseDC(0, c.Handle);


Теперь вопрос: Как все это дело стереть?


 
Palladin ©   (2006-12-02 15:44) [1]

Проблема решается в корне. Нужно просто не рисовать.


 
trubin   (2006-12-02 16:28) [2]

Как вариант:

var
 pr: PRect;

...

 New(pr);
 try
   pr^.Left:= 0;
   pr^.Top:=  0;
   pr^.Right:= GetSystemMetrics(SM_CXSCREEN);
   pr^.Bottom:= GetSystemMetrics(SM_CYSCREEN);
   InvalidateRect(HWND_DESKTOP, pr, False);
   RedrawWindow(HWND_DESKTOP, pr, 0, 0);
 finally
   Dispose(pr);
 end;


 
oxffff ©   (2006-12-02 16:54) [3]


> kernel ©   (02.12.06 15:36)  
> Доброго времени суток.
>
> Рисую на рабочем столе с помощью этого:
>
> var
>  c: TCanvas;
> begin
>  c := TCanvas.Create;
>  c.Handle := GetDC(0);
> //тут само рисование  
> ReleaseDC(0, c.Handle);
>
> Теперь вопрос: Как все это дело стереть?


Стереть, что?
То что нарисовано?
Данные на диске?


 
oxffff ©   (2006-12-02 16:56) [4]

InvalidateRect(
> trubin   (02.12.06 16:28) [2]
> Как вариант:
>
> var
>  pr: PRect;
>
> ...
>
>  New(pr);
>  try
>    pr^.Left:= 0;
>    pr^.Top:=  0;
>    pr^.Right:= GetSystemMetrics(SM_CXSCREEN);
>    pr^.Bottom:= GetSystemMetrics(SM_CYSCREEN);
>    InvalidateRect(HWND_DESKTOP, pr, False);
>    RedrawWindow(HWND_DESKTOP, pr, 0, 0);
>  finally
>    Dispose(pr);
>  end;


А может проще так  

InvalidateRect(0,nil,false)


 
kernel ©   (2006-12-07 18:25) [5]

Спасибо, но эти способы немного не подходят. При "прочистке" десктопа все на экране мерцает. Есть ли способ "более не мерцающий"?


 
oxffff ©   (2006-12-07 21:31) [6]

Конечно же есть.
Twincontrol
   DoubleBuffered:=TRUE;

Либо своя реализация.


 
Loginov Dmitry ©   (2006-12-07 23:27) [7]

> Есть ли способ "более не мерцающий"?


см [1]


 
Elen ©   (2006-12-08 07:36) [8]


> Есть ли способ "более не мерцающий"?
>

В принципе есть - на своей форме в которой можно попробовать сделать прозрачный фон. Но обьясни что ты там рисуеш, может тебе проще будет другими средствами реализовать задачу.?


 
kernel ©   (2006-12-08 07:49) [9]


> В принципе есть - на своей форме в которой можно попробовать
> сделать прозрачный фон. Но обьясни что ты там рисуеш, может
> тебе проще будет другими средствами реализовать задачу.?
>


Я пытаюсь нарисовать рамку красного цвета по краям монитора ~3-4 пиксела. Кстати, пробовал делать прозрачный фон на форме, но только если мне необходимо, например, 3 раза в секунду нарисовать и убрать эту форму, мое приложение начинает тормозить, т. е. ничего не может делать в то время, пока рисуется эта форма.


 
Алексей С.   (2006-12-08 08:07) [10]

Просто мысль: а если попробывать разбить работу приложения по потокам ??? Поможет? интересно...


 
kernel ©   (2006-12-08 08:13) [11]


> Просто мысль: а если попробывать разбить работу приложения
> по потокам ??? Поможет? интересно...


Наверное, не поможет... :/


 
Алексей С.   (2006-12-08 08:15) [12]

При рисовании на  форме можно нарисовать один раз, а потом просто прятать и показывать форму ??? А так ?


 
kernel ©   (2006-12-08 08:27) [13]


> При рисовании на  форме можно нарисовать один раз, а потом
> просто прятать и показывать форму ??? А так ?


Во-первых, при отображении формы (а форма отображается при вводе определенных символов на клавиатуре) "SetFocus" автоматически устанавливается на форму, что препятствует вводу текста.
Во-вторых, при вводе этих определенных символов, программа начинает тормозить настолько, что, в лучшем случае, отображаются 1-2 символа в секунду.

Вот.


 
kernel ©   (2006-12-08 18:11) [14]

Вариантов больше нет?


 
RASkov   (2006-12-09 18:11) [15]


Я пытаюсь нарисовать рамку красного цвета по краям монитора ~3-4 пиксела


> [13] kernel ©   (08.12.06 08:27)

Как вариант: Сделай форму без заголовка, красного цвета, на весь экран, StayOnTop и вырежь внутри нее прямоугольник (что бы осталась только "рамка от формы")

procedure TForm1.FormCreate(Sender: TObject);
var FRGN, FRGN1: HRGN;
begin
ClientWidth:=Screen.Width; ClientHeight:=Screen.Height;
FRGN:=CreateRectRgn(0, 0, ClientWidth, ClientHeight);
FRGN1:=CreateRectRgn(4, 4, ClientWidth-4, ClientHeight-4);
CombineRgn(FRGN, FRGN, FRGN1, RGN_DIFF);
try
SetWindowRgn(Handle, FRGN, False);
finally DeleteObject(FRGN); end;
Application.ShowMainForm:=False;
end;

И
Form1.Visible:=not Form1.Visible;

Но только придется наверное избавиться от появления/пропадания панельки на таскбаре...


 
kernel ©   (2006-12-09 20:25) [16]

RASkov, см. [13]


 
RASkov   (2006-12-10 01:06) [17]

> [16] kernel ©   (09.12.06 20:25)

Я пробывал с куском кода приведенным в [15] и на таймер была строчка
Form1.Visible:=not Form1.Visible; запустил все это "на фоне блокнота" в котором набирал текст и моя форма(рамка) показывалась/пряталась не мешая мне набирать текст в блокноте, единственный косяк был с панелькой на таскбаре, о чем я уже говорил.
Ну да ладно, я же как вариант предложил, как говориться - не нравится не ешь.


 
Fredy314 ©   (2006-12-11 10:50) [18]

Можно рисовать в принципе как рисовал, только запоминать что было под нарисованым, и чтобы стереть отрисовать запомненное.
И ИМХО лучше будет не создавать TCanvas, а исользовать напрямую вызовы ВинАпи. Темболее тебе нужно нарисовать пару линий.


 
kernel ©   (2006-12-12 15:13) [19]


> Можно рисовать в принципе как рисовал, только запоминать
> что было под нарисованым, и чтобы стереть отрисовать запомненное.
>


я думаю, что все будет очень тормозить


> И ИМХО лучше будет не создавать TCanvas, а исользовать напрямую
> вызовы ВинАпи. Темболее тебе нужно нарисовать пару линий.
>


А как это через WinAPI? Просто, например, Rectangle(GetDC(0).....)??


 
Fredy314 ©   (2006-12-12 18:48) [20]


> [2] trubin   (02.12.06 16:28)

Если рисуется только рамочка не нужно обновлять весь екран,или 4 прямоугольника по ширине линий, или регион с дыркой посредине, и мограть не должно.

> [19] kernel ©   (12.12.06 15:13)

если весь экран перерисовывать то конечно будет тормозить.
DC:=GetDC(0)- вызывать один раз.
MoveTo(DC,0,0);
LineTo(DC,0,H);
LineTo(DC,W,H);
LineTo(DC,W,0);
LineTo(DC,0,0);
ReleaseDC(0,DC);
Толщину линий задавать созданием нового пера или рисовать рядом несколько линий.


 
Дмитрий Белькевич ©   (2006-12-14 02:33) [21]

> Можно рисовать в принципе как рисовал, только запоминать
> что было под нарисованым, и чтобы стереть отрисовать запомненное.
>

+1. Сразу такая же мысль пришла. Если сильно нужно - запоминай то, что было, как я понял, запоминать не много. Только глюки полезут, если выведешь то, что было раньше, а реальное  изображение уже изменилось (окно, например, перетащили).



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

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

Наверх




Память: 0.52 MB
Время: 0.037 c
2-1168962315
Megabyte
2007-01-16 18:45
2007.02.04
Определить текущую директорию в консольном приложении


8-1149685999
pm
2006-06-07 17:13
2007.02.04
VideoWindow не на главной форме


15-1168304227
vasIzmax
2007-01-09 03:57
2007.02.04
Везет как утопленнику :(


15-1168654961
Tirael
2007-01-13 05:22
2007.02.04
цена прграммы


9-1142779428
Sam Stone
2006-03-19 17:43
2007.02.04
Проникновение объектов друг в друга