Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DrawFocusRect "rund" darstellen (https://www.delphipraxis.net/30318-drawfocusrect-rund-darstellen.html)

Alex_ITA01 23. Sep 2004 13:47


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

Alex_ITA01 24. Sep 2004 07:30

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

mumu 24. Sep 2004 08:16

Re: DrawFocusRect "rund" darstellen
 
naja, überschreibe halt die funktion und zeichne für dein control ne eigene focus linie?

Alex_ITA01 24. Sep 2004 08:19

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

mumu 24. Sep 2004 08:23

Re: DrawFocusRect "rund" darstellen
 
soweit ich weiß, kannst du mit
Pen.Style
auf ne gesrichelte linie umschalten

und
Canvas.Ellipse
kannst was ovales zeichnen

Alex_ITA01 24. Sep 2004 08:25

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:
{Windows.pas}
function DrawFocusRect; external user32 name 'DrawFocusRect';
deswegen weiß ich auch nicht wie ich die gestrichelten Linien selber zeichne
Alex

ich probiers mal mit Pen.Style und Canvas.Ellipse

Danke

Shaman 24. Sep 2004 10:00

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

w3seek 24. Sep 2004 11:16

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.

Alex_ITA01 24. Sep 2004 11:24

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

w3seek 24. Sep 2004 11:34

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 21:36 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz