Как отловить передвижение мыши над Static Text в ATL Dialog
От: Аноним  
Дата: 16.12.03 16:26
Оценка:
Люди, помогите пожалуйста. Эта ATL меня скоро доканает.
У меня ATL Dialog. На нем Static Text. Хочу сделать, чтобы когда курсор мыши проходит над Stztic Text он (курсор мыши) изменял свой вид. Никак не могу понять. У диалога есть обработчик сообщения OnMouseMove, но, когда мышь проходит над Static Text, этот обработчик не получает сообщений. Как быть?

Александр
Re: Как отловить передвижение мыши над Static Text в ATL Dia
От: Alexey Goncharov Россия  
Дата: 16.12.03 18:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Люди, помогите пожалуйста. Эта ATL меня скоро доканает.

А>У меня ATL Dialog. На нем Static Text. Хочу сделать, чтобы когда курсор мыши проходит над Stztic Text он (курсор мыши) изменял свой вид. Никак не могу понять. У диалога есть обработчик сообщения OnMouseMove, но, когда мышь проходит над Static Text, этот обработчик не получает сообщений. Как быть?

Напишите обработку WM_SETCURSOR в Вашем собственном Static-контроле

Пример того, как это сделать — см. CHyperLink из WTL
Re[2]: Как отловить передвижение мыши над Static Text в ATL
От: Аноним  
Дата: 17.12.03 08:30
Оценка:
Здравствуйте, Alexey Goncharov, Вы писали:

AG>Здравствуйте, Аноним, Вы писали:


А>>Люди, помогите пожалуйста. Эта ATL меня скоро доканает.

А>>У меня ATL Dialog. На нем Static Text. Хочу сделать, чтобы когда курсор мыши проходит над Stztic Text он (курсор мыши) изменял свой вид. Никак не могу понять. У диалога есть обработчик сообщения OnMouseMove, но, когда мышь проходит над Static Text, этот обработчик не получает сообщений. Как быть?

AG>Напишите обработку WM_SETCURSOR в Вашем собственном Static-контроле


AG>Пример того, как это сделать — см. CHyperLink из WTL


Я попробовал CHyperLink заюзать, в рантайме ошибку выдает при закрытии диалога, на котором этот Static Text валвется, хотя написал-то всего:

...
private:
CHyperLinkA m_hlWriteUserDescrLnk;

...

m_hlWriteUserDescrLnk.Attach(GetDlgItem(IDC_STATIC_WRITEERRDESCR));

Причем, это только в Debug-версии проявляется, в Release все нормально.
В чем причина?
Re: Как отловить передвижение мыши над Static Text в ATL Dia
От: RomeoMontekky  
Дата: 17.12.03 09:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Люди, помогите пожалуйста. Эта ATL меня скоро доканает.

А>У меня ATL Dialog. На нем Static Text. Хочу сделать, чтобы когда курсор мыши проходит над Stztic Text он (курсор мыши) изменял свой вид. Никак не могу понять. У диалога есть обработчик сообщения OnMouseMove, но, когда мышь проходит над Static Text, этот обработчик не получает сообщений. Как быть?

А>Александр


Ловить WM_MOUSEMOVE нужно не в паренте. Нужно создать свой класс, например так:

class CMyStaticClass : public CWindowImpl<CMyStaticClass>
{
...
};

В класс нужно добавить message handler WM_MOUSEMOVE, в котором и написать весь необходимый код, или переслать сообщение парену, если уж очень хочется, чтобы обработка происходила в нём.
Затем обрабатываем сообщения WM_INITDIALOG нашего парент-диалога. В нём используем сабклассинг.

CMyStaticClass * myStatic = new CMyStaticClass(this);
myStatic->SubclassWindow(GetDlgItem(IDC_MY_STATIC));
myStaic->ShowWindow(SW_SHOW);

Теперь ты можешь обращаться к myStatic, как к обычному окну, к тому же при наведении на него мышки он будет реагировать вполне адекватно. Ну и не стоит забывать, что IDC_STATIC нужно с самого начало переименовать в IDC_MY_STATIC, иначе компилятор ресурсов не сможет отличить его от "системного" статика, к которому обращаться нельзя в силу Windows-идеологии...

Удачи!
Re[2]: Как отловить передвижение мыши над Static Text в ATL
От: Аноним  
Дата: 17.12.03 09:46
Оценка:
Здравствуйте, RomeoMontekky, Вы писали:

RM>Здравствуйте, Аноним, Вы писали:


А>>Люди, помогите пожалуйста. Эта ATL меня скоро доканает.

А>>У меня ATL Dialog. На нем Static Text. Хочу сделать, чтобы когда курсор мыши проходит над Stztic Text он (курсор мыши) изменял свой вид. Никак не могу понять. У диалога есть обработчик сообщения OnMouseMove, но, когда мышь проходит над Static Text, этот обработчик не получает сообщений. Как быть?

А>>Александр


RM>Ловить WM_MOUSEMOVE нужно не в паренте. Нужно создать свой класс, например так:


RM>class CMyStaticClass : public CWindowImpl<CMyStaticClass>

RM>{
RM> ...
RM>};

RM>В класс нужно добавить message handler WM_MOUSEMOVE, в котором и написать весь необходимый код, или переслать сообщение парену, если уж очень хочется, чтобы обработка происходила в нём.

RM>Затем обрабатываем сообщения WM_INITDIALOG нашего парент-диалога. В нём используем сабклассинг.

RM>CMyStaticClass * myStatic = new CMyStaticClass(this);

RM>myStatic->SubclassWindow(GetDlgItem(IDC_MY_STATIC));
RM>myStaic->ShowWindow(SW_SHOW);

RM>Теперь ты можешь обращаться к myStatic, как к обычному окну, к тому же при наведении на него мышки он будет реагировать вполне адекватно. Ну и не стоит забывать, что IDC_STATIC нужно с самого начало переименовать в IDC_MY_STATIC, иначе компилятор ресурсов не сможет отличить его от "системного" статика, к которому обращаться нельзя в силу Windows-идеологии...


RM>Удачи!


Большое СПАСИБО, работает! Ларчик-то, оказывается, просто открывался.

Александр
Re[2]: Как отловить передвижение мыши над Static Text в ATL
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 17.12.03 14:04
Оценка:
Здравствуйте, RomeoMontekky, Вы писали:

хъ

RM>Ловить WM_MOUSEMOVE нужно не в паренте. Нужно создать свой класс, например так:


Это вовсе не обязательно. Более того, в данном случае даже лишне. См. CContainedWindowT.

[]
... << RSDN@Home 1.1.0 stable >>
Re[3]: Как отловить передвижение мыши над Static Text в ATL
От: Alexey Goncharov Россия  
Дата: 17.12.03 17:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Alexey Goncharov, Вы писали:


[...]

А>Я попробовал CHyperLink заюзать, в рантайме ошибку выдает при закрытии диалога, на котором этот Static Text валвется, хотя написал-то всего:


А>...

А>private:
А> CHyperLinkA m_hlWriteUserDescrLnk;

А>...


А>m_hlWriteUserDescrLnk.Attach(GetDlgItem(IDC_STATIC_WRITEERRDESCR));


А>Причем, это только в Debug-версии проявляется, в Release все нормально.

А>В чем причина?

В том, что необходимо вызывать m_hlWriteUserDescrLnk.Detach при закрытии окна диалога.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.