![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Необходимо сделать объект прозрачным для событий. [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;