Форум: "Основная";
Текущий архив: 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.046 c