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

Jenter Алекс

Шрифт:

switch (nVersion) {

case -1:

// -1 показывает, что структура была создана с DYNCREATE,

// а не с SERIAL. Появление этого значения говорит об ошибке.

break;

case 1: // Эта версия использовала unsigned short

unsigned short oldval;

ar >> oldval;

m_value = oldval;

break;

case 2:

// Текущая версия использует DWORD

ar >> m_value;

break;

default:

// несуществующее значение – скорее всего, данные испорчены.

break;

}

 }

}

Заключение

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

ВОПРОС-ОТВЕТ 

Как добавить всплывающие подсказки для элементов управления диалога?

Авторы: Игорь Вартанов, Александр Шаргин

Версия текста: 1.1

Демонстрационный проект ToolTip

Демонстрационный проект MFCTips

Win32 API

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

Нам понадобится следующий набор функций:

HWND APIENTRY CreateToolTip(HWND hWndParent);

void APIENTRY FillInToolInfo(TOOLINFO* ti, HWND hWnd, UINT nIDTool = 0);

BOOL APIENTRY AddTool(HWND hTip, HWND hWnd, RECT* pr = NULL, UINT nIDTool = 0, LPCTSTR szText = NULL);

void APIENTRY UpdateTipText(HWND hTip, HWND hWnd, UINT nIDTool = 0, LPCTSTR lpszText = NULL);

void APIENTRY GetTipText(HWND hTip, HWND hWnd, UINT nIDTool, LPSTR szText);

void APIENTRY EnableToolTip(HWND hTip, BOOL activate);

Вот пример их реализации (демонстрация применения в тестовом проекте Tooltip).

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

//-------------------------------------------------------------

WND APIENTRY CreateToolTip(HWND hWndParent) {

 InitCommonControls;

 HWND hTip = CreateWindowEx(0, TOOLTIPS_CLASS, 0, 0, 0, 0, 0, 0, hWndParent, 0, 0, 0);

 return hTip;

}

Функция FillInToolInfo играет вспомогательную роль для выполнения рутинных операций со структурой TOOLINFO. Логика поведения функции предусматривает использование в качестве уникального идентификатора области вывода подсказки (которая в MSDN носит название tool) хэндла окна – носителя подсказки в случае, если в нее передан нулевой идентификатор nIDTool. В случае ненулевого значения nIDTool программист сам должен обеспечить уникальность передаваемых значений.

//-------------------------------------------------------------

void APIENTRY FillInToolInfo(TOOLINFO* ti, HWND hWnd, UINT nIDTool) {

 ZeroMemory(ti,sizeof(TOOLINFO));

 ti->cbSize = sizeof(TOOLINFO);

 if (!nIDTool) {

ti->hwnd = GetParent(hWnd);

ti->uFlags = TTF_IDISHWND;

ti->uId = (UINT)hWnd;

 } else {

ti->hwnd = hWnd;

ti->uFlags = 0;

ti->uId = nIDTool;

 }

}

Добавить новую область подсказки можно функцией AddTool. Данная реализация AddTool предусматривает, что контрол hTip сам обеспечит себе получение системных сообщений о передвижении мыши от окон – носителей подсказки. Для этого при создании области выставляется флаг TTF_SUBCLASS. В этом случае совершенно отпадает необходимость в использованиии механизма TTM_RELAYEVENT. Флаг TTF_TRANSPARENT, что выводимые окна подсказки будут прозрачны для мышиных сообщений.

  • Читать дальше
  • 1
  • ...
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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