Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-68676
Pavel_s
2002-10-01 07:02
2002.10.21
Прошу помощи


1-68769
Петя
2002-10-11 16:47
2002.10.21
exit Code


1-68852
xGrey
2002-10-10 14:19
2002.10.21
Работа с ключами (параметрами) запуска приложения


1-68683
AOKotlyarov
2002-10-09 14:13
2002.10.21
Как в StringGrid обработать сообщение на перемещение ScrollBox a


3-68627
Александр1
2002-09-28 10:45
2002.10.21
Удаление с помощью триггера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский