Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ссылки в тексте 
:(
    Опции темы
Бегемот
Дата 10.3.2005, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 26.1.2005
Где: На границе Европы и Азии

Репутация: 1
Всего: 3



Мне необходимо в тексте сделать несколько ссылок,
т.е есть вот например текст…

- Ты, Зин, на грубость нарываешься,
Все, Зин, обидеть норовишь!
Тут за день так накувыркаешься...
Придешь домой - там ты сидишь!

Ну, и меня, конечно, Зин,
Все время тянет в магазин, -
А там - друзья... Ведь я же, Зин,
Не пью один!

…при наведении на выделенные синим цветом слова, цвет слов должен меняться на красный, а при клике на слове должна выполняться какая-то операция ( конечно же мной определённая)
Я вот тут чего-то надумал, но чует моё обезьянье сердце есть вариантики покрасивей, да пограмотней
Код

/*Первым делом кидаю на форму Memo и StaticText..
В Memo пишу свой текст, а в StaticText слово-ссылку из этого текста.
                                                     ...ну и поехали*/

 void __fastcall TForm1::FormCreate(TObject *Sender)
 {
   Memo1->ReadOnly = true;     //что бы никто ничего никогда!!!
   Memo1->Font->Color = clBlack;

   StaticText1->Left = 190;    //безобразно подбераю положение  
   StaticText1->Top = 83;      //ссылки так, что бы она точно           
                               //накладывалясь на слово в тексте  
   
   StaticText1->Color = Memo1->Color;

 }
 //--------------------------------------------------------------
 void __fastcall TForm1::StaticText1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
 {
    StaticText1->Font->Color = clRed; //тут наводим...
 }
 //--------------------------------------------------------------
 void __fastcall TForm1::Memo1MouseMove(TObject *Sender, TShiftState  Shift,
      int X, int Y)
 {
   StaticText1->Font->Color = clBlue; //...а тут отводим
 }
 //--------------------------------------------------------------
 void __fastcall TForm1::StaticText1Click(TObject *Sender)
 {
   Application->Terminate(); //ну а тут делаем чего захотим
 }

Подскажите, кто чем может! smile

PM MAIL   Вверх
Jackal
Дата 12.3.2005, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 8.2.2005
Где: Находка

Репутация: нет
Всего: нет



Цитата

Компонент TRichEdit, включенный в состав VCL, выполняет работу по инкапсуляции элемента управления rich edit Windows. Тем не менее, в компоненте отсутствует многое из функциональности, обнаруживаемой в более поздних версиях элемента управления.

В этой статье я собираюсь показать вам, как работать с гиперссылками в компоненте TRichEdit. Если вы щелкните левой кнопкой мыши на этом URL, будет запущен ваш веб-броузер с загруженной в него ссылкой.

Я написал небольшое приложение, которое это демонстрирует. Рисунок 1 показывает приложение с гиперссылкой на www.bridgespublishing.com. При щелчке по этой подчеркнутой ссылке должен запуститься ваш броузер и отобразить страницу на этом адресе.

--Resize_Images_Alt_Text--
Рисунок 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, 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); 
}



Оригинальная статья здесь. smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0403 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.