Московский инженерно-физический институт

Вид материалаПрактикум

Содержание


Всплывающие подсказки
LRESULT OnNotify (HWND hwnd, int wParam, LPNMHDR lParam)
Таблицы строк и локализация программных продуктов
Подобный материал:
1   ...   9   10   11   12   13   14   15   16   ...   24

Всплывающие подсказки


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



Рис. 3.8. Всплывающая подсказка в редакторе Microsoft Word

Для организации всплывающих подсказок следует прежде всего создать инструментальную панель, как это было описано в предыдущем подразделе, дополнив ее стиль, указываемый в качестве второго параметра функции CreateToolbarEx(), константой TBSTYLETOOLTIPS. Отслеживание положения курсора мыши и вывод на экран требуемых подсказок осуществляется в ответ на сообщение Windows WMNOTIFY, для обработки которого оконную функцию следует дополнить соответствующим макросом HANDLEMSG. Функция OnNotify(), вызываемая в случае прихода в приложение сообщения WMNOTIFY, имеет следующий прототип:

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() будет вызываться в ответ на все сообщения WMNOTIFY, однако нас будут интересовать лишь те сообщения, для которых код code, входящий в структуру NMHDR, равен TTNNEEDTEXT. Эти сообщения посылаются в приложение, когда курсор мыши устанавливается над какой-либо кнопкой инструментальной панели, и, соответственно, панель нуждается в получении текста подсказки. Поэтому в функции OnNotify() следует прежде всего отобрать (с помощью оператора if) эти сообщения. Вывод подсказок осуществляется путем копирования текста подсказки в элемент szText структуры TOOLTIPTEXT. Поскольку для разных кнопок подсказки разные, предложения копирования (посредством функции С++ strcpy()) удобно включить в конструкцию switch-case; оператор switch в этом случае должен анализировать значение элемента idFrom структуры NMHDR, в который поступает идентификатор кнопки, находящейся под курсором мыши.

Таблицы строк и локализация
программных продуктов


Выше уже отмечалось, что в качестве ресурсов могут фигурировать самые разные объекты Windows: описания меню и диалогов, растровые изображения, пиктограммы и курсоры и пр. В частности, в виде ресурсов могут быть описаны текстовые строки. Размещение таблиц строк в файле ресурсов позволяет выполнять их редактирование непосредственно в загрузочном файле. Это дает возможность локализовать программные продукты, т. е. переводить используемые в них поясняющие надписи на национальный язык при отсутствии исходного текста программы.

Ресурс - таблица строк описывается следующим образом:

STRINGTABLE {

0,"первая строка"

1,"вторая строка"

2,"третья строка"

... // и т. д.

}

Для использования строк таблицы в программе каждую строку следует сначала загрузить с помощью функции LoadString(), первым параметром которой служит дескриптор приложения, вторым – номер, которым помечена строка в файле ресурсов, третьим – адрес символьного массива, в который эта строка будет скопирована, а четвертым – размер этого массива. Отсюда, между прочим, следует, что при наличии в файле ресурсов нескольких таблиц строк (это вполне возможно), строки во всех таблицах должны иметь различающиеся номера, при этом порядок номеров не имеет значения. После загрузки строки ее копия в символьном массиве – приемнике может использоваться во всех местах, где допустимы символьные строки: при выводе текстов в окна приложения, в качестве заголовков окон или пунктов меню и т. д.