Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 517

/ вопрос открыт /

Здравствуйте, эксперты! Рисую на экране прямые (код в приложении).
Проблема в том, что надо удалить все что нарисовано. Видимо как то надо обновить все окна, но что-то у меня не получилось. Пробовал SendMessage(HWND_broadcast,wm_paint,0,0),но не помогло....

Приложение:
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. begin
  3. Scr := TCanvas.Create;
  4. Scr.Handle := GetDC(HWND_DESKTOP);
  5. end;
  6. procedure TForm1.FormDestroy(Sender: TObject);
  7. begin
  8. Scr.Free;
  9. end;
  10. procedure TForm1.Timer1Timer(Sender: TObject);
  11. begin
  12. Scr.MoveTo(mouse.CursorPos.x,mouse.CursorPos.y);
  13. Scr.LineTo(mouse.CursorPos.x+500,mouse.CursorPos.y);
  14. 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

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;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.02 сек.