![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Canvas&Desktop [D6, D7, WinXP]
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;