Компонент TRichEdit, включенный в состав VCL, выполняет работу по инкапсуляции элемента управления rich edit Windows. Тем не менее, в компоненте отсутствует многое из функциональности, обнаруживаемой в более поздних версиях элемента управления.
В этой статье я собираюсь показать вам, как работать с гиперссылками в компоненте TRichEdit. Если вы щелкните левой кнопкой мыши на этом URL, будет запущен ваш веб-броузер с загруженной в него ссылкой.
Я написал небольшое приложение, которое это демонстрирует. Рисунок 1 показывает приложение с гиперссылкой на http://www.bridgespublishing.com. При щелчке по этой подчеркнутой ссылке должен запуститься ваш броузер и отобразить страницу на этом адресе.
http://www.bcbdev.ru/cbuilder/articles/including_hot_links_in_TRichEdit/pic1.gif Рисунок 1. Приложение, показывающее гиперссылку в элементе управления rich edit.
Для того чтобы код, приведенный в данной статье, смог отобразить гиперссылки, вам необходимо иметь элемент управления rich edit версии 2.0 и выше. Если вы используете этот код на компьютере, на котором установлен rich edit версии 1.0, TRichEdit будет отображать гиперссылки как обычный текст.
Вы можете проверить версию элемента управления rich edit, но в действительности это не является необходимым, поскольку код написан таким образом, чтобы работать с любой версией rich edit. Вы просто потеряете функциональность гиперссылок на версиях rich edit, меньших 2.0.
Существенный для тестового приложения код приведен в листинге 1. Это компонент TRichEdit, названный RichEdit1, на форме TMainForm. В конструкторе формы я получаю маску события для RichEdit1, отправляя компоненту сообщение EM_GETEVENTMASK. Затем я добавляю событие ENM_LINK к значению маски и устанавливаю новую маску для RichEdit1, отправляя ее RichEdit1 в сообщении EM_SETEVENTMASK.
Маска события сообщает элементу управления rich edit, какие сообщения он должен отправлять, когда в нем происходят некие события. Как только в маску включено значение ENM_LINK, при щелчке на гиперссылке отправляется событие EN_LINK.
В конструкторе формы я также отправляю сообщение EM_AUTOURLDETECT RichEdit 1. Оно сообщает элементу управления, что он должен проверять вводимый текст и автоматически определять, является ли текст гиперссылкой или нет.
Наконец, я присваиваю RichEdit1 текст, содержащий гиперссылку, www.bridgespublishing.com.
Все, что осталось сделать - отловить сообщения EN_LINK, отправляемые приложению, и обработать их. Эти действия я выполню, переопределив виртуальную функцию WndProc класса TForm.
В этой функции я ищу сообщения WM_NOTIFY, которые содержат EN_LINK. Если приложением получается такое сообщение, параметр lParam сообщения будет указателем на структуру ENLINK. Вот определение для этой структуры:
| Код | typedef struct _enlink { NMHDR nmhdr; UINT msg; WPARAM wParam; LPARAM lParam; CHARRANGE chrg; } ENLINK;
|
Я проверяю член msg структуры ENLINK , и если его значение равно WM_LBUTTONDOWN, значит, был щелчок левой кнопкой мыши по ссылке.
Член chrg структуры ENLINK содержит диапазон символов, которые составляют гиперссылку. Я выбираю символы, отправляя сообщение EM_EXSETSEL в RichEdit1 с указанным диапазоном. Теперь текст, составляющий гиперссылку, доступен через свойство SelText RichEdit1. Я использую этот текст как входное значение для функции ShellExecute Windows API. Функция ShellExecute возьмет на себя активизацию броузера.
Все остальные сообщения передаются TForm::WndProc ().
Если вы попытаетесь найти структуру и сообщение в справочнике по Windows API, поставляемом с C ++ Builder, ваш поиск окончится неудачей. Тем не менее, из них не делается никакого секрета. Вы можете их найти на сайте Microsoft Developer Network, http://www.msdn.microsoft.com.
Листинг 1. Код для отображения гиперссылок в компоненте TRichEdit.
| Код | __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { unsigned mask = SendMessage(RichEdit1->Handle, EM_GETEVENTMASK, 0, 0); SendMessage(RichEdit1->Handle, EM_SETEVENTMASK, 0, mask | ENM_LINK); SendMessage(RichEdit1->Handle, EM_AUTOURLDETECT, true, 0);
RichEdit1->Text = "The Bridges Publishing Web" " Site is located at www.bridgespublishing.com. Check" " it out."; }
void __fastcall TMainForm::WndProc(Messages::TMessage &Message) { if(Message.Msg == WM_NOTIFY) { if(((LPNMHDR)Message.LParam)->code == EN_LINK) { ENLINK* p = (ENLINK *)Message.LParam; if(p->msg == WM_LBUTTONDOWN) { SendMessage(RichEdit1->Handle, EM_EXSETSEL, 0, (LPARAM)&(p->chrg)); ShellExecute(Handle, "open", RichEdit1->SelText.c_str(), 0, 0, SW_SHOWNORMAL); } } }
TForm::WndProc(Message); }
|
|