|
|
Home » U++ Library support » U++ Widgets - General questions or Mixed problems » Creating a hyperlink label
Creating a hyperlink label [message #41218] |
Fri, 15 November 2013 08:52 |
crydev
Messages: 151 Registered: October 2012 Location: Netherlands
|
Experienced Member |
|
|
Hello,
I'm trying to create a hyperlink label. I have a label that displays an URL using QTF, but I cannot catch the mouse click event to it. This is the code I have now, I have tried multiple mouse events, but I cannot find it out. How can I catch the left mouse click on the label?
class HyperlinkLabel : public Label
{
private:
virtual void LeftUp(Point p, dword keyflags)
{
this->WhenLeftUp();
Label::LeftUp(p, keyflags);
}
public:
Callback WhenLeftUp;
};
Thanks in advance!
|
|
|
Re: Creating a hyperlink label [message #41219 is a reply to message #41218] |
Fri, 15 November 2013 15:43 |
|
Klugier
Messages: 1075 Registered: September 2012 Location: Poland, Kraków
|
Senior Contributor |
|
|
Hello crydev,
You should definitly use LeftDown method instead of LeftUp. Here is exemplary code from my private control (LinkCtrl):
void LinkCtrl::LeftDown (Point p, dword keyflags) {
for (int i = 0; i < linkFields.GetCount (); i++) {
if (p.x >= linkFields[i].left && p.x <= linkFields[i].right) {
if (p.y >= linkFields[i].top && p.y <= linkFields[i].bottom) {
if (!WhenLink.Empty ()) {
overrideCursor = false;
WhenLink ();
overrideCursor = true;
}
}
}
}
return;
}
I am not sure that Label supports such functionality.But, you can always implement HyperlinkCtrl by your own. If you want to open web browser with specific url try following function:
LaunchWebBrowser(const String& url)
Sincerely,
Klugier
U++ - one framework to rule them all.
[Updated on: Fri, 15 November 2013 16:44] Report message to a moderator
|
|
|
|
Re: Creating a hyperlink label [message #41221 is a reply to message #41220] |
Fri, 15 November 2013 20:20 |
|
Klugier
Messages: 1075 Registered: September 2012 Location: Poland, Kraków
|
Senior Contributor |
|
|
Hello,
I think the problem is with controls that inherit from LabelBase. It seems that some events are locked for this widgets set.
I have made simply test:
class HyperlinkLabel : public Label {
typedef HyperlinkLabel CLASSNAME;
public:
void LeftDown(Point p, dword keyflags) {
Cout() << "LeftDown!\n";
}
};
It dosen't work, but
class HyperlinkLabel : public Ctrl {
typedef HyperlinkLabel CLASSNAME;
public:
void LeftDown(Point p, dword keyflags) {
Cout() << "LeftDown!\n";
}
};
works as excepted.
For me, you have two options. The first one is to implement control based on RichTextView (It supports hyperlink via Qtf, so implementation should be easy). The second way more complex is created your own hyperlink control based on bare "Ctrl" class. The second way is harder, but can give you additional customization options for instance link hoover.
Sincerely,
Klugier
U++ - one framework to rule them all.
[Updated on: Sat, 16 November 2013 00:32] Report message to a moderator
|
|
|
Re: Creating a hyperlink label [message #41232 is a reply to message #41218] |
Sun, 17 November 2013 12:05 |
crydev
Messages: 151 Registered: October 2012 Location: Netherlands
|
Experienced Member |
|
|
Thanks Klugier,
I now solved that problem the following way, allowing me to set the LaunchWebBrowser call as WhenLeftDown callback:
// Represents a label that is clickable, for example, to execute a hyperlink.
class HyperlinkLabel : public ParentCtrl
{
private:
Label mLinkLabel;
virtual void LeftDown(Point p, dword keyflags) { this->WhenLeftDown(); }
public:
Callback WhenLeftDown;
HyperlinkLabel() { *this << this->mLinkLabel.SizePos(); }
HyperlinkLabel& SetLabel(const char* lbl) { this->mLinkLabel.SetLabel(lbl); return *this; }
};
This works, but one question remains. I have already tried a few things, for example, overriding MouseEvent, and using a RectTracker, but none really seemed to work for me. I would like to change the cursor to a hand while the mouse is on top of the control.
Thanks in advance!
|
|
|
|
|
Re: Creating a hyperlink label [message #43755 is a reply to message #41235] |
Fri, 03 October 2014 09:31 |
|
koldo
Messages: 3355 Registered: August 2008
|
Senior Veteran |
|
|
Hello all
If you do not mind I would like to include it in Controls4U.
.cpp/.h
class HyperlinkText : public ParentCtrl {
public:
HyperlinkText() {
label.SetInk(LtBlue());
*this << label.SizePos();
}
HyperlinkText& SetText(const char* txt) {
label.SetText(txt);
return *this;
}
HyperlinkText& SetHyperlink(const char* str) {
hyperlink = str;
return *this;
}
private:
StaticText label;
String hyperlink;
virtual Image CursorImage(Point p, dword keyflags) {
return Image::Hand();
}
virtual void LeftDown(Point p, dword keyflags) {
LaunchWebBrowser(hyperlink);
}
};
.usc
ctrl HyperlinkText {
group "Static";
GetMinSize() { return XMinSize(); }
GetStdSize() { sz = XMinSize(); sz.cy += 6; sz.cx *= 5; return sz; }
Doc SetText ? "Label of control" ;
Doc SetHyperlink ? "Hyperlink" ;
Align SetAlign = ALIGN_LEFT;
Font SetFont = StdFont();
Frame SetFrame @1;
ViewRect(w) {
r = GetRect();
DrawCtrlFrame(w, r, .SetFrame);
return r;
}
ViewSize(w) {
r = ViewRect(w);
return Size(r.right - r.left, r.bottom - r.top);
}
Paint(w) {
sz = ViewSize(w);
textsize = GetTextSize(.SetText, .SetFont);
px = 0;
if(.SetAlign == "ALIGN_CENTER")
px = (sz.cx - textsize.cx) / 2;
if(.SetAlign == "ALIGN_RIGHT")
px = sz.cx - textsize.cx;
w.DrawText(px, (sz.cy - textsize.cy) / 2, .SetText, .SetFont, :SLtBlue);
}
Sample() {
.SetText = "Text";
.SetFont = Arial(10).Bold().Italic();
}
};
Best regards
Iñaki
|
|
|
Re: Creating a hyperlink label [message #43792 is a reply to message #43755] |
Mon, 13 October 2014 12:00 |
|
mirek
Messages: 13975 Registered: November 2005
|
Ultimate Member |
|
|
Note: The reason why it does not work with Label is that Label (as most static widgets) have "IgnoreMouse" active. The reason for that is that labels (and especially LabelBox) often overlap with other widgets and they would be stealing the mouse input for these...
Calling NoIgnoreMouse in constructor would fix that.
Final note: If you need hyperlink, you might be happier using RichTextCtrl instead of Label...
[Updated on: Mon, 13 October 2014 12:02] Report message to a moderator
|
|
|
|
Re: Creating a hyperlink label [message #44361 is a reply to message #41218] |
Sun, 01 March 2015 02:31 |
|
Edward
Messages: 34 Registered: February 2015 Location: United States
|
Member |
|
|
Many years back when there was a handy little guy named HyperLabel.OCX. The URL was placed in a field, font style selected, then click, click.
I still have it in older projects I'm currently updating, and trying not to loose features.
Quote:IMHO Rolling Eyes it is very handy to have an hyperlink in a Label, mainly included in .usc so it can be filled directly in the Layout editor with no code. It could be in the Label too Rolling Eyes Rolling Eyes
I second the motion Koldo!!
We're in the 2Ks now this could actually be a reality, like dropping an imageCTRL on a layout...
My mission is to find a powerful(Non MS) C++ IDE w/GUI to marry and spend the rest of my life with...
[Updated on: Sun, 01 March 2015 02:44] Report message to a moderator
|
|
|
Re: Creating a hyperlink label [message #44362 is a reply to message #44361] |
Sun, 01 March 2015 08:12 |
|
mirek
Messages: 13975 Registered: November 2005
|
Ultimate Member |
|
|
Edward wrote on Sun, 01 March 2015 02:31Many years back when there was a handy little guy named HyperLabel.OCX. The URL was placed in a field, font style selected, then click, click.
I still have it in older projects I'm currently updating, and trying not to loose features.
Quote:IMHO Rolling Eyes it is very handy to have an hyperlink in a Label, mainly included in .usc so it can be filled directly in the Layout editor with no code. It could be in the Label too Rolling Eyes Rolling Eyes
I second the motion Koldo!!
We're in the 2Ks now this could actually be a reality, like dropping an imageCTRL on a layout...
Ah, OK. The only thing that is missing is actually change in .usc that would allow the text of RichTextCtrl to be edited. Adding RM task.
The reason why it was not done yet is that a) it is not needed so often b) it is trivial to set text in code c) whenever I needed it, the text was variable and had to be created in the code anyway.
|
|
|
Goto Forum:
Current Time: Fri Mar 29 13:56:43 CET 2024
Total time taken to generate the page: 0.01607 seconds
|
|
|