![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перехватить сообщенния(WM_PAINT) определенному контролу [D2005, XP]
Evil © (2008-05-04 17:33:00)Появилась некая необходимость вивести картинку в окне прыложенния...
Но загвоздка заключаеться в том что форма уже перекрыта панелью и на ней имеются контролы... Пытался рисовавть через TControlCanvas... но
у панели есть свой обработчик на сообщенния WM_PAINT...
Так вот такой вопрос: Как перехватить(определыть) это собщенния для панели?
Evil (2008-05-05 20:37:00) [1]Пасиба всем! розобрался :)
Игорь Шевченко (2008-05-05 09:29:00) [2]хуки, хуки...
type
TForm1 = class(TForm)
Panel1: TPanel;
...
procedure FormCreate(Sender: TObject);
...
private
OldPanelProc: TWndMethod;
procedure NewPanelProc (var Message: TMessage);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OldPanelProc := Panel1.WindowProc;
Panel1.WindowProc := NewPanelProc;
end;
procedure TForm1.NewPanelProc (var Message: TMessage);
begin
if Message.Msg = WM_PAINT then
begin
... тут делаешь, что хошь
end;
OldPanelProc(Message);
end;
Johnmen (2008-05-04 21:17:00) [3]
> Evil (04.05.08 21:14) [11]
Ну и вызывай InvalidateRect, InvalidateRgn.
Johnmen (2008-05-04 21:15:00) [4]
> Evil (04.05.08 21:02) [8]
Всё равно, не понятно, ЗАЧЕМ перехватывать?
Кстати, рекомендую почитать про WM_PAINT, зачем нужен, как генерится, с чем едят. Очень полезно, и вопросы странные исчезнут...
Evil (2008-05-04 21:14:00) [5]
> oldman © (04.05.08 21:08) [10]
рисую через ControlCanvas на Panel
Восхищенный (2008-05-04 21:08:00) [6]> Evil (04.05.08 21:02) [8]
Не удастся. Это процедура НЕ получит сообщений панели.
oldman (2008-05-04 21:08:00) [7]
> Evil (04.05.08 21:02) [8]
Одно не понимаю - куда ты хочешь вывести картинку, если форма "перекрыта" панелью?
Evil (2008-05-04 21:02:00) [8]
> Johnmen © (04.05.08 20:51) [7]
> > Evil (04.05.08 19:44) [2]Зачем у панели определена процедура
> для перехвата?
вот эту процедуру "procedure WMPaint(var Message: TWMPaint); message WM_PAINT;" я запхав в модуль главной формы в надежде на то что удастся перехватить Messageдля мого контрола(Tpanel) и обработать по своему... но здесь я наступил на новые грабли... как отделыть те месаги которые йдут для моего контрола...
Johnmen (2008-05-04 20:51:00) [9]
> Evil (04.05.08 19:44) [2]
Зачем у панели определена процедура для перехвата?
oldman (2008-05-04 20:46:00) [10]
> Evil (04.05.08 17:33)
> Но загвоздка заключаеться в том что форма уже перекрыта
> панелью
>
> Johnmen © (04.05.08 19:25) [1]
> Что такое "панель"?
> Evil (04.05.08 19:44) [2]
> панель это TPanel :-)
Жаль, Орешник сдох...
:)))
Восхищенный (2008-05-04 20:37:00) [11]> Evil (04.05.08 20:24) [4]
Про хук - см. SetWindowsHookEx с WH_CALLWNDPROC (RET).
Про потомок панели - это не проблема. Закрываешь проект, пишешь потомка панели, инсталлируешь его в среду, закрываешь все проекты. Потом блокнотом меняешь класс панели в pas и в dfm на свой. Открываешь проект - и вуаля!
Evil (2008-05-04 20:24:00) [12]Про хук по подробней(желательно маленький прымер) ...
О потомке панели уже подумовал но много кода уже написано... да и компоненты полдня на панели розполагал чтоб выглядело сносно... :)
Восхищенный (2008-05-04 20:18:00) [13]Или написать потомок панели, или поставить хук.
Evil (2008-05-04 19:44:00) [14]панель это TPanel :-)
процедуру для перехвата опредилыв
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
но вопрос остается в силе как опредилыть что сообщенния адресуется моему контролу?
Johnmen (2008-05-04 19:25:00) [15]Что такое "панель"?