Программирование на Visual C++. Архив рассылки
Шрифт:
Клиент же, в свою очередь, просто определяет, какой из содержащихся в нём компонентов соответствует переданному идентификатору и вызывает его QueryInterface.
Возвращаясь к нашей задаче, легко заметить, что здесь аналогичная ситуация. Internet Explorer представляет собой зоопарк компонентов, где наш COM-сервер (т.е. плагин) – один из питомцев. Поэтому нам и приходится использовать вышеописанную технику для получения доступа к интерфейсам другого компонента (которым, в нашем примере, является WebBrowser Control).
Следующим в очереди на реализацию у нас стоит метод QueryStatus интерфейса IOleCommandTarget. Его текст выглядит следующим образом:
В
Теперь мы вплотную подошли к реализации основной функции нашего плагина. В ней мы будем искать содержащиеся на странице ссылки и сохранять их в файл. Код этой функции я не буду приводить здесь, т.к. он прост и не имеет прямого отношения к написанию плагинов. С ним Вы можете ознакомиться в исходном тексте демонстрационного приложения.
Теперь остался последний штрих – регистрация нашего компонента в реестре. В первую очередь, необходимо корректно зарегистрировать наш плагин как COM-сервер. Я не буду описывать эту процедуру здесь, поскольку это лежит за рамками моей статьи, да и информации на эту тему немало. Остановимся подробнее на регистрации нашей DLL в качестве плагина для Internet Explorer.
Для этого необходимо создать следующий ключ в реестре:
В качестве <key root> может выступать либо HKEY_CURRENT_USER (в этом случае плагин будет доступен только текущему пользователю), либо HKEY_LOCAL_MACHINE (плагин будет доступен всем пользователям).
Теперь в нём необходимо создать следующие параметры:
ButtonText | Текст всплывающей подсказки для кнопки. Значение может быть как текстом, так и строкой следующего формата @dll_path,-ID, где dll_path путь к DLL плагина, ID – идентификатор строки в string table. |
CLSID | Всегда {1FBA04EE-3024-11d2-8F1F-0000F87ABD16} |
Default Visible | Будет ли кнопка, сразу после регистрации плагина, находиться на панели ('yes') или пользователь должен будет добавить её на панель самостоятельно ('no' или если параметр отсутствует). |
ClsidExtension | GUID плагина, как COM-сервера (из раздела HKCR\CLSID). |
HotIcon | Путь к иконке, соответствующей активному состоянию кнопки (когда на неё наведена мышь). Если путь указывает на .dll или .exe файл, то после него, через запятую, указывается идентификатор ресурса. |
Icon | Путь к иконке, соответствующей обычному состоянию кнопки. |
MenuText | Текст пункта в меню сервис. |
MenuStatusBar | Текст подсказки, появляющейся в строке состояния, когда пункт меню активен (формат аналогичен параметру ButtonText). |
Файл, на который указывает параметр HotIcon, должен содержать следующие
цветные значки:• 16×16 16 цветов
• 20×20 16 цветов (не обязательно)
• 20×20 256 цветов
Второй файл (соответствующий параметру Icon) должен содержать значки в оттенках серого. Параметры этих значков следующие:
• 16×16 16 оттенков серого
• 20×20 16 оттенков серого (не обязательно)
• 20×20 256 оттенков серого
Вообще-то и эти значки могут быть цветными, но в таком случае они не будут соответствовать общему стилю оформления панелей инструментов Internet Explorer. Подробнее о стиле, в котором должны быть решены эти кнопки можно прочитать здесь).
Выполнение операций по добавлению информации в реестр логично возложить на функцию DllRegisterServer, экспортируемую нашей DLL. Именно так сделано в примере к этой статье. Также в демонстрационном приложении реализована функция DllUnregidterServer, удаляющая всю информацию о плагине из реестра.
Теперь, если вы следовали приведённым выше действиям, на панели инструментов Internet Explorer должна появиться кнопка, а в меню 'Сервис' строка меню, запускающая наш плагин.
Надеюсь, что написание плагинов для самого популярного в мире браузера не показалось вам трудным. Если так, то у вас наверняка появилось желание поэкспериментировать с компонентами, расширяющими функциональность браузера. В этом случае я могу считать, что цель, к которой я стремился при написании этой статьи, достигнута.
ЭКЗАМЕН
How do you create an edit control that echoes '#' for any character the user types?
1. Super-class the edit control, override the WM_CHAR message, and also override the WM_PAINT message to echo the '#' char.
2. Send the edit control a WM_PASSWORD message and then send a WM_SETPASSWORDHAR message to specify the '#' char.
3. Send the edit control an EM_PASSWORD message and then send an EM_SETPASSWORDHAR message to specify the '#' char.
4. Use the ES_PASSWORD style and then send an EM_SETPASSWORDCHAR message to specify the '#' char.
5. Sub-class the edit control, override the WM_CHAR message, and also override the WM_PAINT message to echo the '#' char.
Вариант 1 неверен, т.к. действие "super-class the edit control" не имеет смысла. Варианты 2 и 3 также неверны, потому что сообщений WM_PASSWORD, WM_SETPASSWORDCHAR и EM_PASSWORD не существует. Вариант 5 неверен, т.к. существует стандартный и более простой способ. Правильный ответ — вариант 4, существует и стиль ES_PASSWORD, и сообщение EM_SETPASSWORDCHAR, которые предназначены как раз для решения этой проблемы.
Это все на сегодня. Пока!
Программирование на Visual C++
Выпуск №63 от 10 февраля 2002 г.
Здравствуйте, дорогие друзья!
СТАТЬЯ
Растровые изображения с прозрачными областями
Автор: Ron Gery
Перевод: Виталий Брусенцев
Демонстрационная программа к статье (12 кБ)
Да, эта статья написана в 1992 году, и самая свежая информация в ней относится к Windows 3.1. Но описываемые здесь алгоритмы и методы растровой графики до сих пор (за одним-двумя исключениями) работают в Windows. Также приятно, что приведенные алгоритмы описаны доходчиво и в деталях. В-общем, если Вы хотите разобраться в том, как работает прозрачность в Windows GDI – читайте эту статью!
Установив с помощью вызова функции SetBkMode режим отображения фона как TRANSPARENT, можно выводить текст с прозрачным фоном, пунктирные линии с прозрачными разрывами и кисти с прозрачными областями. К сожалению, среда Windows не предоставляет таких же простых средств для вывода прозрачных растров. (Ну хорошо, представляет, но поддерживается этот метод далеко не везде – подробнее об этом ниже, в разделе "Простая растровая прозрачность".) К счастью, можно сымитировать этот эффект, используя маскирующий растр и несколько раз вызвав функцию BitBlt с правильными параметрами растровых операций.