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

Вниз

Обработка сообщений   Найти похожие ветки 

 
arcad ©   (2002-10-11 10:49) [0]

Уважаемые мастера.
Я написал вот такой обработчик сообщения колеса мыши.

procedure WMMouseWheel(var Msg: TMessage);message WM_MOUSEWHEEL;

procedure TForm1.WMMouseWheel(var Msg: TMessage);
begin
if short(Msg.WParamHi)>0 then Label1.Caption:="А все таки оно вертится вверх";
if short(Msg.WParamHi)<0 then Label1.Caption:="А все таки оно вертится вниз";
if Msg.WParamLo=MK_CONTROL then Label2.Caption:="С контролом";
end;

Как мне теперь определить какому контролу это сообщение отправлено. Только с помощью тех же сообщений и Win API.


 
Skier ©   (2002-10-11 11:01) [1]

>arcad
Self ?


 
arcad ©   (2002-10-11 11:05) [2]


>
> Skier © (11.10.02 11:01)
> >arcad
> Self ?

Поясните пожалуйста.


 
arcad ©   (2002-10-11 11:07) [3]

Да кстати, я могу получть хендл с помошью GetFocus, вот только как по нему определить что за компонент, какого типа и какой конкретный эклемпляр?


 
Skier ©   (2002-10-11 11:09) [4]

>arcad
Из твоего кода следует что у тебя WM_MOUSEWHEEL будет
обрабатыватся экземпляром класса TForm1.
А экземпляр класса TForm1 это и есть контрол.
Его можешь взять через неявный параметр Self.
(Если я всё правильно понял...)


 
still ©   (2002-10-11 11:12) [5]


> arcad © (11.10.02 11:07)
> Да кстати, я могу получть хендл с помошью GetFocus, вот
> только как по нему определить что за компонент, какого типа
> и какой конкретный эклемпляр?


как правило, это и не нужно знать. Просто посылаешь по этому хэндлу сообщение, типа WM_VSCROLL . Может у тебя другая задача - тогда поподробнее.


 
han_malign ©   (2002-10-11 11:15) [6]

через API ты не вытащишь над каким контролом в этот момент находится указатель мыши, если не было его захвата (фокуса)(хотя можешь перебором по дочерним окнам смотреть попадает ли курсор в границу и что окно верхнее), а вот в VCL, смутно помнится, я где то ведел уже сделанное(правда где и видел ли - не помню)


 
arcad ©   (2002-10-11 11:15) [7]

Да пожалуй что я не правильно обрабатываю сообщение, мне нужно чтобы сообщение принимали эдиты лежащие на форме. И при повороте колеса инкрементировали/декрементировали значение.


 
Skier ©   (2002-10-11 11:17) [8]

>arcad

> мне нужно чтобы сообщение принимали эдиты лежащие на форме

Может тогда так :

procedure TYourEdit.WMMouseWheel(var Msg: TMessage);
begin
//..............
end;


 
arcad ©   (2002-10-11 11:17) [9]


> han_malign © (11.10.02 11:15)
> через API ты не вытащишь над каким контролом в этот момент
> находится указатель мыши, если не было его захвата (фокуса)(хотя
> можешь перебором по дочерним окнам смотреть попадает ли
> курсор в границу и что окно верхнее), а вот в VCL, смутно
> помнится, я где то ведел уже сделанное(правда где и видел
> ли - не помню)


Тоже способ, но мне кажется слишком громоздкий. А фокус то у меня есть. Я наверное просто неправильно вопрос сформулировал.


 
arcad ©   (2002-10-11 11:22) [10]


> Skier © (11.10.02 11:17)
> >arcad
>
> > мне нужно чтобы сообщение принимали эдиты лежащие на форме
>
> Может тогда так :
>
> procedure TYourEdit.WMMouseWheel(var Msg: TMessage);
> begin
> //..............
> end;
Ругается.



 
arcad ©   (2002-10-11 11:30) [11]

Люди ну пожалуйста ответьте кто нибудь, ну казалось бы все понятно, обработчик сообщения есть, фокус есть, хендл получил, как теперь узнать что этот объект эдит, и который из нескольких?


 
still ©   (2002-10-11 11:35) [12]

ClassName, Name - не подходит?
is оператор?


 
arcad ©   (2002-10-11 11:40) [13]


> still © (11.10.02 11:35)
> ClassName, Name - не подходит?
> is оператор?

Я наверное совсем чего-то непонимаю, ClassName чего?
is чего? В чем и проблема-то, как по хендлу объект определить?


 
han_malign ©   (2002-10-11 11:42) [14]

можно по тупому

if(Edit1.Focused)then ...
.........................
else if(EditN.Focused)then ...
можно по сложному
for i:=0 to ControlsCount-1 do begin
if((Controls[i]is TEdit)and(TEdit(Controls[i]).Focused))
then with Controls[i]as TEdit do ...
.....................
end;

хотя по уму, еще надо в самих Controls[i]если они Controls[i]is TWinControl дочернии Controls-ы пролистать


 
han_malign ©   (2002-10-11 11:44) [15]

Control по Handle-у искать, к сожалению, так же


 
arcad ©   (2002-10-11 12:26) [16]


> han_malign © (11.10.02 11:44)
> Control по Handle-у искать, к сожалению, так же

Спасибо, так работает.
А нет какой нибудь АПИшной функции, че нибудь типа GetObject или это вопрос чисто риторический?


 
Song ©   (2002-10-11 13:12) [17]

FindVCLWindow()
ControlAtPos()


 
REA ©   (2002-10-11 13:16) [18]

FocusedContol надо определить и если он того типа, что имеет возможность вертеть и сам не перехватил сообщение, то вертеть в нем.


 
arcad ©   (2002-10-11 13:56) [19]

Ура! Нашел, FindControl(GetFocus); работает,
а вот инетересно есть ли АПИшный аналог FindControl(), кто знает напишите подалуйста. Плииз.


 
Song ©   (2002-10-11 14:10) [20]

Возьми да посмотри как реализован в Дельфи этот метод.


 
arcad ©   (2002-10-11 14:20) [21]


> Song ©

Уже смотрю. :(
Сильно круто для меня пожалуй. Ладно.
Спасибо всем кто ответил.



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

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

Наверх




Память: 0.51 MB
Время: 0.013 c
1-68831
Лана Розанова
2002-10-10 11:48
2002.10.21
HTML


1-68761
Darlock
2002-10-09 18:10
2002.10.21
Зачем USES разбиты на два блока?


6-68904
vladislav_
2002-08-20 17:10
2002.10.21
Ребята! Может кто подскажет как работать с IPX/SPX ?


1-68754
Николай Быков
2002-10-10 14:59
2002.10.21
TFileStream


4-69083
anatoli
2002-09-09 08:46
2002.10.21
КАК ОБНОВИТЬ???