Вход/Регистрация
Программирование на Visual C++. Архив рассылки
вернуться

Jenter Алекс

Шрифт:

 return 0;

}

Обратите внимание на то, что обработчики сообщений при обнаружении нажатия Enter возвращают из оконной процедуры нуль. Это делается для того, чтобы сообщения не передавались обработчику по-умолчанию (и, следовательно, не выполнялось нажатие кнопки по-умолчанию).

MFC

ПРИМЕЧАНИЕ

Обратите внимание, окно редактирования должно иметь стиль ES_MULTILINE.

Для реализации поведения приложения, аналогичного только что описанному, необходимо создать класс, производный от CEdit, имеющий собственные обработчики сообщений WM_KEYDOWN и WM_CHAR (при создании класса и добавлении обработчиков используйте ClassWizard).

// .h-файл класса ////////////////////////////////////////////////

...

class CEnterEdit : public CEdit {

public:

 CEnterEdit;

public:

 virtual ~CEnterEdit;

protected:

 //{{AFX_MSG(CEnterEdit)

 afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

 afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);

 //}}AFX_MSG

 DECLARE_MESSAGE_MAP

};

// .cpp-файл класса //////////////////////////////////////////////

...

BEGIN_MESSAGE_MAP(CEnterEdit, CEdit)

 //{{AFX_MSG_MAP(CEnterEdit)

 ON_WM_KEYDOWN

 ON_WM_CHAR

 //}}AFX_MSG_MAP

END_MESSAGE_MAP

void CEnterEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {

 if (nChar == VK_RETURN) {

// Предполагаем, что родительское окно эдит-бокса -

// диалог класса CEditDlgDlg, который имеет буфер хранения

// введенного текста m_edText типа CString.

CEditDlgDlg* pDlg = (CEditDlgDlg*) GetParent;

GetWindowText(pDlg->m_edText);

pDlg->GetNextDlgTabItem(this)->SetFocus;

return; // запрет обработки по-умолчанию

 }

 CEdit::OnKeyDown(nChar, nRepCnt, nFlags);

}

void CEnterEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {

 if (nChar == VK_RETURN) return; // запрет обработки по-умолчанию

 CEdit::OnChar(nChar, nRepCnt, nFlags);

}

ПРИМЕЧАНИЕ

Подмена оконной процедуры – универсальный метод для получения необходимой функциональности. Если же есть возможность получить доступ к циклу сообщений, то можно воспользоваться альтернативной методикой – обработкой сообщения WM_KEYDOWN в самом цикле (см. далее – Альтернативный вариант).

Пример EditDlg демонстрирует обработку нажатия клавиши Enter. Он содержит два проекта – WinAPI и MFC.

Альтернативный вариант

Не всегда целесообразно обработку нажатия Enter возлагать на окно редактирования. Если в поведение приложения необходимо добавить указанную реакцию, но для самого окна достаточно обычной функциональности (однострочное окно редактирования), можно, не меняя стиля окна редактирования, самостоятельно обрабатывать нажатие Enter, анализируя содержимое сообщений в цикле обработки сообщений.

Необходимо помнить, что цикл обработки сообщений модального диалога реализуется самой системой и недоступен для программиста. В этом случае остается единственное средство – подмена оконной процедуры окна редактирования, описанная выше (см. Основной вариант).

Детали реализации этого метода очень сильно зависят от постановки задачи, среды разработки и организации цикла обработки сообщений. Общая схема такова:

1. До выполнения DispacthMessage(&msg) необходимо проанализировать поле msg.message на приход сообщения WM_KEYDOWN.

  • Читать дальше
  • 1
  • ...
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: