| 
| 
 | Вопрос # 2 517/ вопрос открыт / | 
 |  Здравствуйте, эксперты! Рисую на экране прямые (код в приложении).Проблема в том, что надо удалить все что нарисовано. Видимо как то надо обновить все окна, но что-то у меня не получилось. Пробовал SendMessage(HWND_broadcast,wm_paint,0,0),но не помогло....
 Приложение:Переключить в обычный режим procedure TForm1.FormCreate(Sender: TObject);beginScr := TCanvas.Create;Scr.Handle := GetDC(HWND_DESKTOP);end;procedure TForm1.FormDestroy(Sender: TObject);beginScr.Free;end;procedure TForm1.Timer1Timer(Sender: TObject);beginScr.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;
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |