Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DrawFrameControl (https://www.delphipraxis.net/133529-drawframecontrol.html)

markbolten 4. Mai 2009 08:23


DrawFrameControl
 
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

Muetze1 4. Mai 2009 09:08

Re: DrawFrameControl
 
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...

markbolten 4. Mai 2009 09:26

Re: DrawFrameControl
 
Zitat:

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 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