Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.29;
Скачать: CL | DM;

Вниз

Вывод графики в чужом окне.   Найти похожие ветки 

 
Sheriff   (2002-05-22 13:37) [0]

Помнится нечто похожее уже обсуждалось, только приведенные примеры у меня не работают. Может где-то ошибка. Картинка выводится (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) с прозрачным фоном? Заранее спасибо.


 
Song ©   (2002-05-22 14:58) [1]

А WM_PAINT заремен... Тоже не помогает?


 
Sheriff   (2002-05-22 15:09) [2]

к сожалению, не помогает. :(


 
Sheriff   (2002-05-22 20:11) [3]

Решение вопроса №2 я нашел. Но вопрос 1 остается открытым.
Неужели никто не знает ответ?


 
cdaDmitriy ©   (2002-05-22 20:49) [4]

вопрос - при проведении ( перекрытии ) и послкдующим убиранием
третьим окном второе перерисовается ?

если да то можно попробывать -- перед рисованием сохрани картинку а после выведи

если получится пишли по почте


 
Sheriff   (2002-05-23 07:05) [5]

cdaDmitriy. имеется ввиду сохранить область формы под картинкой, а после вывода и последующего убирания картинки вернуть сохраненную область на место?
Можно попробовать, но если в момент вывода картинки на каком либо окне его содержимое изменяется (скажем прокрутка текста в Word), то такой подход работать не будет. Потому и стоит задача заставить контролы прорисовать себя самостоятельно. Только вот не хотят гады. :-(
Пробовал пройтись по всем сонтролам принудительно:

for i:=0 to Screen.ActiveForm.ControlCount-1 do Screen.ActiveForm.Controls[i].Repaint;

но и это не возымело действие... плз. подскажите хоть куда пялиться...


 
SPeller ©   (2002-05-23 09:47) [6]

2 Sheriff

А зачем рисовать именно на окне другого приложения? Можно сделать своё окно, расположить его поверх нужного и рисовать. Вычислить размеры подопытного окна я думаю проблем не составит. Поставить хук на него и отлавливать перемещение, изменение размеров и т.д. А вот насчёт перерисовки окон контролов в чужих окнах инструментами Дельфи я не уверен. Я не понимаю, можно ли вообще в чужом окне у некоего контрола вызвать какой-то метод?? Тем более если прога написана на другом языке. Любая программа не может так просто иметь доступ ко всем свойствам всех контролов всех приложений. Здесь я думаю надо пользоваться ВинАПИ. Найти все дочерние окна и каждому отправить WM_PAINT.


 
Sheriff   (2002-05-24 07:01) [7]

похоже WM_PAINT все же работает... и с радостью прорисовывает все, что есть в окне... в том числе и саму картинку. ;-)
Пошел по пути создания окошка с картинкой. Все получилось. Большое спасибо за идею. :-)



Страницы: 1 вся ветка

Текущий архив: 2002.07.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
7-95587
Пушкарев Павел
2002-04-30 16:37
2002.07.29
Как определить Материнскую плату, звуковую и венчестер


14-95551
Dimka_Scandal
2002-07-04 02:30
2002.07.29
LISTBOX W ALFAWITE


14-95493
Igorek
2002-06-30 20:16
2002.07.29
Какая боль, какая боль, Бразилия-Германия 2:0!!!


1-95284
Michael2000
2002-07-17 12:12
2002.07.29
Запись в IStream


14-95511
Mirkoorio
2002-07-01 18:39
2002.07.29
FAT32 или NTFS?