Einzelnen Beitrag anzeigen

torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#117

Re: Benötige Hilfe beim Entwickeln einer Komponente

  Alt 9. Sep 2007, 17:11
Hallo Oki,

ich habe jetzt wieder mal mit dem Code etwas experimentiert und versucht...

Das Gute ist, dass der Border nun auch gezeichnet wird. Was allerdings nicht funktioniert und das verstehe ich leider nicht ganz, ist , dass der Gradient nicht mehr gezeichnet wird und auch das Bild nicht mehr gezeichnet wird. Dies passiert nur, wenn ich die Variante mit den abgerundeten Ecken wähle.

Folgender Code wird in dem Falle ausgeführt, wobei die Reihenfolge die gleiche ist und myRect des Canvas durch R aus deinem Code ersetzt wurde.

Delphi-Quellcode:
  if CornerUse and (CornerWidth > 0) then begin
    R := GetClientRect;
    FullRgn := CreateRectRgn(0, 0, Width, Height);
    CombineRgn( FullRgn, FullRgn, FullRgn, RGN_DIFF );

    // alle sichtbaren Bereiche einblenden
    Region := CreateRoundRectRgn(0, 0, R.Right, R.Bottom, FCornerWidth, FCornerWidth);
    CombineRgn( FullRgn, FullRgn, Region, RGN_OR );
    DeleteObject(Region);

    // alles Kombiniert und fertig
    SetWindowRgn(Handle, FullRgn, TRUE);

    R := GetClientRect;
    //jetzt bitte Gradient zeichnen
    if PaintGradient then
      DrawGradient(Canvas, BgColorFrom, BgColorTo, R, GradientDirection);

    //wenn bild vorhanden bild zeichnen
    if Picture <> nil then
      if PictureStretched then
        Canvas.StretchDraw(R,Picture.Graphic)
      else
        Canvas.Draw(0,0,Picture.Graphic);

    //bitte den border zeichnen
    if BorderWidth > 1 then
      Canvas.RoundRect(0 + (BorderWidth div 2), 0 + (BorderWidth div 2), width - (BorderWidth div 2),height - (BorderWidth div 2),FCornerWidth,FCornerWidth)
    else
      Canvas.RoundRect(0, 0, width-1, height-1,FCornerWidth,FCornerWidth);

    //und zum schluss noch den text drauf
    if FText <> 'then
      DrawText(Canvas.Handle, PChar(FText), -1, TextRect, myAlignment);
  end else DoVisible;
Der Border, wenn auch etwas unsauber ist mit abgerundeten Ecken zu sehen. Der Text ist auch auf dem Control. Es fehlen der Gradient, respektive das Bild. Ist kann ja immer nur eines von beiden zu sehen sein. Es wird aber komischerweise, wenn der Gradient auf True steht nur komplett mit schwarz oder der Farbe aus BGColorTo gefüllt und richtigerweise, wenn PaintGradient auf false steht, mit BgColorFrom gefüllt. Das heisst, dass der Gradient nicht korrekt ausgeführt wird. Ich habe, nur um sicher zu gehen, nochmals R := GetClientRect; ausgeführt, was aber nichts brachte.

Ich vermute mal, dass der Canvas sich irgendwie verändert hat, nach der Modifikation, was zur Folge hat, dass man nicht mehr so einfach ohne weiteres wie vorher drauf rummalen kann. Muss ich hierbei wieder etwas besonderes beachten?

Interessant ist auch, dass der Border bei den abgerundeten Ecken links und rechts oben "ausgefranst" aussieht, wenn ich PaintGradient auf false stehen habe. Ansonsten bin ich einigermaßen zufrieden und werde hier noch versuchen das Beste rauszuholen...Ein Bild hängt an...
Miniaturansicht angehängter Grafiken
gradients_102.png  
Danke
Tom
  Mit Zitat antworten Zitat