Hi, wie kann ich auf der Titelleiste eine URL zeichnen, und dieser dann OnClick zufügen, also wenn man auf den Link klickt, dass dieser auch geöffnet wird.
Vor einiger Zeit hab ich das mal mit Canvas->TextOutA probiert, aber damit kann man ja leider nur einen Text ausgeben.
Hat jemand ne Idee?
Wäre echt hilfreich!
[ Dieser Beitrag wurde am 08.07.2003 um 12:52 Uhr von Tillmann David editiert. ]
Sieh dir doch mal WM_NCLBUTTONDOWN in der Hilfe an!
Über den LParam kannst du die Mauskoordinaten ermitteln, mittels TCanvas::TextWidth o.ä. kannst du dann prüfen, ob die Mausposition im Link-Text liegt.
//---------------------------------------------------------------------------
// im HEADER
//---------------------------------------------------------------------------
private:
TCanvas *FormCanvas; // zeichenfläche des formulares
TRect URLRect; // rechteck der URL
int CaptionWidth; // breite der caption int URLWidth; // breite der URL
TColor URLNormal; // normale farbe der URL
TColor URLOver; // mouseover farbe der URL bool URLStateOver; // status der URL
AnsiString URLString; // die eigentliche URL
AnsiString ACaption; // anfangstext der caption
AnsiString ECaption; // endtext der caption (kann leer sein)
//---------------------------------------------------------------------------
// im QUELLCODE
//---------------------------------------------------------------------------
// funktion setzt den aktuelle systemfont für die caption void __fastcall TForm1::SetSystemFont(TCanvas *FCanvas)
{
LOGFONT FormFont;
NONCLIENTMETRICS NCM;
NCM.cbSize = sizeof(NONCLIENTMETRICS);
// den aktuellen Systemfont auslesen if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NCM, 0) != 0)
{
// Informationen über den aktuelle Font der Form holen
// -> Systemfont setzen if (GetObject(FCanvas->Font->Handle, sizeof(LOGFONT), &FormFont) != 0)
FormFont = NCM.lfCaptionFont;
// neuen (geänderten) Font auswählen und der Zeichenfläche zuweisen
FCanvas->Font->Handle = CreateFontIndirect(&FormFont);
}
}
// funktion prüft, ob sich die maus im rechteck der URL befindet bool __fastcall TForm1::MouseInURL(LPARAM lparam)
{
int LSpace = GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXFRAME);
int TSpace = GetSystemMetrics(SM_CXSIZE);
// den text der URL zeichnen void __fastcall TForm1::DrawURL(TColor TextColor)
{
TCanvas *FCanvas = new TCanvas();
FCanvas->Handle = GetWindowDC(Handle);
// systemfont setzen
SetSystemFont(FCanvas);
FCanvas->Font->Color = TextColor;
// hintergrund nicht verarbeiten
SetBkMode(FCanvas->Handle, TRANSPARENT);
// testen ob sich die maus über dem URL-Rechteck befindet
// und wenn ja die farbe der URL ändern void __fastcall TForm1::WMNCHitTest(TMessage &Msg)
{
TForm::Dispatch(&Msg);
if (Msg.Result == HTCAPTION)
{
if (MouseInURL(Msg.LParam))
{
URLStateOver = true;
// url neu zeichnen (maus ist ausserhalb)
DrawURL(URLNormal);
}
}
}
// beim aktivieren der form -> neu zeichnen void __fastcall TForm1::WMActivate(TMessage &Msg)
{
TForm::Dispatch(&Msg);
Perform(WM_NCPAINT, 0, 0);
}
// wenn fenster aktiv wird, neu zeichnen void __fastcall TForm1::WMNCActivate(TMessage &Msg)
{
TForm::Dispatch(&Msg);
Perform(WM_NCPAINT, 0, 0);
}
// wenn maus im formular bewegt wird, farbe der URL zurücksetzen void __fastcall TForm1::WMMouseMove(TMessage &Msg)
{
TForm::Dispatch(&Msg);
if (URLStateOver)
{
URLStateOver = false;
DrawURL(URLNormal);
}
}
// linke maustaste wurde im nonclient-bereich des formulares gedrückt
// (caption, frame, border, ...) void __fastcall TForm1::WMNCLButtonDown(TMessage &Msg)
{
TForm::Dispatch(&Msg);
if (Msg.WParam == HTCAPTION)
{
// link ausführen, wenn maus im bereich der URL if (MouseInURL(Msg.LParam))
ShellExecute(0, "open", URLString.c_str(), 0, 0, SW_SHOWNORMAL);
}
}
// zeichenfunktion für den nonclient-bereich des formulares void __fastcall TForm1::WMNCPaint(TMessage &Msg)
{
TForm::Dispatch(&Msg);
// text-attribute setzen
FormCanvas = new TCanvas();
FormCanvas->Handle = GetWindowDC(Handle);
// systemfont setzen
SetSystemFont(FormCanvas);
// farbe des textes setzen if (Active) FormCanvas->Font->Color = clCaptionText;
else FormCanvas->Font->Color = clInactiveCaptionText;
// breite des textes ermitteln int URLWidth = FormCanvas->TextWidth(URLString);
int CaptionWidth = FormCanvas->TextWidth(ACaption);
TRect WindowRect;
// rechteck des fensters holen
GetWindowRect(Handle, (LPRECT) &WindowRect);
int LeftSide = GetSystemMetrics(SM_CXSIZE) +
GetSystemMetrics(SM_CXBORDER) +
GetSystemMetrics(SM_CXFRAME);
TRect CaptionRect; // rechteck der verfügbaren caption
TRect OutputRect1; // rechteck des 1. caption-textes
TRect OutputRect2; // rechteck des 2. caption-textes
//---------------------------------------------------------------------------
// im HEADER
//---------------------------------------------------------------------------
private:
TCanvas *FormCanvas; // zeichenfläche des formulares
TRect URLRect; // rechteck der URL
int CaptionWidth; // breite der caption int URLWidth; // breite der URL
TColor URLNormal; // normale farbe der URL
TColor URLOver; // mouseover farbe der URL bool URLStateOver; // status der URL
AnsiString URLString; // die eigentliche URL
AnsiString ACaption; // anfangstext der caption
AnsiString ECaption; // endtext der caption (kann leer sein)
//---------------------------------------------------------------------------
// im QUELLCODE
//---------------------------------------------------------------------------
// funktion setzt den aktuelle systemfont für die caption void __fastcall TForm1::SetSystemFont(TCanvas *FCanvas)
{
LOGFONT FormFont;
NONCLIENTMETRICS NCM;
NCM.cbSize = sizeof(NONCLIENTMETRICS);
// den aktuellen Systemfont auslesen if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NCM, 0) != 0)
{
// Informationen über den aktuelle Font der Form holen
// -> Systemfont setzen if (GetObject(FCanvas->Font->Handle, sizeof(LOGFONT), &FormFont) != 0)
FormFont = NCM.lfCaptionFont;
// neuen (geänderten) Font auswählen und der Zeichenfläche zuweisen
FCanvas->Font->Handle = CreateFontIndirect(&FormFont);
}
}
// funktion prüft, ob sich die maus im rechteck der URL befindet bool __fastcall TForm1::MouseInURL(LPARAM lparam)
{
int LSpace = GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXFRAME);
int TSpace = GetSystemMetrics(SM_CXSIZE);
// den text der URL zeichnen void __fastcall TForm1::DrawURL(TColor TextColor)
{
TCanvas *FCanvas = new TCanvas();
FCanvas->Handle = GetWindowDC(Handle);
// systemfont setzen
SetSystemFont(FCanvas);
FCanvas->Font->Color = TextColor;
// hintergrund nicht verarbeiten
SetBkMode(FCanvas->Handle, TRANSPARENT);
// testen ob sich die maus über dem URL-Rechteck befindet
// und wenn ja die farbe der URL ändern void __fastcall TForm1::WMNCHitTest(TMessage &Msg)
{
TForm::Dispatch(&Msg);
if (Msg.Result == HTCAPTION)
{
if (MouseInURL(Msg.LParam))
{
URLStateOver = true;
// url neu zeichnen (maus ist ausserhalb)
DrawURL(URLNormal);
}
}
}
// beim aktivieren der form -> neu zeichnen void __fastcall TForm1::WMActivate(TMessage &Msg)
{
TForm::Dispatch(&Msg);
Perform(WM_NCPAINT, 0, 0);
}
// wenn fenster aktiv wird, neu zeichnen void __fastcall TForm1::WMNCActivate(TMessage &Msg)
{
TForm::Dispatch(&Msg);
Perform(WM_NCPAINT, 0, 0);
}
// wenn maus im formular bewegt wird, farbe der URL zurücksetzen void __fastcall TForm1::WMMouseMove(TMessage &Msg)
{
TForm::Dispatch(&Msg);
if (URLStateOver)
{
URLStateOver = false;
DrawURL(URLNormal);
}
}
// linke maustaste wurde im nonclient-bereich des formulares gedrückt
// (caption, frame, border, ...) void __fastcall TForm1::WMNCLButtonDown(TMessage &Msg)
{
TForm::Dispatch(&Msg);
if (Msg.WParam == HTCAPTION)
{
// link ausführen, wenn maus im bereich der URL if (MouseInURL(Msg.LParam))
ShellExecute(0, "open", URLString.c_str(), 0, 0, SW_SHOWNORMAL);
}
}
// zeichenfunktion für den nonclient-bereich des formulares void __fastcall TForm1::WMNCPaint(TMessage &Msg)
{
TForm::Dispatch(&Msg);
// text-attribute setzen
FormCanvas = new TCanvas();
FormCanvas->Handle = GetWindowDC(Handle);
// systemfont setzen
SetSystemFont(FormCanvas);
// farbe des textes setzen if (Active) FormCanvas->Font->Color = clCaptionText;
else FormCanvas->Font->Color = clInactiveCaptionText;
// breite des textes ermitteln int URLWidth = FormCanvas->TextWidth(URLString);
int CaptionWidth = FormCanvas->TextWidth(ACaption);
TRect WindowRect;
// rechteck des fensters holen
GetWindowRect(Handle, (LPRECT) &WindowRect);
int LeftSide = GetSystemMetrics(SM_CXSIZE) +
GetSystemMetrics(SM_CXBORDER) +
GetSystemMetrics(SM_CXFRAME);
TRect CaptionRect; // rechteck der verfügbaren caption
TRect OutputRect1; // rechteck des 1. caption-textes
TRect OutputRect2; // rechteck des 2. caption-textes
//---------------------------------------------------------------------------
// im HEADER
//---------------------------------------------------------------------------
private:
TCanvas *FormCanvas; // zeichenfläche des formulares
TRect URLRect; // rechteck der URL
int CaptionWidth; // breite der caption int URLWidth; // breite der URL
TColor URLNormal; // normale farbe der URL
TColor URLOver; // mouseover farbe der URL bool URLStateOver; // status der URL
AnsiString URLString; // die eigentliche URL
AnsiString ACaption; // anfangstext der caption
AnsiString ECaption; // endtext der caption (kann leer sein)
//---------------------------------------------------------------------------
// im QUELLCODE
//---------------------------------------------------------------------------
// funktion setzt den aktuelle systemfont für die caption void __fastcall TForm1::SetSystemFont(TCanvas *FCanvas)
{
LOGFONT FormFont;
NONCLIENTMETRICS NCM;
NCM.cbSize = sizeof(NONCLIENTMETRICS);
// den aktuellen Systemfont auslesen if (SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NCM, 0) != 0)
{
// Informationen über den aktuelle Font der Form holen
// -> Systemfont setzen if (GetObject(FCanvas->Font->Handle, sizeof(LOGFONT), &FormFont) != 0)
FormFont = NCM.lfCaptionFont;
// neuen (geänderten) Font auswählen und der Zeichenfläche zuweisen
FCanvas->Font->Handle = CreateFontIndirect(&FormFont);
}
}
// funktion prüft, ob sich die maus im rechteck der URL befindet bool __fastcall TForm1::MouseInURL(LPARAM lparam)
{
int LSpace = GetSystemMetrics(SM_CXBORDER) + GetSystemMetrics(SM_CXFRAME);
int TSpace = GetSystemMetrics(SM_CXSIZE);
// den text der URL zeichnen void __fastcall TForm1::DrawURL(TColor TextColor)
{
TCanvas *FCanvas = new TCanvas();
FCanvas->Handle = GetWindowDC(Handle);
// systemfont setzen
SetSystemFont(FCanvas);
FCanvas->Font->Color = TextColor;
// hintergrund nicht verarbeiten
SetBkMode(FCanvas->Handle, TRANSPARENT);
// testen ob sich die maus über dem URL-Rechteck befindet
// und wenn ja die farbe der URL ändern void __fastcall TForm1::WMNCHitTest(TMessage &Msg)
{
TForm::Dispatch(&Msg);
if (Msg.Result == HTCAPTION)
{
if (MouseInURL(Msg.LParam))
{
URLStateOver = true;
// url neu zeichnen (maus ist ausserhalb)
DrawURL(URLNormal);
}
}
}
// beim aktivieren der form -> neu zeichnen void __fastcall TForm1::WMActivate(TMessage &Msg)
{
TForm::Dispatch(&Msg);
Perform(WM_NCPAINT, 0, 0);
}
// wenn fenster aktiv wird, neu zeichnen void __fastcall TForm1::WMNCActivate(TMessage &Msg)
{
TForm::Dispatch(&Msg);
Perform(WM_NCPAINT, 0, 0);
}
// wenn maus im formular bewegt wird, farbe der URL zurücksetzen void __fastcall TForm1::WMMouseMove(TMessage &Msg)
{
TForm::Dispatch(&Msg);
if (URLStateOver)
{
URLStateOver = false;
DrawURL(URLNormal);
}
}
// linke maustaste wurde im nonclient-bereich des formulares gedrückt
// (caption, frame, border, ...) void __fastcall TForm1::WMNCLButtonDown(TMessage &Msg)
{
TForm::Dispatch(&Msg);
if (Msg.WParam == HTCAPTION)
{
// link ausführen, wenn maus im bereich der URL if (MouseInURL(Msg.LParam))
ShellExecute(0, "open", URLString.c_str(), 0, 0, SW_SHOWNORMAL);
}
}
// zeichenfunktion für den nonclient-bereich des formulares void __fastcall TForm1::WMNCPaint(TMessage &Msg)
{
TForm::Dispatch(&Msg);
// text-attribute setzen
FormCanvas = new TCanvas();
FormCanvas->Handle = GetWindowDC(Handle);
// systemfont setzen
SetSystemFont(FormCanvas);
// farbe des textes setzen if (Active) FormCanvas->Font->Color = clCaptionText;
else FormCanvas->Font->Color = clInactiveCaptionText;
// breite des textes ermitteln int URLWidth = FormCanvas->TextWidth(URLString);
int CaptionWidth = FormCanvas->TextWidth(ACaption);
TRect WindowRect;
// rechteck des fensters holen
GetWindowRect(Handle, (LPRECT) &WindowRect);
int LeftSide = GetSystemMetrics(SM_CXSIZE) +
GetSystemMetrics(SM_CXBORDER) +
GetSystemMetrics(SM_CXFRAME);
TRect CaptionRect; // rechteck der verfügbaren caption
TRect OutputRect1; // rechteck des 1. caption-textes
TRect OutputRect2; // rechteck des 2. caption-textes
// wieder alles freigeben
ReleaseDC(Handle, FormCanvas->Handle);
FormCanvas->Handle = 0;
// url zeichnen
DrawURL(URLNormal);
}
anmerkung:
ist für ein formular mit systemmenü, minimize und maximize button. bei anderen einstellungen müssen die rechtecke für caption und url angepasst werden.
viel spass damit...
[ Dieser Beitrag wurde am 12.07.2003 um 11:58 Uhr von Sunday editiert. ]
hab den code angepasst, an den jeweils aktuell gewählten systemfont für die caption. ebenso wir die caption jetzt deaktiviert dargestellt, wenn die anwendung den fokus verliert.
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum nicht antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.