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

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

Необходимо сделать объект прозрачным для событий. [D7, Win95/98, WinME, NT4, Win2k, WinXP]


Dmitry ©   (2004-06-15 03:31:00) 

Доброго время суток Всем!
Подскажите, пожалуйста, изящный метод решения такой проблемы:

Как можно заставить какой-то объект (скажем Memo) пропускать все адресованные ему события сквозь себя объекту, на котором исходный объект находится. Иными словами объект есть и нормально отображается, но остается прозрачным для событий, скажем, при клике на нем система воспринимает клик, так как будто он был сделан по форме, на котором этот объект находится.

object.enabled:=false; - не подходит, т к. объект начинает по-другому отображаться.


jack128   (2004-06-15 23:08:00) [1]

наверно так лудше будет..

> procedure TForm1.NewWndProc(var Message: TMessage);
> begin
>  if Assigned(FOldWndProc) then
>    FOldWndProc(Message);
>  if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST)
> then
>    Memo1.Parent. WindowProc (Message);
> end;


Lenor   (2004-06-15 22:51:00) [2]

А можна вопросъ?.. Зачем тебе?


Alex44   (2004-06-15 12:02:00) [3]


>  SetWindowLong(Memo1.Handle,GWL_USERDATA,GetWindowLong(Memo1.Handle,GWL_WNDPROC));
>  SetWindowLong(Memo1.Handle,GWL_WNDPROC,integer(@MemoEvent));

Eto pravil'no, no ochen' slozhno. VCL eto uzhe delaet, tak chto mozhno prosto perepisat' WndProc (ili WindowProc, tochno ne pomnyu), gde i fil'trovat' messages.


SSN   (2004-06-15 09:59:00) [4]

Попробуй -> Memo.ControlStyle := Memo.ControlStyle + [csNoStdEvents];


Anatoly Podgoretsky   (2004-06-15 09:25:00) [5]

Memo.Free


NAlexey   (2004-06-15 09:16:00) [6]

Например мышиные события:
 
 TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
   procedure FormClick(Sender: TObject);
 private
   { Private declarations }
 protected
   FOldWndProc: TWndMethod;
   procedure NewWndProc(var Message: TMessage);

 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 FOldWndProc := Memo1.WindowProc;
 Memo1.WindowProc := NewWndProc;
end;

procedure TForm1.NewWndProc(var Message: TMessage);
begin
 if Assigned(FOldWndProc) then
   FOldWndProc(Message);
 if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then
   Memo1.Parent.Dispatch(Message);
end;

procedure TForm1.FormClick(Sender: TObject);
begin
 ShowMessage('Click');
end;


GrayFace   (2004-06-15 08:05:00) [7]

Нууу.. Наверное, лучше не все "события" отдавать форме, а то есть, например, если его слать форме сообщение WM_SIZE, то она всегда будет размером с Memo.
Вот пример, в котором, ажетс, все есть:

 SetWindowLong(Memo1.Handle,GWL_USERDATA,GetWindowLong(Memo1.Handle,GWL_WNDPROC));
 SetWindowLong(Memo1.Handle,GWL_WNDPROC,integer(@MemoEvent));

function MemoEvent(wnd:hwnd; msg:integer; wParam:wParam; lParam:lParam):Lresult; stdcall;
begin
 with form1 do
 begin
   if (msg=WM_LBUTTONDOWN) or (msg=WM_LBUTTONUP) or (msg=WM_LBUTTONDBLCLK) or (msg=WM_RBUTTONDOWN) or (msg=WM_RBUTTONUP) or (msg=WM_RBUTTONDBLCLK) or (msg=WM_RBUTTONDOWN) or (msg=WM_RBUTTONUP) or (msg=WM_RBUTTONDBLCLK) or (msg=WM_MOUSEMOVE) {or (msg=WM_MOUSEWHEEL)} then
   begin
     SendMessage(handle,msg,wParam,(HIWORD(lParam)+Memo1.Top)*$10000+LOWORD(lParam)+Memo1.Left);
   end else
   if (msg=WM_KEYDOWN) or (msg=WM_KEYUP) or (msg=WM_CHAR) or (msg=WM_SYSCHAR) or (msg=WM_SYSDEADCHAR) or (msg=WM_KEYFIRST) or (msg=WM_DEADCHAR) or (msg=WM_SYSKEYDOWN) or (msg=WM_SYSKEYUP) then
   begin
     SendMessage(handle,msg,wParam,lParam);
   end;
   Result:=CallWindowProc(pointer(GetWindowLong(wnd,GWL_USERDATA)),wnd,Msg,WParam,LParam);
 end;
end;

Одно не понятно: слать WM_MOUSEWHEEL или не слать?


piople   (2004-06-15 06:32:00) [8]

В ОnClick поставь обработчик события твоей формы.


Германн   (2004-06-15 03:53:00) [9]

2 Dmitry   (15.06.04 03:31)
Ой, чё-то мне кажется, что не той дорогой идешь ты, товарищ!
Какой смысл в контролле, если он не должен ни на что не реагировать?


KilkennyCat   (2004-06-15 03:37:00) [10]

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
 .....
// ловим кеу для себя
....
  key := #0;
end;


Наверх

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