AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DrawFocusRect "rund" darstellen

Ein Thema von Alex_ITA01 · begonnen am 23. Sep 2004 · letzter Beitrag vom 24. Sep 2004
Antwort Antwort
Seite 1 von 2  1 2      
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#1

DrawFocusRect "rund" darstellen

  Alt 23. Sep 2004, 14:47
Hallo erstmal,
wie jeder weiß (der sich mit Canvas auskennt ) 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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#2

Re: DrawFocusRect "rund" darstellen

  Alt 24. Sep 2004, 08:30
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#3

Re: DrawFocusRect "rund" darstellen

  Alt 24. Sep 2004, 09:16
naja, überschreibe halt die funktion und zeichne für dein control ne eigene focus linie?
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#4

Re: DrawFocusRect "rund" darstellen

  Alt 24. Sep 2004, 09:19
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#5

Re: DrawFocusRect "rund" darstellen

  Alt 24. Sep 2004, 09:23
soweit ich weiß, kannst du mit
Pen.Style
auf ne gesrichelte linie umschalten

und
Canvas.Ellipse
kannst was ovales zeichnen
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#6

Re: DrawFocusRect "rund" darstellen

  Alt 24. Sep 2004, 09:25
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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
Benutzerbild von Shaman
Shaman

Registriert seit: 2. Nov 2003
Ort: Schweiz
407 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: DrawFocusRect "rund" darstellen

  Alt 24. Sep 2004, 11:00
Hoi

Du kannst dann noch Pen.Mode:= pnNot machen, damit es wie DrawFocusRect immer die invertierte Farbe vom Hintergrund hat.

Gruss
Shaman
Daniel Pauli
Looking for answers from the great beyond
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#8

Re: DrawFocusRect "rund" darstellen

  Alt 24. Sep 2004, 12:16
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.
  Mit Zitat antworten Zitat
Alex_ITA01

Registriert seit: 22. Sep 2003
1.115 Beiträge
 
Delphi 12 Athens
 
#9

Re: DrawFocusRect "rund" darstellen

  Alt 24. Sep 2004, 12:24
@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
Let's fetz sprach der Frosch und sprang in den Mixer
  Mit Zitat antworten Zitat
w3seek
(Gast)

n/a Beiträge
 
#10

Re: DrawFocusRect "rund" darstellen

  Alt 24. Sep 2004, 12:34
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:45 Uhr.
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