Форум: "WinAPI";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];
ВнизВывод графики в чужом окне. Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.07.29;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c