Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.04.19;
Скачать: CL | DM;

Вниз

Гиперссылка в Static Text   Найти похожие ветки 

 
L-e-v-original   (2009-03-03 11:32) [0]

Доброго всем дня и ночи. Есть небольшой вопрос, может, кто сталкивался. Есть ли возможность и какая, чтобы реализовать гиперссылку (я бы больше сказал кнопку, лейбл, что угодно, лишь бы было событие на нажатие) в Static Text на какой-то набор символов.
Разъясню: например, в тексте "перечень компонентов данного типа" при наведении и (или) нажатии на набор символов "перечень" происходило какое-то действие (например, текст менял цвет...)
Заранее весьма благодарен неравнодушным!


 
Rouse_ ©   (2009-03-03 11:42) [1]

Для этого есть специальный класс, называется SysLinc. Вот пример работы с ним:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, CommCtrl;

// ====== SysLink control =========================================

const
 { For Windows >= XP }
 {$EXTERNALSYM INVALID_LINK_INDEX}
 INVALID_LINK_INDEX  = -1;
 {$EXTERNALSYM MAX_LINKID_TEXT}
 MAX_LINKID_TEXT     = 48;
 {$EXTERNALSYM L_MAX_URL_LENGTH}
 L_MAX_URL_LENGTH    = 2048 + 32 + sizeof("://");

 { For Windows >= XP }
 {$EXTERNALSYM WC_LINK}
 WC_LINK         = "SysLink";

 { For Windows >= XP }
 {$EXTERNALSYM LWS_TRANSPARENT}
 LWS_TRANSPARENT     = $0001;
 {$EXTERNALSYM LWS_IGNORERETURN}
 LWS_IGNORERETURN    = $0002;
 { For Windows >= Vista }
 {$EXTERNALSYM LWS_NOPREFIX}
 LWS_NOPREFIX        = $0004;
 {$EXTERNALSYM LWS_USEVISUALSTYLE}
 LWS_USEVISUALSTYLE  = $0008;
 {$EXTERNALSYM LWS_USECUSTOMTEXT}
 LWS_USECUSTOMTEXT   = $0010;
 {$EXTERNALSYM LWS_RIGHT}
 LWS_RIGHT           = $0020;

 { For Windows >= XP }
 {$EXTERNALSYM LIF_ITEMINDEX}
 LIF_ITEMINDEX    = $00000001;
 {$EXTERNALSYM LIF_STATE}
 LIF_STATE        = $00000002;
 {$EXTERNALSYM LIF_ITEMID}
 LIF_ITEMID       = $00000004;
 {$EXTERNALSYM LIF_URL}
 LIF_URL          = $00000008;

 { For Windows >= XP }
 {$EXTERNALSYM LIS_FOCUSED}
 LIS_FOCUSED         = $00000001;
 {$EXTERNALSYM LIS_ENABLED}
 LIS_ENABLED         = $00000002;
 {$EXTERNALSYM LIS_VISITED}
 LIS_VISITED         = $00000004;
 { For Windows >= Vista }
 {$EXTERNALSYM LIS_HOTTRACK}
 LIS_HOTTRACK        = $00000008;
 {$EXTERNALSYM LIS_DEFAULTCOLORS}
 LIS_DEFAULTCOLORS   = $00000010; // Don"t use any custom text colors

type
 { For Windows >= XP }
 { $EXTERNALSYM tagLITEM}
 tagLITEM = packed record
   mask: UINT;
   iLink: Integer;
   state: UINT;
   stateMask: UINT;
   szID: packed array[0..MAX_LINKID_TEXT-1] of WCHAR;
   szUrl: packed array[0..L_MAX_URL_LENGTH-1] of WCHAR;
 end;
 PLItem = ^TLItem;
 TLItem = tagLITEM;

 { For Windows >= XP }
 { $EXTERNALSYM tagLHITTESTINFO}
 tagLHITTESTINFO = packed record
   pt: TPoint;
   item: TLItem;
 end;
 PLHitTestInfo = ^TLHitTestInfo;
 TLHitTestInfo = tagLHITTESTINFO;

 { For Windows >= XP }
 { $EXTERNALSYM tagNMLINK}
 tagNMLINK = packed record
   hdr: NMHDR;
   item: TLItem;
 end;
 PNMLink = ^TNMLink;
 TNMLink = tagNMLINK;

//  SysLink notifications
//  NM_CLICK   // wParam: control ID, lParam: PNMLINK, ret: ignored.

//  LinkWindow messages
const
 { For Windows >= XP }
 {$EXTERNALSYM LM_HITTEST}
 LM_HITTEST         = WM_USER+$300;    // wParam: n/a, lparam: PLHITTESTINFO, ret: BOOL
 {$EXTERNALSYM LM_GETIDEALHEIGHT}
 LM_GETIDEALHEIGHT  = WM_USER+$301;    // wParam: cxMaxWidth, lparam: n/a, ret: cy
 {$EXTERNALSYM LM_SETITEM}
 LM_SETITEM         = WM_USER+$302;    // wParam: n/a, lparam: LITEM*, ret: BOOL
 {$EXTERNALSYM LM_GETITEM}
 LM_GETITEM         = WM_USER+$303;    // wParam: n/a, lparam: LITEM*, ret: BOOL
 {$EXTERNALSYM LM_GETIDEALSIZE}
 LM_GETIDEALSIZE    = LM_GETIDEALHEIGHT;   // wParam: cxMaxWidth, lparam: SIZE*, ret: cy

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   hControl: THandle;
   procedure WMNotify(var Msg: TMessage); message WM_NOTIFY;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses
 ShellAPI;

const
 linkID = 123321;
 LinkInfo =
   "For more information, <A HREF="http://msdn.microsoft.com/en-us/library/bb760706(VS.85).aspx">click here</A> " +
       "or <A HREF="http://www.microsoft.com">here</A>.";

procedure TForm1.FormCreate(Sender: TObject);
begin
 hControl := CreateWindow(WC_LINK, PChar(LinkInfo), WS_CHILD or WS_VISIBLE or WS_TABSTOP,
   10, 10, 300, 100, Handle, linkID, HInstance, nil);
 SendMessage(hControl, WM_SETFONT, Integer(Canvas.Font.Handle), 1);
end;

procedure TForm1.WMNotify(var Msg: TMessage);
begin
 if Msg.WParam = linkID then
 begin
   case PNMLink(Msg.LParam)^.hdr.code of
     NM_CLICK:
       ShellExecuteW(Handle, "open",
         PNMLink(Msg.LParam)^.item.szUrl, nil, nil, SW_SHOWDEFAULT);
   end;
 end;
end;

end.


 
clickmaker ©   (2009-03-03 13:16) [2]

можно из обычной Label сделать, установив соотв. шрифт и курсор


 
{RASkov} ©   (2009-03-03 14:01) [3]

если готовые варианты не подходят, то можно это с TPaintBox"ом реализовать или проще всего возможно с TRichEdit"ом


 
L-e-v-original   (2009-03-03 14:53) [4]

Какие варианты с TRichEdit"ом?


 
L-e-v-original   (2009-03-03 15:07) [5]

При масшабировании окна с текстом - текст, естественно, будет прыгать со строки на строку и высчитать нужную позицию Label-ов не реально.


 
L-e-v-original   (2009-03-03 15:10) [6]

В TRichEdit-е есть возможность назначить для кусочка текста OnClick?


 
clickmaker ©   (2009-03-03 15:38) [7]

> [6] L-e-v-original   (03.03.09 15:10)

в ричэдите версии 2 и выше есть возможность распознования гиперссылок.
включить - EM_AUTOURLDETECT
при щелчке на линке, ричэдит пошлет WM_COMMAND с кодом EN_LINK


 
clickmaker ©   (2009-03-03 16:40) [8]

да, и чтобы превратить любой кусок текста в ссылку, можно воспользоваться  EM_SETCHARFORMAT с dwEffects = CFE_LINK.
См. в MSDN



Страницы: 1 вся ветка

Текущий архив: 2009.04.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
2-1235812626
Strate
2009-02-28 12:17
2009.04.19
Интересное поведение компонента TTrayIcon (D2009)


1-1210915024
LightRipple
2008-05-16 09:17
2009.04.19
Алгоритм создания "многоступенчатого" ключа.


4-1208185369
тимохов
2008-04-14 19:02
2009.04.19
Как получить унифицированное имя файла?


3-1219898793
Finjy
2008-08-28 08:46
2009.04.19
IBQuery чужой формы


2-1235981744
Dm
2009-03-02 11:15
2009.04.19
TaskBar закрывает мое окно)))