Московский инженерно-физический институт
Вид материала | Практикум |
СодержаниеВсплывающие подсказки LRESULT OnNotify (HWND hwnd, int wParam, LPNMHDR lParam) Таблицы строк и локализация программных продуктов |
- Ю. С. Барсуков 1, А. Ю. Окунев 2 1 Московский инженерно-физический институт (государственный, 29.25kb.
- В. А. Курнаев Московский инженерно-физический институт (государственный университет),, 27.18kb.
- «Вегето-сосудистая дистония», 192.12kb.
- Перечен ь научных разделов и базовых вузов по научным разделам открытого конкурса, 247.02kb.
- Д. В. Гуцко Московский инженерно-физический институт (государственный университет), 34.47kb.
- В. А. Тумольский московский инженерно-физический институт (государственный университет), 27.44kb.
- К. С. Чистов Московский инженерно-физический институт (государственный университет), 24.11kb.
- Вдокладе рассматривается задача оценки рисков инвестиционных проектов электростанций, 29.4kb.
- Резюме Луценко Владимир Юрьевич, 22.32kb.
- Л. Ю. Грецкая московский инженерно-физический институт (государственный университет), 26.28kb.
Всплывающие подсказки
В современных программах, управляемых с помощью меню и инструментальных панелей, принято включать в состав меню всплывающие подсказки – небольшие окошки, открываемые автоматически, когда курсор мыши помещается на соответствующую кнопку инструментальной панели (рис. 3.8).

Рис. 3.8. Всплывающая подсказка в редакторе Microsoft Word
Для организации всплывающих подсказок следует прежде всего создать инструментальную панель, как это было описано в предыдущем подразделе, дополнив ее стиль, указываемый в качестве второго параметра функции CreateToolbarEx(), константой TBSTYLETOOLTIPS. Отслеживание положения курсора мыши и вывод на экран требуемых подсказок осуществляется в ответ на сообщение Windows WMNOTIFY, для обработки которого оконную функцию следует дополнить соответствующим макросом HANDLEMSG. Функция OnNotify(), вызываемая в случае прихода в приложение сообщения WMNOTIFY, имеет следующий прототип:
LRESULT OnNotify (HWND hwnd, int wParam, LPNMHDR lParam);
Последний параметр этой функции lParam имеет тип указателя на структуру NMHDR. Фактически, однако, этот параметр указывает на бóльшую по объему структуру типа TOOLTIPTEXT, в которую структура NMHDR входит в качестве первого элемента (рис. 3.9).
Таким образом, если использовать параметр lParam непосредственно, он будет служить указателем на структуру NMHDR, и с его помощью можно обращаться к элементам этой структуры, однако остальные элементы структуры TOOLTIPTEXT будут недоступны. Если же преобразовать параметр lParam в тип LPTOOLTIPTEXT, то он будет указывать на всю структуру TOOLTIPTEXT, и через него можно получить доступ ко всем элементам этой структуры; через имя вложенной структуры hdr в этом случае можно получить доступ и к элементам структуры NMHDR.

Рис. 3.9. Взаимоотношение структур TOOLTIPTEXT и NMHDR
Таким образом, допустимы, в частности, следующие обращения:
- lParam->code (lParam – указатель на структуру NMHDR, а code – элемент этой структуры);
- lParam->idFrom (та же ситуация);
- ((LPTOOLTIPTEXT) lParam)->szText (выражение (LPTOOLTIPTEXT) lParam является указателем на структуру TOOLTIPTEXT, а szText – элемент этой структуры);
- ((LPTOOLTIPTEXT) lParam)->hdr.idFrom (обращение к элементам вложенной структуры посредством указателя на внешнюю).
Функция OnNotify() будет вызываться в ответ на все сообщения WMNOTIFY, однако нас будут интересовать лишь те сообщения, для которых код code, входящий в структуру NMHDR, равен TTNNEEDTEXT. Эти сообщения посылаются в приложение, когда курсор мыши устанавливается над какой-либо кнопкой инструментальной панели, и, соответственно, панель нуждается в получении текста подсказки. Поэтому в функции OnNotify() следует прежде всего отобрать (с помощью оператора if) эти сообщения. Вывод подсказок осуществляется путем копирования текста подсказки в элемент szText структуры TOOLTIPTEXT. Поскольку для разных кнопок подсказки разные, предложения копирования (посредством функции С++ strcpy()) удобно включить в конструкцию switch-case; оператор switch в этом случае должен анализировать значение элемента idFrom структуры NMHDR, в который поступает идентификатор кнопки, находящейся под курсором мыши.
Таблицы строк и локализация
программных продуктов
Выше уже отмечалось, что в качестве ресурсов могут фигурировать самые разные объекты Windows: описания меню и диалогов, растровые изображения, пиктограммы и курсоры и пр. В частности, в виде ресурсов могут быть описаны текстовые строки. Размещение таблиц строк в файле ресурсов позволяет выполнять их редактирование непосредственно в загрузочном файле. Это дает возможность локализовать программные продукты, т. е. переводить используемые в них поясняющие надписи на национальный язык при отсутствии исходного текста программы.
Ресурс - таблица строк описывается следующим образом:
STRINGTABLE {
0,"первая строка"
1,"вторая строка"
2,"третья строка"
... // и т. д.
}
Для использования строк таблицы в программе каждую строку следует сначала загрузить с помощью функции LoadString(), первым параметром которой служит дескриптор приложения, вторым – номер, которым помечена строка в файле ресурсов, третьим – адрес символьного массива, в который эта строка будет скопирована, а четвертым – размер этого массива. Отсюда, между прочим, следует, что при наличии в файле ресурсов нескольких таблиц строк (это вполне возможно), строки во всех таблицах должны иметь различающиеся номера, при этом порядок номеров не имеет значения. После загрузки строки ее копия в символьном массиве – приемнике может использоваться во всех местах, где допустимы символьные строки: при выводе текстов в окна приложения, в качестве заголовков окон или пунктов меню и т. д.