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

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

Canvas&Desktop [D6, D7, WinXP]


Страницы:   1 2

kernel ©   (2006-12-02 15:36:00) 

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

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

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


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


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

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

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


Fredy314   (2006-12-12 18:48:00) [2]


> [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);
Толщину линий задавать созданием нового пера или рисовать рядом несколько линий.


kernel   (2006-12-12 15:13:00) [3]


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


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


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


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


Fredy314   (2006-12-11 10:50:00) [4]

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


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

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

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


kernel   (2006-12-09 20:25:00) [6]

RASkov, см. [13]


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


Я пытаюсь нарисовать рамку красного цвета по краям монитора ~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-08 18:11:00) [8]

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


kernel   (2006-12-08 08:27:00) [9]


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


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

Вот.


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

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


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


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


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


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

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


kernel   (2006-12-08 07:49:00) [13]


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


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


Elen   (2006-12-08 07:36:00) [14]


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

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


Loginov Dmitry   (2006-12-07 23:27:00) [15]

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


см [1]


oxffff   (2006-12-07 21:31:00) [16]

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

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


kernel   (2006-12-07 18:25:00) [17]

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


oxffff   (2006-12-02 16:56:00) [18]

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)


oxffff   (2006-12-02 16:54:00) [19]


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


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


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

Как вариант:

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;


Страницы:   1 2

Наверх

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