![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вывод графики в чужом окне. [D5, Win95/98]
Sheriff © (2002-05-22 13:37:00)Помнится нечто похожее уже обсуждалось, только приведенные примеры у меня не работают. Может где-то ошибка. Картинка выводится (BitMap) в чужом окне, а вот потом не получается ее убрать. (W98, D5)
Привожу фрагмент кода:
Alarm1:=TBitMap.Create;
try
Alarm1.LoadFromResourceName(hinstance,"Alarm"+IntToStr(Random(6)+1));
Dc1:=GetWindowDC(GetForegroundWindow);
GetWindowRect(GetForegroundWindow,Rt);
{ SetBKMode(Dc1,TRANSPARENT);}
x:=(Rt.BottomRight.x-Rt.TopLeft.x-Alarm1.Width) div 2;
y:=(Rt.BottomRight.y-Rt.TopLeft.y-Alarm1.Height) div 2;
BitBlt(Dc1,x,y,x+Alarm1.Width,y+Alarm1.Height,Alarm1.Canvas.Handle,0,0,SRCCOPY);
Sleep(3000);
finally
ReleaseDC(0,Dc1);
{InvalidateRect очищает саму форму, но не контролы}
{ InvalidateRect(GetForegroundWindow,nil,true);}
{WM_NCPAINT форма вообще не реагирует}
PostMessage(HWND_BROADCAST,WM_NCPAINT,0,0);
{ SendMessage(GetForegroundWindow,WM_PAINT,0,0);}
Alarm1.Free;
end;
И второй вопрос: как вывести картинку Alarm1 (BitMap) с прозрачным фоном? Заранее спасибо.
Sheriff (2002-05-24 07:01:00) [1]похоже WM_PAINT все же работает... и с радостью прорисовывает все, что есть в окне... в том числе и саму картинку. ;-)
Пошел по пути создания окошка с картинкой. Все получилось. Большое спасибо за идею. :-)
SPeller (2002-05-23 09:47:00) [2]2 Sheriff
А зачем рисовать именно на окне другого приложения? Можно сделать своё окно, расположить его поверх нужного и рисовать. Вычислить размеры подопытного окна я думаю проблем не составит. Поставить хук на него и отлавливать перемещение, изменение размеров и т.д. А вот насчёт перерисовки окон контролов в чужих окнах инструментами Дельфи я не уверен. Я не понимаю, можно ли вообще в чужом окне у некоего контрола вызвать какой-то метод?? Тем более если прога написана на другом языке. Любая программа не может так просто иметь доступ ко всем свойствам всех контролов всех приложений. Здесь я думаю надо пользоваться ВинАПИ. Найти все дочерние окна и каждому отправить WM_PAINT.
Sheriff (2002-05-23 07:05:00) [3]cdaDmitriy. имеется ввиду сохранить область формы под картинкой, а после вывода и последующего убирания картинки вернуть сохраненную область на место?
Можно попробовать, но если в момент вывода картинки на каком либо окне его содержимое изменяется (скажем прокрутка текста в Word), то такой подход работать не будет. Потому и стоит задача заставить контролы прорисовать себя самостоятельно. Только вот не хотят гады. :-(
Пробовал пройтись по всем сонтролам принудительно:
for i:=0 to Screen.ActiveForm.ControlCount-1 do Screen.ActiveForm.Controls[i].Repaint;
но и это не возымело действие... плз. подскажите хоть куда пялиться...
cdaDmitriy (2002-05-22 20:49:00) [4]вопрос - при проведении ( перекрытии ) и послкдующим убиранием
третьим окном второе перерисовается ?
если да то можно попробывать -- перед рисованием сохрани картинку а после выведи
если получится пишли по почте
Sheriff (2002-05-22 20:11:00) [5]Решение вопроса №2 я нашел. Но вопрос 1 остается открытым.
Неужели никто не знает ответ?
Sheriff (2002-05-22 15:09:00) [6]к сожалению, не помогает. :(
Song (2002-05-22 14:58:00) [7]А WM_PAINT заремен... Тоже не помогает?