Форум: "Основная";
Текущий архив: 2002.10.21;
Скачать: [xml.tar.bz2];
ВнизОбработка сообщений Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c