Как отловить передвижение мыши над Static Text в ATL Dialog
От:
Аноним
Дата:
16.12.03 16:26
Оценка:
Люди, помогите пожалуйста. Эта ATL меня скоро доканает.
У меня ATL Dialog. На нем Static Text. Хочу сделать, чтобы когда курсор мыши проходит над Stztic Text он (курсор мыши) изменял свой вид. Никак не могу понять. У диалога есть обработчик сообщения OnMouseMove, но, когда мышь проходит над Static Text, этот обработчик не получает сообщений. Как быть?
Александр
Re: Как отловить передвижение мыши над Static Text в ATL Dia
Здравствуйте, Аноним, Вы писали:
А>Люди, помогите пожалуйста. Эта 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 валвется, хотя написал-то всего:
Здравствуйте, Аноним, Вы писали:
А>Люди, помогите пожалуйста. Эта 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 Goncharov, Вы писали:
[...]
А>Я попробовал CHyperLink заюзать, в рантайме ошибку выдает при закрытии диалога, на котором этот Static Text валвется, хотя написал-то всего:
А>... А>private: А> CHyperLinkA m_hlWriteUserDescrLnk;
А>...
А>m_hlWriteUserDescrLnk.Attach(GetDlgItem(IDC_STATIC_WRITEERRDESCR));
А>Причем, это только в Debug-версии проявляется, в Release все нормально. А>В чем причина?
В том, что необходимо вызывать m_hlWriteUserDescrLnk.Detach при закрытии окна диалога.