AGB  ·  Datenschutz  ·  Impressum  







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

DrawFrameControl

Ein Thema von markbolten · begonnen am 4. Mai 2009 · letzter Beitrag vom 4. Mai 2009
Antwort Antwort
markbolten

Registriert seit: 5. Jun 2005
25 Beiträge
 
#1

DrawFrameControl

  Alt 4. Mai 2009, 08:23
Hi,
ich erstelle eine eigene Edit Komponente, in der u.a. ein Button angezeigt werden kann. Man kann die Farbe des Button ändern . Dabei tritt das Problem auf, das der Rand des Buttons, erzeugt durch DrawFrameControl, immer noch die Standardfarbe hat und nicht die Benutzerfarbe .

Delphi-Quellcode:
procedure TAdvEdit.WMPaint(var Msg: TWMPaint);
var
  DC: HDC;
  Fnt: HFont;
  point : tpoint ;
begin
  inherited;
  if FExtButton.FshowButton then
  begin
    if (not Assigned(FCanvas)) then
    begin
      FCanvas := TControlCanvas.Create;
      FCanvas.Control := Self;
    end;
    DC:=GetDC(Handle);
    FCanvas.Handle := DC;
    Fnt:=FExtButton.FbtnFont.Handle;
    SelectObject(DC,Fnt);
// SetBkMode(DC,TRANSPARENT);
    SetBkMode(DC, OPAQUE);
    CreateSolidBrush(FExtButton.FbtnColor );
    SetBkColor(DC, FExtButton.FbtnColor );
    FExtButton.BtnRect:=ClientRect;
    FExtButton.BtnRect.Left:=FExtButton.BtnRect.Right-FExtButton.fButtonWidth;
    if FExtButton.fPressed and FExtButton.fInButton then
    begin
      DrawFrameControl(DC,FExtButton.BtnRect,DFC_BUTTON,DFCS_BUTTONPUSH+
       DFCS_PUSHED);
    end
    else
    begin
      DrawFrameControl(DC,FExtButton.BtnRect,DFC_BUTTON,DFCS_BUTTONPUSH);
    end;
    if (Assigned(FExtButton.Fglyph) and (FExtButton.FGlyphindex in [0..
     FExtButton.FGlyph.Count-1])) then
    begin
      SetBkMode(DC,TRANSPARENT);
      point.X := ((FExtButton.fButtonWidth-FExtButton.
       FGlyph.width) div 2)+1;
      point.Y := (FExtButton.BtnRect.Bottom -FExtButton.BtnRect.Top-FExtButton.
       FGlyph.height) div 2;
      FExtButton.FGlyph.Draw(Fcanvas,FExtButton.BtnRect.Left+point.X ,FExtButton.
       BtnRect.Top +point.y,FExtButton.FGlyphIndex);
    end
    else
    begin
      DrawText(DC,PChar(FExtButton.fBtnCaption),Length(FExtButton.fBtnCaption),
       FExtButton.BtnRect,DT_CENTER or DT_SINGLELINE or DT_VCENTER);
    end;
    FCanvas.Handle := 0;
// DeleteObject(Fnt);
// ReleaseDC(Handle,DC);
  end;
end;
Was habe ich nicht beachtet
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: DrawFrameControl

  Alt 4. Mai 2009, 09:08
Alles richtig. DrawFrameControl() der WinAPI beachtet die Pen/Brush Eigenschaften nicht sondern nutzen fest die Farbkonstanten bzw. deren aktuellen Farben anhand des aktuellen Farbschemas. clBtnFace, clBtnShadow, etc.

Warum bastelst du eigentlich mit dem DC rum? Kannst du doch alles direkt von der VCL nutzen. SetBkMode(xx, OPAQUE) ist entsprechend Canvas.Brush.Style := bsClear und den DC erhälst du mit Canvas.Handle. Den Code Abschnitt kannst du dir deutlich vereinfachen...
  Mit Zitat antworten Zitat
markbolten

Registriert seit: 5. Jun 2005
25 Beiträge
 
#3

Re: DrawFrameControl

  Alt 4. Mai 2009, 09:26
Zitat von Muetze1:
Alles richtig. DrawFrameControl() der WinAPI beachtet die Pen/Brush Eigenschaften nicht sondern nutzen fest die Farbkonstanten bzw. deren aktuellen Farben anhand des aktuellen Farbschemas. clBtnFace, clBtnShadow, etc.
Danke
  Mit Zitat antworten Zitat
Antwort Antwort


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 18:56 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