Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Hyperlinks in RichEdit


Автор: Vit 2.9.2005, 21:50
Использую RichEdit от JVCL, так как нужна возможность использования гиперлинков, но есть ложка дёгтя - нужна возможность указания адреса гиперлинка отличного от того что написано в тексте. Например в одном месте хочу чтобы переход по гиперлинку со словом "поиск" происходил на yahoo.com, а в другом месте на yandex.com. Все компоненты которые я видел предоставляют возможность в гиперлинках в rtf отлавливать только текст, а не линк... как бы сие прикрутить?

Автор: Rrader 3.9.2005, 07:33
Delphi щас под рукой нет, но могу рассказать принцип данного действия в обычном RichEdit'е. smile

Значит, нам нужно сделать обработчик нажатия гиперссылки примерно так:
Код

Procedure TForm1.LinkClick(Var Msg: TMessage);
Type
  PENLINK = ^TENLINK;
Begin
  If PNMHDR(Msg.lParam)^.Code = EN_LINK Then
    If PENLINK(Msg.lParam)^.Msg = WM_LBUTTONUP Then
    Begin
      ShellExecute(Handle, 'Open', 'http://www.google.com',
        NIL, NIL, SW_SHOWNORMAL);
      Exit;
    End;
  Inherited;
End;

Затем при созданни формы нужно RichEdit'у послать мессаги, которые отключат автоопределение URL-адресов (по умолчанию отключено), затем послать такую, кажись мессагу, чтобы включить линки:
Код

  SendMessage(RichEdit.Handle, EM_SETEVENTMASK, 0,
    SendMessage(RichEdit.Handle, EM_GETEVENTMASK, 0, 0) or ENM_LINK);

Затем нужно подготовить структуру CHARFORMAT2: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/richeditcontrolreference/richeditstructures/charformat2.asp

И затем послать сообщение http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/richedit/richeditcontrols/richeditcontrolreference/richeditmessages/em_setcharformat.asp. Не помню ,к сожалению, третьего параметра. smile
Структура обязана содержать следующие флаги:
Код

  FillChar(Struct, SizeOf(CHARFORMAT2), 0);
  cbSize := SizeOf(CHARFORMAT2);
  dwMask := CFM_LINK or CFM_UNDERLINETYPE;
  dwEffects := CFE_LINK;
  bUnderlineType := CFU_UNDERLINE;

Еще нужно установить синий цвет - это смотреть в полях crTextColor. smile
Удачи! smile

Автор: Quadr0 3.9.2005, 14:50
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)