Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: FAQ - C++ Builder (VCL/CLX) ::  Forms - auf der Captionbar Maus-Events abfangen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Tillmann David
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.07.2001
Beiträge: 473
Beitrag Tillmann David Mitglied 12:33:00 08.07.2003   Titel:   Forms - auf der Captionbar Maus-Events abfangen            Zitieren

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. ]

_________________
Besucht doch meine neu designte Homepage: http://www.tillmann-david.de


Zuletzt bearbeitet von Jansen am 19:59:59 04.08.2003, insgesamt 3-mal bearbeitet
Werbeunterbrechung
Sunday
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.04.2000
Beiträge: 2413
Beitrag Sunday Mitglied 12:46:00 08.07.2003   Titel:              Zitieren

verarbeitet das ereignis WM_NCLBUTTONDOWN.

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// im header der form
void __fastcall WMNCLButtonDown(TMessage &Msg);

BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TMessage, WMNCLButtonDown)
END_MESSAGE_MAP(TForm)


// im code
void __fastcall TForm1::WMNCLButtonDown(TMessage &Msg)  
{
  TForm::Dispatch(&Msg);

  if (Msg.WParam == HTCAPTION)
    ShowMessage("CAPTION KLICKED");
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// im header der form
void __fastcall WMNCLButtonDown(TMessage &Msg);

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TMessage, WMNCLButtonDown)
END_MESSAGE_MAP(TForm)


// im code
void __fastcall TForm1::WMNCLButtonDown(TMessage &Msg)
{
TForm::Dispatch(&Msg);

if (Msg.WParam == HTCAPTION)
ShowMessage("CAPTION KLICKED");
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// im header der form
void __fastcall WMNCLButtonDown(TMessage &Msg);

BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TMessage, WMNCLButtonDown)
END_MESSAGE_MAP(TForm)


// im code
void __fastcall TForm1::WMNCLButtonDown(TMessage &Msg)  
{
  TForm::Dispatch(&Msg);

  if (Msg.WParam == HTCAPTION)
    ShowMessage("CAPTION KLICKED");
}


p.s. währe in zukunft ohne H

[ Dieser Beitrag wurde am 08.07.2003 um 12:48 Uhr von Sunday editiert. ]

_________________
http://www.ricosonntag.de
Tillmann David
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.07.2001
Beiträge: 473
Beitrag Tillmann David Mitglied 12:55:00 08.07.2003   Titel:              Zitieren

Danke!
Hab den Fehler geändert. ;)

Und wie definierte ich das jetzt, wenn ich einen Titel habe und nach dem titel einen blauen link haben will, also nur das der link das onevent hat?

Bsp der Titelleiste:
Programm 1.2 (http://www.programm.de)

Dabei soll aber http://www.programm.de nur das onevant haben, das muss man mit koordinaten machen->nur wie. :(

Danke schonmal!!!

_________________
Besucht doch meine neu designte Homepage: http://www.tillmann-david.de
Jansen
Moderator

Benutzerprofil
Anmeldungsdatum: 30.04.2001
Beiträge: 14520
Beitrag Jansen Moderator 14:06:00 08.07.2003   Titel:              Zitieren

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.

_________________
Jansen (Mod nur im BCB-Forum)
Sunday
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.04.2000
Beiträge: 2413
Beitrag Sunday Mitglied 16:04:00 08.07.2003   Titel:              Zitieren

siehe nächsten post von mir...

[ Dieser Beitrag wurde am 11.07.2003 um 16:51 Uhr von Sunday editiert. ]

_________________
http://www.ricosonntag.de
Tillmann David
Unregistrierter




Beitrag Tillmann David Unregistrierter 16:07:00 08.07.2003   Titel:              Zitieren

Cool, genau das hab ich gesucht, danke!!!!!!!
Sunday
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.04.2000
Beiträge: 2413
Beitrag Sunday Mitglied 16:55:00 11.07.2003   Titel:              Zitieren

hier mal eine ganz neue version, zum darstellen einer URL im Caption einer Form.
ist ja vielleicht mal was für die FAQ?

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
//---------------------------------------------------------------------------
// 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)

    void __fastcall SetSystemFont(TCanvas *FCanvas);
    void __fastcall DrawURL(TColor TextColor);
    bool __fastcall MouseInURL(LPARAM lparam);

    // ereignis methoden
    void __fastcall WMNCLButtonDown(TMessage &Msg);
    void __fastcall WMNCPaint(TMessage &Msg);
    void __fastcall WMNCHitTest(TMessage &Msg);
    void __fastcall WMNCActivate(TMessage &Msg);
    void __fastcall WMMouseMove(TMessage &Msg);
    void __fastcall WMActivate(TMessage &Msg);

    // folgende ereignisse abfangen
    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TMessage, WMNCLButtonDown)
      MESSAGE_HANDLER(WM_NCPAINT,       TMessage, WMNCPaint)
      MESSAGE_HANDLER(WM_NCHITTEST,     TMessage, WMNCHitTest)
      MESSAGE_HANDLER(WM_NCACTIVATE,    TMessage, WMNCActivate)
      MESSAGE_HANDLER(WM_MOUSEMOVE,     TMessage, WMMouseMove)
      MESSAGE_HANDLER(WM_ACTIVATE,      TMessage, WMActivate)
    END_MESSAGE_MAP(TForm)


//---------------------------------------------------------------------------
// im QUELLCODE
//---------------------------------------------------------------------------


__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
  URLString = "http://www.ricosonntag.de";
  ACaption  = "URL-Caption-Klick-Test [";
  ECaption  = "]";

  Caption   = "";

  URLOver   = clRed;
  URLNormal = clLime;
}

// 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);

  POINTS MPoints    = MAKEPOINTS(lparam);
  TPoint MousePoint = TPoint(MPoints.x + LSpace, (MPoints.y + TSpace));
  MousePoint        = ScreenToClient(MousePoint);

  return PtInRect(&URLRect, MousePoint);
}

// 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);

  // url zeichnen
  DrawText(FCanvas->Handle, URLString.c_str(), -1, &URLRect, DT_SINGLELINE | DT_VCENTER | DT_LEFT);

  ReleaseDC(Handle, FCanvas->Handle);
  FCanvas->Handle = 0;

  delete FCanvas;
}

// 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;

      // mauszeiger verändern
      ::SetCursor(Screen->Cursors[crHandPoint]);

      // url neu zeichnen
      DrawURL(URLOver);
    }
    else
    {
      URLStateOver = false;

      // 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

  // caption-rechteck berechnen

  CaptionRect.Left   = LeftSide;
  CaptionRect.Top    = GetSystemMetrics(SM_CYFRAME); // + 1;
  CaptionRect.Right  = WindowRect.Right - WindowRect.Left - (LeftSide * 3) - GetSystemMetrics(SM_CXFRAME);
  CaptionRect.Bottom = CaptionRect.Top + GetSystemMetrics(SM_CXSIZE) - 1;

  // rechteck der url berechnen
  URLRect.Left       = CaptionRect.Left + CaptionWidth;
  URLRect.Top        = CaptionRect.Top;
  URLRect.Right      = URLRect.Left + URLWidth;
  URLRect.Bottom     = CaptionRect.Bottom;

  // ausgaberechteck für 1. captiontext
  OutputRect1.Left   = CaptionRect.Left;
  OutputRect1.Right  = CaptionRect.Left + CaptionWidth;
  OutputRect1.Top    = CaptionRect.Top;
  OutputRect1.Bottom = CaptionRect.Bottom;

  // ausgaberechteck für 2. captiontext
  OutputRect2.Left   = CaptionRect.Left + CaptionWidth + URLWidth;
  OutputRect2.Right  = CaptionRect.Right;
  OutputRect2.Top    = CaptionRect.Top;
  OutputRect2.Bottom = CaptionRect.Bottom;

  // hintergrund nicht verarbeiten
  SetBkMode(FormCanvas->Handle, TRANSPARENT);

  // text zeichnen
  DrawText(FormCanvas->Handle, ACaption.c_str(), -1, &OutputRect1, DT_SINGLELINE | DT_VCENTER | DT_LEFT);
  DrawText(FormCanvas->Handle, ECaption.c_str(), -1, &OutputRect2, DT_SINGLELINE | DT_VCENTER | DT_LEFT);

  // wieder alles freigeben
  ReleaseDC(Handle, FormCanvas->Handle);
  FormCanvas->Handle = 0;

  // url zeichnen
  DrawURL(URLNormal);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
//---------------------------------------------------------------------------
// 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)

void __fastcall SetSystemFont(TCanvas *FCanvas);
void __fastcall DrawURL(TColor TextColor);
bool __fastcall MouseInURL(LPARAM lparam);

// ereignis methoden
void __fastcall WMNCLButtonDown(TMessage &Msg);
void __fastcall WMNCPaint(TMessage &Msg);
void __fastcall WMNCHitTest(TMessage &Msg);
void __fastcall WMNCActivate(TMessage &Msg);
void __fastcall WMMouseMove(TMessage &Msg);
void __fastcall WMActivate(TMessage &Msg);

// folgende ereignisse abfangen
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TMessage, WMNCLButtonDown)
MESSAGE_HANDLER(WM_NCPAINT, TMessage, WMNCPaint)
MESSAGE_HANDLER(WM_NCHITTEST, TMessage, WMNCHitTest)
MESSAGE_HANDLER(WM_NCACTIVATE, TMessage, WMNCActivate)
MESSAGE_HANDLER(WM_MOUSEMOVE, TMessage, WMMouseMove)
MESSAGE_HANDLER(WM_ACTIVATE, TMessage, WMActivate)
END_MESSAGE_MAP(TForm)


//---------------------------------------------------------------------------
// im QUELLCODE
//---------------------------------------------------------------------------


__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
URLString = "http://www.ricosonntag.de";
ACaption = "URL-Caption-Klick-Test [";
ECaption = "]";

Caption = "";

URLOver = clRed;
URLNormal = clLime;
}

// 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);

POINTS MPoints = MAKEPOINTS(lparam);
TPoint MousePoint = TPoint(MPoints.x + LSpace, (MPoints.y + TSpace));
MousePoint = ScreenToClient(MousePoint);

return PtInRect(&URLRect, MousePoint);
}

// 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);

// url zeichnen
DrawText(FCanvas->Handle, URLString.c_str(), -1, &URLRect, DT_SINGLELINE | DT_VCENTER | DT_LEFT);

ReleaseDC(Handle, FCanvas->Handle);
FCanvas->Handle = 0;

delete FCanvas;
}

// 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;

// mauszeiger verändern
::SetCursor(Screen->Cursors[crHandPoint]);

// url neu zeichnen
DrawURL(URLOver);
}
else
{
URLStateOver = false;

// 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

// caption-rechteck berechnen

CaptionRect.Left = LeftSide;
CaptionRect.Top = GetSystemMetrics(SM_CYFRAME); // + 1;
CaptionRect.Right = WindowRect.Right - WindowRect.Left - (LeftSide * 3) - GetSystemMetrics(SM_CXFRAME);
CaptionRect.Bottom = CaptionRect.Top + GetSystemMetrics(SM_CXSIZE) - 1;

// rechteck der url berechnen
URLRect.Left = CaptionRect.Left + CaptionWidth;
URLRect.Top = CaptionRect.Top;
URLRect.Right = URLRect.Left + URLWidth;
URLRect.Bottom = CaptionRect.Bottom;

// ausgaberechteck für 1. captiontext
OutputRect1.Left = CaptionRect.Left;
OutputRect1.Right = CaptionRect.Left + CaptionWidth;
OutputRect1.Top = CaptionRect.Top;
OutputRect1.Bottom = CaptionRect.Bottom;

// ausgaberechteck für 2. captiontext
OutputRect2.Left = CaptionRect.Left + CaptionWidth + URLWidth;
OutputRect2.Right = CaptionRect.Right;
OutputRect2.Top = CaptionRect.Top;
OutputRect2.Bottom = CaptionRect.Bottom;

// hintergrund nicht verarbeiten
SetBkMode(FormCanvas->Handle, TRANSPARENT);

// text zeichnen
DrawText(FormCanvas->Handle, ACaption.c_str(), -1, &OutputRect1, DT_SINGLELINE | DT_VCENTER | DT_LEFT);
DrawText(FormCanvas->Handle, ECaption.c_str(), -1, &OutputRect2, DT_SINGLELINE | DT_VCENTER | DT_LEFT);

// wieder alles freigeben
ReleaseDC(Handle, FormCanvas->Handle);
FormCanvas->Handle = 0;

// url zeichnen
DrawURL(URLNormal);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
//---------------------------------------------------------------------------
// 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)

    void __fastcall SetSystemFont(TCanvas *FCanvas);
    void __fastcall DrawURL(TColor TextColor);
    bool __fastcall MouseInURL(LPARAM lparam);

    // ereignis methoden
    void __fastcall WMNCLButtonDown(TMessage &Msg);
    void __fastcall WMNCPaint(TMessage &Msg);
    void __fastcall WMNCHitTest(TMessage &Msg);
    void __fastcall WMNCActivate(TMessage &Msg);
    void __fastcall WMMouseMove(TMessage &Msg);
    void __fastcall WMActivate(TMessage &Msg);

    // folgende ereignisse abfangen
    BEGIN_MESSAGE_MAP
      MESSAGE_HANDLER(WM_NCLBUTTONDOWN, TMessage, WMNCLButtonDown)
      MESSAGE_HANDLER(WM_NCPAINT,       TMessage, WMNCPaint)
      MESSAGE_HANDLER(WM_NCHITTEST,     TMessage, WMNCHitTest)
      MESSAGE_HANDLER(WM_NCACTIVATE,    TMessage, WMNCActivate)
      MESSAGE_HANDLER(WM_MOUSEMOVE,     TMessage, WMMouseMove)
      MESSAGE_HANDLER(WM_ACTIVATE,      TMessage, WMActivate)
    END_MESSAGE_MAP(TForm)


//---------------------------------------------------------------------------
// im QUELLCODE
//---------------------------------------------------------------------------


__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
  URLString = "http://www.ricosonntag.de";
  ACaption  = "URL-Caption-Klick-Test [";
  ECaption  = "]";

  Caption   = "";

  URLOver   = clRed;
  URLNormal = clLime;
}

// 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);

  POINTS MPoints    = MAKEPOINTS(lparam);
  TPoint MousePoint = TPoint(MPoints.x + LSpace, (MPoints.y + TSpace));
  MousePoint        = ScreenToClient(MousePoint);

  return PtInRect(&URLRect, MousePoint);
}

// 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);

  // url zeichnen
  DrawText(FCanvas->Handle, URLString.c_str(), -1, &URLRect, DT_SINGLELINE | DT_VCENTER | DT_LEFT);

  ReleaseDC(Handle, FCanvas->Handle);
  FCanvas->Handle = 0;

  delete FCanvas;
}

// 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;

      // mauszeiger verändern
      ::SetCursor(Screen->Cursors[crHandPoint]);

      // url neu zeichnen
      DrawURL(URLOver);
    }
    else
    {
      URLStateOver = false;

      // 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

  // caption-rechteck berechnen

  CaptionRect.Left   = LeftSide;
  CaptionRect.Top    = GetSystemMetrics(SM_CYFRAME); // + 1;
  CaptionRect.Right  = WindowRect.Right - WindowRect.Left - (LeftSide * 3) - GetSystemMetrics(SM_CXFRAME);
  CaptionRect.Bottom = CaptionRect.Top + GetSystemMetrics(SM_CXSIZE) - 1;

  // rechteck der url berechnen
  URLRect.Left       = CaptionRect.Left + CaptionWidth;
  URLRect.Top        = CaptionRect.Top;
  URLRect.Right      = URLRect.Left + URLWidth;
  URLRect.Bottom     = CaptionRect.Bottom;

  // ausgaberechteck für 1. captiontext
  OutputRect1.Left   = CaptionRect.Left;
  OutputRect1.Right  = CaptionRect.Left + CaptionWidth;
  OutputRect1.Top    = CaptionRect.Top;
  OutputRect1.Bottom = CaptionRect.Bottom;

  // ausgaberechteck für 2. captiontext
  OutputRect2.Left   = CaptionRect.Left + CaptionWidth + URLWidth;
  OutputRect2.Right  = CaptionRect.Right;
  OutputRect2.Top    = CaptionRect.Top;
  OutputRect2.Bottom = CaptionRect.Bottom;

  // hintergrund nicht verarbeiten
  SetBkMode(FormCanvas->Handle, TRANSPARENT);

  // text zeichnen
  DrawText(FormCanvas->Handle, ACaption.c_str(), -1, &OutputRect1, DT_SINGLELINE | DT_VCENTER | DT_LEFT);
  DrawText(FormCanvas->Handle, ECaption.c_str(), -1, &OutputRect2, DT_SINGLELINE | DT_VCENTER | DT_LEFT);

  // 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. ]

_________________
http://www.ricosonntag.de
Jansen
Moderator

Benutzerprofil
Anmeldungsdatum: 30.04.2001
Beiträge: 14520
Beitrag Jansen Moderator 18:51:00 11.07.2003   Titel:              Zitieren

Hah, du willst doch nur deine Website promoten! ;)

Im Ernst, eine schöne Lösung. Eventuell könnte man die Schriftgrösse noch automatisch an die Systemschrift anpassen?

_________________
Jansen (Mod nur im BCB-Forum)
Sunday
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.04.2000
Beiträge: 2413
Beitrag Sunday Mitglied 11:59:00 12.07.2003   Titel:              Zitieren

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.

_________________
http://www.ricosonntag.de
C/C++ Forum :: FAQ - C++ Builder (VCL/CLX) ::  Forms - auf der Captionbar Maus-Events abfangen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

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.