Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Перехват вырезания текста


Автор: Cheloveck 6.4.2009, 14:34
Нужно перед тем как текст будет вырезан из edit, просканировать его на наличее определённых символов.

Код

BOOL SomeEdit::PreTranslateMessage(LPMSG lpMsg)
{
    switch(lpMsg->message)
    {
    case WM_CUT:
        // обработка.
    }
}

не получается. Сообщение даже не ловится.

Автор: Andrey44 7.4.2009, 07:25
Код

BOOL SomeEdit::PreTranslateMessage(LPMSG lpMsg)
{
    switch(lpMsg->message)
    {
    case WM_CUT:
        // обработка.
    }

    if(lpMsg->hwnd==m_edit.GetSafeHwnd() && lpMsg->message==WM_CUT)
    {
        // your code
     }
}

Автор: Earnest 7.4.2009, 08:01
Надо полагать, это сообщение не проходит через очередь, а посылается синхронно (а PreTranslate фильтрует только пост-сообщения). Нужно написать свой обработчик WM_CUT на эдите.

Автор: Cheloveck 7.4.2009, 08:43
Andrey44, твоё дополнение не будет работать, потому что только фильтрует то, что и так не работало =)
Цитата

Надо полагать, это сообщение не проходит через очередь, а посылается синхронно (а PreTranslate фильтрует только пост-сообщения). Нужно написать свой обработчик WM_CUT на эдите.

Я так и предполагал. Но очень надеялся на то, что в MFC есть красивое решение этой задачи. Ну раз уж так, будим переопределять оконную процедуру.

Автор: Earnest 8.4.2009, 07:54
Не оконную процедуру. А просто один из обработчиков класса. Оконная процедура в MFC общая на всех, не вздумай ее переопределять - все развалится. И чем это не красивое решение?

Автор: Cheloveck 8.4.2009, 08:00
Да что-то я не нашёл никакого подходящего обработчика. А с процедурой ничего и не получилось))

Автор: Earnest 8.4.2009, 08:10
Блин! Что значит, не нашел? В Визарде, что ли, не нашел?  
Тебе чего нужно перехватать WM_CUT? Вот для него и пиши обработчик. 
МОЖНО ЗАМЕНИТЬ ОБРАБОТЧИК ЛЮБОГО СООБЩЕНИЯ, КОТОРОЕ ПРИХОДИТ КОНТРОЛУ.
А не только тех, что микросовтовские разработчики изволили перечислить в визарде.

... программисты .... 

Автор: Cheloveck 8.4.2009, 08:56
Я визартом не пользуюсь. Не нашёл я просто метод, похожий на OnCut etc.

P.S. ладно, сам разберусь. Всем спасибо!

Автор: Earnest 8.4.2009, 11:20
Цитата(Cheloveck @  8.4.2009,  09:56 Найти цитируемый пост)
Я визартом не пользуюсь. Не нашёл я просто метод, похожий на OnCut etc.

В ВинАПИ примерно 2000 различных сообщений. Неужели они все должны быть реализованы в виде методов CWnd? Обработчик любого сообщения можно написать с интерфесом LRESULT (WPARAM, LPARAM) и вставить в карту макросом ON_MESSAGE. Если нужно вызвать стандартную обработку - просто поставь в конце своего обработчика вызов Default().

Автор: Cheloveck 8.4.2009, 12:47
Цитата

бработчик любого сообщения можно написать с интерфесом LRESULT (WPARAM, LPARAM) и вставить в карту макросом ON_MESSAGE. Если нужно вызвать стандартную обработку - просто поставь в конце своего обработчика вызов Default().

Вот спасибо, не знал...  Я на MFC месяца 2 всего пишу, до этого только API.

Автор: Earnest 8.4.2009, 18:56
Если хорошо знаешь АПИ, с МФС проблем быть не должно: это весьма тонкая обертка, сквозь которую АПИ просто-таки выпирает. Почитай внимательно в MSDN tecnical articles про обработчики сообщений (проще найти статью, набрав что-то вроде ON_MESSAGE). Еще есть статьи про диспетчеризацию команд во фрейм-ворке. Это, пожалуй, все, что привносит MFC, остальное ерунда.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)