|
Вопрос # 2 517/ вопрос открыт / |
|
Здравствуйте, эксперты! Рисую на экране прямые (код в приложении).
Проблема в том, что надо удалить все что нарисовано. Видимо как то надо обновить все окна, но что-то у меня не получилось. Пробовал SendMessage(HWND_broadcast,wm_paint,0,0),но не помогло....
Приложение: Переключить в обычный режим- procedure TForm1.FormCreate(Sender: TObject);
- begin
- Scr := TCanvas.Create;
- Scr.Handle := GetDC(HWND_DESKTOP);
- end;
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- Scr.Free;
- end;
- procedure TForm1.Timer1Timer(Sender: TObject);
- begin
- Scr.MoveTo(mouse.CursorPos.x,mouse.CursorPos.y);
- Scr.LineTo(mouse.CursorPos.x+500,mouse.CursorPos.y);
- end;
 |
Вопрос задал: Ученый (статус: 8-ой класс)
Вопрос отправлен: 13 марта 2009, 18:38
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Паровоз
Здравствуйте, Ученый!
Установите
SetROP2(Scr.Handle,R2_NOTXORPEN);
и нарисуйте линию снова.
 |
Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 13 марта 2009, 19:14
Оценка за ответ: 5
Комментарий к оценке: Спасибо большое!!!
|
Мини-форум вопроса
Всего сообщений: 12; последнее сообщение — 13 марта 2009, 20:33; участников в обсуждении: 4.
|
Вадим К (статус: Академик), 13 марта 2009, 18:54 [#1]:
А зачем посылать сообщение всем? может проще послать только рабочему столу, если на нем рисуем. Его хендл известен - это 0. Хотя документация утверждает, что лучше использовать константу HWND_DESKTOP.
Попробуйте
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ученый (статус: 8-ой класс), 13 марта 2009, 19:01 [#2]:
Нужно именно все окна, так как рисовать буду не только на рабочем столе но и в окнах приложений... Пробовал заменить на SendMessage(HWND_DESKTOP,wm_paint,0,0) ничего не выходит....раб. стол не обновляется...
|
|
Вадим К (статус: Академик), 13 марта 2009, 19:03 [#3]:
Можно попробовать послать рабочему столу ещё нажатие кнопки F5.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Ученый (статус: 8-ой класс), 13 марта 2009, 19:10 [#4]:
наткнулся на RedrawWindow, пишут что помогает в таких случаях, но только не знаю какие параметры задать .....
|
|
gyhy (статус: Посетитель), 13 марта 2009, 19:13 [#5]:
По конкретней можно, Что надо?
Если имеется ввиду нулевая обрисовка, то проект именуеш (присваеваиш) nil и всех делов
|
|
Ученый (статус: 8-ой класс), 13 марта 2009, 19:25 [#6]:
То demmetriy. я Рисую на рабочем столе и в окнах других приложений.... все нарисованное остается до тех пор пока не обновиться окно или сам раб стол.... вот мне как раз и надо все это нарисованное убрать. На счет nil если можно поподробнее, не знаю что это и с чем едят....
То Паровоз не работает ваш код.....линии так и остаются... может конешн я что не так сдела....скиньте исходник если можно....
|
|
Паровоз (статус: 10-ый класс), 13 марта 2009, 19:31 [#7]:
"не работает ваш код"
SetROP2 нужно установить перед рисованием исходной линии
|
|
Ученый (статус: 8-ой класс), 13 марта 2009, 19:32 [#8]:
Паровоз, может так...щас попробую....
а лучше киньте исходничек...
|
|
Ученый (статус: 8-ой класс), 13 марта 2009, 19:35 [#9]:
Паровоз, делаю так
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SetROP2(Scr.Handle,R2_NOTXORPEN);
Scr.MoveTo(mouse.CursorPos.x,mouse.CursorPos.y);
Scr.LineTo(mouse.CursorPos.x+500,mouse.CursorPos.y);
end;
линии так и остаются на окнах и столе, правда уже немного другого цвета, не черного как раньше...
|
|
Паровоз (статус: 10-ый класс), 13 марта 2009, 19:41 [#10]:
"линии так и остаются на окнах и столе"
Так Вы же не рисуете их второй раз. Нужно запомнить координаты предыдущей линии mouse.CursorPos.x,mouse.CursorPos.y и повторно нарисовать ту же линию (по нарисованной в предыдущий раз), а затем рисовать линию с новыми концами.
|
|
Ученый (статус: 8-ой класс), 13 марта 2009, 19:44 [#11]:
что то я окончательно запутался....что именно надо дописать чтоб заработало?
|
|
Паровоз (статус: 10-ый класс), 13 марта 2009, 20:33 [#12]:
var
Scr : TCanvas;
x,y:Integer;
Second:Boolean;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Scr.Free;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=False;
Scr.MoveTo(x,y);
Scr.LineTo(x+500,y);
if not Second then
begin
x:=mouse.CursorPos.x;
y:=mouse.CursorPos.y;
end;
Second:=not Second;
Timer1.Enabled:=True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Scr := TCanvas.Create;
Scr.Handle := GetDC(HWND_DESKTOP);
SetROP2(Scr.Handle,R2_NOTXORPEN);
x:=mouse.CursorPos.x;
y:=mouse.CursorPos.y;
Scr.MoveTo(x,y);
Scr.LineTo(x+500,y);
Timer1.Enabled:=True;
end;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|