Вопрос по сообщениям окна!

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

akahan
Сообщения: 10
Зарегистрирован: 11 фев 2007, 20:00

Привет всем!
Такой вопрос:
Я суперклассирую EDIT. Мне нужно из WndProc моего контрола отследить когда длина текста в MYEDITе равна 0.
Допустим, я могу это отследить из родительского окна с помощью EN_UPDATE или EN_CHANGE, но как мне это сделать из WndProc моего контрола?
Я думаю можно отслеживать с помощью отлова WM_KEYDOWN, но, ведь, текст можно вставить из clipboard, тогда еще нужно отслеживать WM_PASTE и тд. Должно же быть более оригинальное решение!
С помощью каких сообщений окна это можно отследить?
Посоветуйте, ГУРУ!!! :)
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

В суперклассе в MSG_MAP добавляем:

Код: Выделить всё

REFLECTED_NOTIFY_CODE_HANDLER(EN_CHANGE, OnChange)
В диалоги, на котором лежит суперклассированный edit в MSG_MAP в конце добавляем

Код: Выделить всё

REFLECT_NOTIFICATIONS()
Всё написанное справедливо для связки ATL + WTL.

Если пишешь на MFC, то там тоже поддерживается механизм reflections, но я не помню детали.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
akahan
Сообщения: 10
Зарегистрирован: 11 фев 2007, 20:00

Romeo писал(а):В суперклассе в MSG_MAP добавляем:

Код: Выделить всё

REFLECTED_NOTIFY_CODE_HANDLER(EN_CHANGE, OnChange)
В диалоги, на котором лежит суперклассированный edit в MSG_MAP в конце добавляем

Код: Выделить всё

REFLECT_NOTIFICATIONS()
Всё написанное справедливо для связки ATL + WTL.

Если пишешь на MFC, то там тоже поддерживается механизм reflections, но я не помню детали.
Спасибо, мен, но я на чистом WINAPI пишу. попробую разобраться поишу определения этих макросов!
А смысл вообще можешь пояснить етого? %)
akahan
Сообщения: 10
Зарегистрирован: 11 фев 2007, 20:00

А вообще мне нужно, чтобы вообще ничего в диалог не добавлялось, что бы было прозрачно все!
у меня фишка такая:
У меня есть класс с++ MyEditWrapper. Он, как бы зеркало моего контрола. Там статическая функция MyEditWndProc, на которую я заменяю WndProc в стандартном EDIT. Также есть статическая карта pair<котрол,экземпляр_класса> в которой я по HWND окна ищу необходимый экземпляр класса MyEditWrapper.
Я создаю Custom Control с именем класса MyEdit в диалоге. Перед началом работы диалога создаю класс MyEdit и регистрирую его. При первом входе в MyEditWndProc инициализируется или находится MyEditWrapper.
Это я все для того, чтобы понятно было то, что я делаю!
Так вот в диалоге я просто создаю Custom Control класса MyEdit и не парюсь.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Еще вот есть такое сообщение:
EN_CHANGE
Но ото тоже приходит в родительское (диалоговое) окно.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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, то придётся это всё делать самому.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
akahan
Сообщения: 10
Зарегистрирован: 11 фев 2007, 20:00

Спасибо!
Идея ясна. И вполне оригинально! Че это я не додумался сам до этого!
Думаю тема закрыта! Как все сделаю отпишу о полученном результате!
akahan
Сообщения: 10
Зарегистрирован: 11 фев 2007, 20:00

Привет всем еще раз!
Попробывал я этото способ, но что-то опять ничего не выходит! Не хочет родительское окно (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 тоже становится невидимым, а мен этого не надо!
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Если используешь C++ под Dos, то нужно использовать iostream.h, а в коде убрать все std::.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
akahan
Сообщения: 10
Зарегистрирован: 11 фев 2007, 20:00

Все, решил только что эту проблему через WindowsHooks. Если интересно, спрашивайте!
Ответить