![]() |
DrawFocusRect "rund" darstellen
Hallo erstmal,
wie jeder weiß (der sich mit Canvas auskennt :mrgreen: ) gibt es dort die Funktion DrawFocusRect.Diese zeichnet mir die "Fokuslinien" wenn eine Komponente den Fokus erhält.Nun möchte ich gerne, die Fukoslinien nicht viereckig darstellen sondern rund.Weiß einer wie das geht? MFG Alex |
Re: DrawFocusRect "rund" darstellen
moin moin...
hat echt keiner eine Idee, wie ich um eine runde Komponente auch ein runden Fokus zeichne? @Himitsu : du kennst dich doch gut mit Grafikbearbeitung/verarbeitung aus... Gibts da keine Möglichkeit? MFG Alex |
Re: DrawFocusRect "rund" darstellen
naja, überschreibe halt die funktion und zeichne für dein control ne eigene focus linie?
|
Re: DrawFocusRect "rund" darstellen
soweit war ich in gedanken ja auch schon, nur wie zeichnet man gestrichelte linien und das auch noch rund? Ich bin nicht so der perfekte auskenner mit den ganzen Canvas-Funktionen (nutze nur die üblichen MoveTo,LineTo usw...)
MFG Alex |
Re: DrawFocusRect "rund" darstellen
soweit ich weiß, kannst du mit
Pen.Style auf ne gesrichelte linie umschalten und Canvas.Ellipse kannst was ovales zeichnen |
Re: DrawFocusRect "rund" darstellen
Das Problem ist ja, das Canvas.DrawFocusRect eine Funktion aus der Windows.pas aufruft und diese widerrum nur auf die user32.dll zugreift
Delphi-Quellcode:
deswegen weiß ich auch nicht wie ich die gestrichelten Linien selber zeichne
{Windows.pas}
function DrawFocusRect; external user32 name 'DrawFocusRect'; Alex ich probiers mal mit Pen.Style und Canvas.Ellipse Danke |
Re: DrawFocusRect "rund" darstellen
Hoi
Du kannst dann noch Pen.Mode:= pnNot machen, damit es wie DrawFocusRect immer die invertierte Farbe vom Hintergrund hat. Gruss Shaman |
Re: DrawFocusRect "rund" darstellen
geht ganz einfach:
1. Erstell eine runde region nach deinen wuenschen 2. erstell eine patterned brush mit dem muster 3. Selektiere die Region und die Brush in den DC 4. verwende PatBlt um die Region mit dem Muster zu zeichnen 5. Mach das Selektieren rueckgaengig 6. loesch die erstellten objekte um keine GDI leaks zu produzieren wenn du willst kann ich dir schnell den Source Code dazu schreiben. |
Re: DrawFocusRect "rund" darstellen
@w3seek
danke, dass wäre echt super.Ich habe ein runden Button programmiert und will eben jetzt wenn er den Fokus erhält ein Fokusrahmen darum zeichnen.Wäre echt super wenn du mir da ein Code schicken könntest... MFG Alex |
Re: DrawFocusRect "rund" darstellen
ok, hab mich grad dran gemacht, hier ist er:
Delphi-Quellcode:
function DrawFocusRgn(hDC: HDC; hRgn: HRGN): Boolean;
var hPatternBmp: HBITMAP; hPatternBrush: HBRUSH; hOldBrush, hOldRgn: HGDIOBJ; rc: TRect; const Pattern: array[0..3] of Cardinal = ($5555AAAA, $5555AAAA, $5555AAAA, $5555AAAA); begin Result := false; hPatternBmp := CreateBitmap(8, 8, 1, 1, @Pattern[0]); if hPatternBmp <> 0 then begin GetRgnBox(hRgn, rc); hPatternBrush := CreatePatternBrush(hPatternBmp); if hPatternBrush <> 0 then begin hOldBrush := SelectObject(hDC, hPatternBrush); hOldRgn := SelectObject(hDC, hRgn); Result := PatBlt(hDC, rc.Left, rc.Top, rc.Right - rc.Left, rc.Bottom - rc.Top, PATINVERT); SelectObject(hDC, hOldRgn); SelectObject(hDC, hOldBrush); DeleteObject(hPatternBrush); end; DeleteObject(hPatternBmp); end; end; function DrawFocusRoundRect(hDC: HDC; nLeftRect, nTopRect, nRightRect, nBottomRect: Integer; nWidthEllipse, nHeightEllipse: Integer; nBorderWidth, nBorderHeight: Integer): Boolean; var hRgnBorder, hRgnInner: HRGN; cmbResult: Integer; begin Result := false; hRgnBorder := CreateRoundRectRgn(nLeftRect, nTopRect, nRightRect, nBottomRect, nWidthEllipse, nHeightEllipse); if hRgnBorder <> 0 then begin if ((nRightRect - nLeftRect > 2 * nBorderWidth) and (nBottomRect - nTopRect > 2 * nBorderHeight)) then begin hRgnInner := CreateRoundRectRgn(nLeftRect + nBorderWidth, nTopRect + nBorderHeight, nRightRect - nBorderWidth, nBottomRect - nBorderHeight, nWidthEllipse, nHeightEllipse); if hRgnInner <> 0 then begin cmbResult := CombineRgn(hRgnBorder, hRgnBorder, hRgnInner, RGN_DIFF); DeleteObject(hRgnInner); if cmbResult = ERROR then begin DeleteObject(hRgnBorder); Exit; end; end else begin DeleteObject(hRgnBorder); Exit; end; end; Result := DrawFocusRgn(hDC, hRgnBorder); DeleteObject(hRgnBorder); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz