Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.056 c
1-1165062961
kernel
2006-12-02 15:36
2007.02.04
Canvas&Desktop


4-1158880909
Worker
2006-09-22 03:21
2007.02.04
Как получить список зарегистрированных служб


15-1168780378
FAskerQ
2007-01-14 16:12
2007.02.04
Нужен перевод


3-1163411219
firebird
2006-11-13 12:46
2007.02.04
Может ли MySQL 5.0.1 оповещать своих клиентов?


2-1169118311
FIL-23
2007-01-18 14:05
2007.02.04
как узнать номер позиции указателя в таблице?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский