Страница 1 из 2
Вопрос по сообщениям окна!
Добавлено: 11 фев 2007, 20:09
akahan
Привет всем!
Такой вопрос:
Я суперклассирую EDIT. Мне нужно из WndProc моего контрола отследить когда длина текста в MYEDITе равна 0.
Допустим, я могу это отследить из родительского окна с помощью EN_UPDATE или EN_CHANGE, но как мне это сделать из WndProc моего контрола?
Я думаю можно отслеживать с помощью отлова WM_KEYDOWN, но, ведь, текст можно вставить из clipboard, тогда еще нужно отслеживать WM_PASTE и тд. Должно же быть более оригинальное решение!
С помощью каких сообщений окна это можно отследить?
Посоветуйте, ГУРУ!!!

Re: Вопрос по сообщениям окна!
Добавлено: 11 фев 2007, 21:06
Romeo
В суперклассе в MSG_MAP добавляем:
Код: Выделить всё
REFLECTED_NOTIFY_CODE_HANDLER(EN_CHANGE, OnChange)
В диалоги, на котором лежит суперклассированный edit в MSG_MAP в конце добавляем
Всё написанное справедливо для связки ATL + WTL.
Если пишешь на MFC, то там тоже поддерживается механизм reflections, но я не помню детали.
Re: Вопрос по сообщениям окна!
Добавлено: 11 фев 2007, 22:00
akahan
Romeo писал(а):В суперклассе в MSG_MAP добавляем:
Код: Выделить всё
REFLECTED_NOTIFY_CODE_HANDLER(EN_CHANGE, OnChange)
В диалоги, на котором лежит суперклассированный edit в MSG_MAP в конце добавляем
Всё написанное справедливо для связки ATL + WTL.
Если пишешь на MFC, то там тоже поддерживается механизм reflections, но я не помню детали.
Спасибо, мен, но я на чистом WINAPI пишу. попробую разобраться поишу определения этих макросов!
А смысл вообще можешь пояснить етого? %)
Re: Вопрос по сообщениям окна!
Добавлено: 11 фев 2007, 22:29
akahan
А вообще мне нужно, чтобы вообще ничего в диалог не добавлялось, что бы было прозрачно все!
у меня фишка такая:
У меня есть класс с++ MyEditWrapper. Он, как бы зеркало моего контрола. Там статическая функция MyEditWndProc, на которую я заменяю WndProc в стандартном EDIT. Также есть статическая карта pair<котрол,экземпляр_класса> в которой я по HWND окна ищу необходимый экземпляр класса MyEditWrapper.
Я создаю Custom Control с именем класса MyEdit в диалоге. Перед началом работы диалога создаю класс MyEdit и регистрирую его. При первом входе в MyEditWndProc инициализируется или находится MyEditWrapper.
Это я все для того, чтобы понятно было то, что я делаю!
Так вот в диалоге я просто создаю Custom Control класса MyEdit и не парюсь.
Re: Вопрос по сообщениям окна!
Добавлено: 12 фев 2007, 12:05
BBB
Еще вот есть такое сообщение:
EN_CHANGE
Но ото тоже приходит в родительское (диалоговое) окно.
Re: Вопрос по сообщениям окна!
Добавлено: 12 фев 2007, 15:05
Romeo
BBB, это ты о чём? Понятно, что EN_CHANGE приходит к родительскому окну. Мы пытаемся выяснить как его ловить в суперклассином Edit Box'е. Похоже, ты просто не понял о чём идёт речь?
akahan, если ты используешь чистый Win32 API, то я могу посоветовать тебе следующий ход. Не ручаюсь, что он лучший, но работать это будет точно и подход довольно логичный.
В процедуре сеперклассинга выполняешь следующие магические действия:
1. Создаёшь на диалоге невидимый чайлд (можно прямо под Edit Box'ом).
2. Устанавливаешь невидимое окно в качестве парента Edit Box'а.
3. Невидимое окно слушает все нотификации Edit Box'а и пересылает их в два окна. Первое окно - сам диалог (для того, чтобы логика работы диалога с Edit Box'ом не поменялась), второе окно - наш Edit Box.
Такой подход позволит слушать нотификации Edit Box'а в WndProc суперкласса. И к тому же не придётся никак менять код самого диалога.
Механизм Reflections именно так реализован для ActiveX контролов в ATL и MFC. Для этого невидимого окна даже есть термин - host. Исли пишешь на Win32 API, то придётся это всё делать самому.
Re: Вопрос по сообщениям окна!
Добавлено: 13 фев 2007, 16:38
akahan
Спасибо!
Идея ясна. И вполне оригинально! Че это я не додумался сам до этого!
Думаю тема закрыта! Как все сделаю отпишу о полученном результате!
Re: Вопрос по сообщениям окна!
Добавлено: 18 фев 2007, 01:00
akahan
Привет всем еще раз!
Попробывал я этото способ, но что-то опять ничего не выходит! Не хочет родительское окно (host) получать сообщения WM_COMMAND. Они походу выше передаются в самый верх, или в диалог или в главное окно!
Не знаю что за хрень! Может я что не так делаю!
Создаю host таким макаром:
Код: Выделить всё
if(UIEdit::dummy_window = CreateWindow(DUMMY_CLASSNAME,NULL,WS_CHILD | WS_VISIBLE,
lpCreateStruct->x,lpCreateStruct->y,lpCreateStruct->cx,lpCreateStruct->cy,lpCreateStruct->hwndParent,0,lpCreateStruct->hInstance,NULL))
{
SetParent(m_hWnd, UIEdit::dummy_window);
SetWindowPos(m_hWnd,0,0,0,0,0,SWP_NOSIZE);
}
Если я его делаю невидимым, то Edit box тоже становится невидимым, а мен этого не надо!
Re: Вопрос по сообщениям окна!
Добавлено: 19 фев 2007, 13:23
Romeo
Если используешь C++ под Dos, то нужно использовать iostream.h, а в коде убрать все std::.
Re: Вопрос по сообщениям окна!
Добавлено: 21 фев 2007, 19:39
akahan
Все, решил только что эту проблему через WindowsHooks. Если интересно, спрашивайте!