Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi abgeleitete Trackbar mit Bitmaps (https://www.delphipraxis.net/79050-abgeleitete-trackbar-mit-bitmaps.html)

bluescreen25 15. Okt 2006 14:25


abgeleitete Trackbar mit Bitmaps
 
Habe heute versucht eine Ableitung der Trackbar für die Einbindung von Bitmaps zu erstellen.
Die Grafik soll durch eine eigene ersetzt werden.

Vielleicht schaut jemand mal darüber:
Delphi-Quellcode:
unit ImgTrb;

interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, ComCtrls, StdCtrls, QGraphics;

type
  TTBItem = (tbThumb, tbChannel, tbTicks);
  TTrackBar2 = class(TTrackBar)
  private
    fBackBmp : TBitmap;
    fSliderBmp : TBitmap;
    fTransparentColor : TColor;
    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
    function DrawItem(aCanvas: TCanvas;aRect: TRect; aItem: TTBItem): Boolean;

  protected
    {..}
  public
    {..}
  published
    {..}
  end;

implementation


function TTrackBar2.DrawItem(aCanvas: TCanvas;aRect: TRect; aItem: TTBItem): Boolean;
begin
  result := false;
  case aItem of
    tbChannel:
      begin
        if (not fBackBmp.Empty) and (fBackBmp.Width > 0) and(fBackBmp.Height > 0) then begin
          TransparentBlt(aCanvas.Handle, aRect.Left, aRect.Top,(aRect.Right - aRect.Left),
                         (aRect.Bottom - aRect.Top), //<---- Fehlermeldung Inkompatible Typen !
                         fBackBmp.Canvas.Handle, 0, 0, fBackBmp.Width, fBackBmp.Height,
                         fTransparentColor);
          result := true;
        end;
      end;
    tbThumb:
      begin
        if (not fSliderBmp.Empty) and (fSliderBmp.Width > 0) and(fSliderBmp.Height > 0) then begin
          TransparentBlt(aCanvas.Handle, aRect.Left, aRect.Top,(aRect.Right - aRect.Left),
                         (aRect.Bottom - aRect.Top),
                         fSliderBmp.Canvas.Handle, 0, 0, fSliderBmp.Width, fSliderBmp.Height,
                         fTransparentColor);
          result := true;
        end;
      end;
  end;
end;




procedure TTrackBar2.CNNotify(var Message: TWMNotify);
var
  lRect           : TRect;
  lCanvas         : TCanvas;
  lIsDrawn        : Boolean;

begin
  if (Message.NMHdr^.code = NM_CUSTOMDRAW) then begin
    with PNMCustomDraw(Message.NMHdr)^ do begin
      (* Default-Result für Standard-Zeichnen setzen *)
      Message.Result := CDRF_DODEFAULT;

      case dwDrawStage of
        CDDS_PREPAINT:
          begin
            (* wichtig !, damit künftig ItemDraw-Messages gesendet werden *)
            Message.Result := CDRF_NOTIFYITEMDRAW or CDRF_NOTIFYPOSTPAINT;
          end;

        CDDS_ITEMPREPAINT:
          begin
            lCanvas := TCanvas.Create;
            lCanvas.Handle := hdc;
            lRect := rc;
            try
              try
                lIsDrawn := false;
                case dwItemSpec of
                  (* Trackbar-Teile selbst zeichnen *)
                  TBCD_THUMB  : lIsDrawn := DrawItem(lCanvas, lRect, tbThumb);
                  TBCD_TICS   : lIsDrawn := DrawItem(lCanvas, lRect, tbTicks);
                  TBCD_CHANNEL : lIsDrawn := DrawItem(lCanvas, lRect, tbChannel);
                end;
                (* verhindern, dass Standard gezeichnet wird *)
                if lIsDrawn then Message.Result := CDRF_SKIPDEFAULT;

              (* sicher ist sicher, dass der Teil dargestellt wird, falls ein
                 Fehler aufgetreten ist                                     *)
              except
                Message.Result := CDRF_DODEFAULT;
              end;
            finally
              lCanvas.Handle := 0;
              lCanvas.Free;
            end;
          end;
      end;
    end;

  end else inherited;
end;

end.
hier die Fehlermeldung: Inkompatible Typen:HDC und QPainterH
Delphi-Quellcode:
TransparentBlt(aCanvas.Handle, aRect.Left, aRect.Top,(aRect.Right - aRect.Left),
                         (aRect.Bottom - aRect.Top),
Ursprünglich ist es ein Vorschlag von hier: Link



Viele Grüße,bluescreen25

marabu 15. Okt 2006 15:51

Re: abgeleitete Trackbar mit Bitmaps
 
Hallo,

wenn du die Unit QGraphics wirklich brauchen solltest, dann musst du Windows.TransparentBlt() aufrufen - ansonsten einfach QGraphics aus der Uses-Klausel entfernen.

Grüße vom marabu

bluescreen25 15. Okt 2006 15:56

Re: abgeleitete Trackbar mit Bitmaps
 
Zitat:

Zitat von marabu
Hallo,

wenn du die Unit QGraphics wirklich brauchen solltest, dann musst du Windows.TransparentBlt() aufrufen - ansonsten einfach QGraphics aus der Uses-Klausel entfernen.

Grüße vom marabu

Ich kenne mich wirklich nicht mit den Grafiken aus, habe bisher anderes gemacht.

Entferne ich QGraphics, dann ist folgendes ein undefinierter Bezeichner....
Delphi-Quellcode:
NM_CUSTOMDRAW
PS die Units oben einzusetzen, waren alles Versuche es am laufen zu bewegen...

Grüße bluescreen25


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