Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вывод графики в чужом окне. [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 заремен... Тоже не помогает?


Наверх

Титульная страница Поиск, карта сайта Написать письмо