C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как на форму усадить гиперссылку?, Чтобы, кликнешь на неё — и уже на сайте.
Daisy
Отправлено: 17.12.2005, 17:15


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Подскажите пожалуйста. Хочу, что интернет адрес сайта подсвечивался синим и был реальной ссылкой, а не просто текстом. Как это сдлелать?
AVC
Отправлено: 19.12.2005, 09:39


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Хочу, что интернет адрес сайта подсвечивался синим и был реальной ссылкой, а не просто текстом.

В каком компоненте?
Если Label, то самое простое — настроить вид Label'а и на Click (DblClick) повесить ShellExecute.
А если в тексте, то RichEdit может помочь в решении. Надо будет дам ссылку как это сделать.
А еще можно отобразить эту ссылку в CppWebBrowser.
Rius
Отправлено: 19.12.2005, 10:49


Мастер участка

Группа: Участник
Сообщений: 321



Вот такой компонент, просто поставь его в билдер biggrin.gif

LabelURL.cpp
CODE
//---------------------------------------------------------------------------
//Copyright © Rius
//Chelyabnsk 2003-2005
//mailto: rius@mail.ru
//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "LabelURL.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//

static inline void ValidCtrCheck(TLabelURL *)
{
new TLabelURL(NULL);
}
//---------------------------------------------------------------------------
namespace Labelurl
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TLabelURL)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
__fastcall TLabelURL::TLabelURL(TComponent* Owner)
: TLabel(Owner)
{
FURL = "";
GotoURL = false;
FSelected = clNavy;
FNormal = clWindowText;
Font->Color = FNormal;
// Inherited::OnClick = FOnMouseClick;
}
//---------------------------------------------------------------------------
void __fastcall TLabelURL::WndProc(TMessage& Message)
{
Inherited::WndProc(Message);
switch(Message.Msg)
{
case CM_MOUSEENTER: FOnLabelMouseEnter(Message); break;
case CM_MOUSELEAVE: FOnLabelMouseLeave(Message); break;
case WM_LBUTTONUP: FOnLeftMouseUp(Message); break;
}
}
//---------------------------------------------------------------------------
void __fastcall TLabelURL::FOnLabelMouseEnter(TMessage& Message)
{
FMouseOverControl = true;
UpdateState();
}
//---------------------------------------------------------------------------
void __fastcall TLabelURL::FOnLabelMouseLeave(TMessage& Message)
{
FMouseOverControl = false;
UpdateState();
}
//---------------------------------------------------------------------------
void __fastcall TLabelURL::FOnLeftMouseUp(TMessage &Message)
{
if(FAction) FAction->Execute();
else
{
// if(FMouseClick) //FMouseClick(this);
if(Inherited::OnClick != NULL)
Inherited::OnClick(this);
}
UpdateState();
if(FGotoURL) ShellExecute(this,"open",FURL.c_str(),NULL,NULL,SW_SHOWMAXIMIZED);
}
//---------------------------------------------------------------------------
void __fastcall TLabelURL::FSetAction(TAction *Action)
{
FAction = Action;
if(Action != NULL)
{
Caption = Action->Caption;
// FMouseClick = Action->OnExecute;
Enabled = Action->Enabled;
Visible = Action->Visible;
Hint = Action->Hint;
}
else
{
Enabled = true;
// FCaption = "";
// FMouseClick = NULL;
}
}
//---------------------------------------------------------------------------

void __fastcall TLabelURL::CheckActionState(void)
{
if(FAction)
{
Enabled = FAction->Enabled;
Visible = FAction->Visible;
Caption = FAction->Caption;
FActionChecked = FAction->Checked;
}
}
//---------------------------------------------------------------------------

void __fastcall TLabelURL::UpdateState()
{
CheckActionState();
if(FMouseOverControl)
{
if(!FActionChecked)
Font->Style = TFontStyles() << fsUnderline;// << fsUnderline;
else
Font->Style = TFontStyles() << fsUnderline << fsBold;
Font->Color = FSelected;
}
else
{
if(!FActionChecked)
Font->Style = TFontStyles() >> fsUnderline;// << fsUnderline;
else
Font->Style = TFontStyles() >> fsUnderline << fsBold;
Font->Color = FNormal;
}
}


LabelURL.h
CODE
//---------------------------------------------------------------------------
//Copyright © Rius
//Chelyabnsk 2003-2005
//mailto: rius@mail.ru
//---------------------------------------------------------------------------

#ifndef LabelURLH
#define LabelURLH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TLabelURL : public TLabel
{
typedef TLabel Inherited;
private:
AnsiString FURL;
bool FGotoURL;
TColor FSelected;
TColor FNormal;
bool FMouseOverControl;
void __fastcall FOnLabelMouseEnter(TMessage& Message);
void __fastcall FOnLabelMouseLeave(TMessage& Message);
void __fastcall FOnLeftMouseUp(TMessage &Message);
void __fastcall SetFURL(AnsiString url);
TAction *FAction;
void __fastcall FSetAction(TAction *Action);
void __fastcall CheckActionState(void);
// TNotifyEvent FMouseClick;
bool FActionChecked;
void __fastcall UpdateState();
void __fastcall WndProc(TMessage& Msg);
protected:
public:
__fastcall TLabelURL(TComponent* Owner);
__published:
__property TAction *Action = {read = FAction, write = FSetAction};
__property AnsiString URL = {read = FURL, write = FURL};
__property TColor Selected = {read = FSelected, write = FSelected};
__property TColor Normal = {read = FNormal, write = FNormal};
__property bool GotoURL = {read = FGotoURL, write = FGotoURL};
// __property TNotifyEvent OnClick ={read=FMouseClick, write=FMouseClick};
__property bool ActionChecked ={read=FActionChecked, write=FActionChecked};
};
//---------------------------------------------------------------------------
#endif


Отредактировано Rius — 21/12/2005, 10:14
Gal
Отправлено: 19.12.2005, 18:40


Станционный диспетчер

Группа: Участник
Сообщений: 124



Label на форму и по onClick
Напишите следующий код:

CODE

void __fastcall TForm1::Label1Click(TObject *Sender)
{
ShellExecute(Handle, "open", "http://google.com/",
0, 0, SW_SHOWNORMAL);
}


и совет компоненты надо устанавливать только тогда, когда ты уверен, что буз них ты не обойдешся!
P.S.
компонент от Rius тут ни причем.
Grigoriy
Отправлено: 20.12.2005, 06:44


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (Gal @ 19/12/2005, 18:40)
Label на форму и по onClick
Напишите следующий код:

CODE

void __fastcall TForm1::Label1Click(TObject *Sender)
{
ShellExecute(Handle, "open", "http://google.com/",
0, 0, SW_SHOWNORMAL);
}


и совет компоненты надо устанавливать только тогда, когда ты уверен, что буз них ты не обойдешся!
P.S.
компонент от Rius тут ни причем.

Если текст в Label не меняет своего цвета при наведении курсора мыши, то пользователь может подумать, что это вообще не ссылка.
В таком случае Label ведет себя примитивно и мы не можем узнать — находится ли координата курсора мыши в области Label, если он маленький, когда быстро выбираем нужную ссылку.
В случае кода от Rius-а поведение Label эффективнее, то есть есть и подсвечивание и шрифт меняется, сразу видно, что курсор мыши наведен на ссылку.
Gal
Отправлено: 20.12.2005, 12:09


Станционный диспетчер

Группа: Участник
Сообщений: 124



Ну так напишите еще
CODE

void __fastcall TMainForm::Label1MouseMove(TObject *Sender,
     TShiftState Shift, int X, int Y)
{
  Label1->Color = clBlue; //      
}
//---------------------------------------------------------------------------


Наверное до этого можно дойти и самому!
gvg
Отправлено: 20.12.2005, 12:39


Машинист паровоза

Группа: Участник
Сообщений: 222



QUOTE (Gal @ 20/12/2005, 12:09)
Ну так напишите еще
CODE

void __fastcall TMainForm::Label1MouseMove(TObject *Sender,
     TShiftState Shift, int X, int Y)
{
  Label1->Color = clBlue; //      
}
//---------------------------------------------------------------------------


Наверное до этого можно дойти и самому!

Если при каждом движении мышки менять цвет... А когда мышка уйдет с Label, кто восстановит цвет?
Gal
Отправлено: 20.12.2005, 13:58


Станционный диспетчер

Группа: Участник
Сообщений: 124



Да погарячился — прошу прощения.
Ну тогда можно поменять в инспекторе объекта Cursor = crHandPoint
будет понятно, что это ссылка.
А на счет цвета все равно придумать можно.
AVC
Отправлено: 20.12.2005, 14:59


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

А на счет цвета все равно придумать можно

Читать посты коллег будем?
OnMouseEnter;
OnMouseLeave;
(Правда в 5-ом Buildere таких событий у TLabel'а нет.)

Rius предложил решение "от сейчас и навсегда". Стоит его использовать вместо того, что бы каждый раз писать коды и обработчики событий.
Gedeon
Отправлено: 20.12.2005, 15:12


Ветеран

Группа: Модератор
Сообщений: 1742



Ну что еще добавить хочу, если часто юзать приходится такие ссылки, то смысл добавить компонент есть, а если 1 раз, можно и обработчики написать, или уже готовый юнит взять (спасибо Rius) и создать компонент динамически, т.к. до бесконечности расширять палитру компонентов как-то не очень хочется, она может в новогоднюю елку превратиться, а вообще спор какой-то не о чем, как автору удобнее, пусть так и делает.

Отредактировано Gedeon — 20/12/2005, 15:13
Daisy
Отправлено: 20.12.2005, 17:55


Дежурный стрелочник

Группа: Участник
Сообщений: 36



Большое всем спасибо. Реализовалось через OnClick и курсор HandPoint. Запускается!!!
Цвет при наведении пока менять не стала. Синий он и синий. Тем более что у самого борланда в "About" к Билдеру он не меняется. biggrin.gif
Отдельное спасибо Rius-у за компонент. Дня через два попробую с ним (с компонентом smile.gif ) разобраться. Сейчас мозги кипять.

Вернуться в Вопросы программирования в C++Builder