Einzelnen Beitrag anzeigen

ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: Glyph in einer ActionToolbar unsichtbar im "onHover"-Zustand

  Alt 18. Aug 2012, 15:09
Hier folgend die Lösung des Problems, obwohl eine Lösung für neuere Delphi-Versionen, zumindest ab XE, nicht mehr relevant ist. Dagegen für das auch von mir immer noch zumeist bevorzugte, wunderbar kompakte und stabile Delphi 7 aber schon.

Als Ergebnis meiner vergleichenden Untersuchung der VCL-Quellcodes zwischen Delphi XE und Delphi 7 ist folgendes herausgekommen: In der Unit XPActnCtrls.pas von Delphi 7 müssen an 3 Positionen zwei neue Codeanweisungen eingefügt werden.

Der wichtigste, zusätzlich einzufügende Code ist Code #1:
// CODE #1:
Code:
Canvas.Brush.Style := bsClear;
Zur Optimierung des Aussehens, aber nicht zwingend notwendig, ist der weitere, an zwei Positionen in der Unit inzufügende Code:
// CODE #2:
Code:
SelBmp.Canvas.FillRect(SelBmp.Canvas.ClipRect);
ActionList.Images.Draw(SelBmp.Canvas, 0, 0, ActionClient.ImageIndex, dsNormal, itMask);

Diese Codes müssen in der Unit XPActnCtrls.pas an folgenden Stellen zugefügt werden:
CODE #1:
Code:
procedure TXPStyleDropDownBtn.DrawFrame(ARect: TRect; Down: Boolean);
begin
  if Enabled and not (ActionBar.DesignMode) then
    if (MouseInControl or IsChecked) and Assigned(ActionClient) then
    begin
      // **** CODE #1 HIER ZUFÜGEN ***
      Canvas.Pen.Color := ActionBar.ColorMap.BtnFrameColor;
      {...}
    end;
end;
CODE #2:
Code:
procedure TXPStyleButton.DrawGlyph(const Location: TPoint);
    {...}
    try
      {...}
      if ActionList.Images.GetBitmap(ActionClient.ImageIndex, SelBmp) then
      begin
        {...}
        // **** CODE #2 HIER ZUFÜGEN ***
        DrawState(Canvas.Handle, Canvas.Brush.Handle, nil, SelBmp.Handle, 0,
          NewLocation.X + 1, NewLocation.Y + 1, 0, 0, DST_BITMAP or DSS_MONO);
      end;
    finally
      {...}
    end;
{...}
end;

procedure TXPStyleDropDownBtn.DrawGlyph(const Location: TPoint);
    {...}
    try
      {...}
      if ActionList.Images.GetBitmap(ActionClient.ImageIndex, SelBmp) then
      begin
        {...}
        // **** CODE #2 HIER ZUFÜGEN ***
        DrawState(Canvas.Handle, Canvas.Brush.Handle, nil, SelBmp.Handle, 0,
          NewLocation.X + 1, NewLocation.Y + 1, 0, 0, DST_BITMAP or DSS_MONO);
      end;
    finally
      {...}
    end;
{...}
end;
Anschließend natürlich das komplette Rebuild nicht vergessen, damit die DCUs das auch mitbekommen.
  Mit Zitat antworten Zitat