Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Excel-Addin und Tranzparenz bei CommandBarButtons (https://www.delphipraxis.net/54230-excel-addin-und-tranzparenz-bei-commandbarbuttons.html)

Jens Schumann 30. Sep 2005 07:23


Excel-Addin und Tranzparenz bei CommandBarButtons
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich bastel seit einiger Zeit an einem Excel-Addin.
Funktioniert eigntlich als ganz gut. Bis auf die Kleinigkeit,
dass ich es noch geschafft habe die CommandBarButtons
transparent darzustellen (siehe Bild).

Weiss jemand wie das geht?

Hier der Source mit dem die Buttons erzeugt werden.
Delphi-Quellcode:
function TExcelAddin.CreateCommandBarButton(const aCommandBar: CommandBar;
                                            const CommandBarButtonCaption,
                                                  CommandBarButtonToolTip,
                                                  CommandBarButtonTag: String;
                                                  CommandBarSytle: TOleEnum;
                                      ImageIndex : Integer): CommandBarButton;
var
  iCnt             : Integer;
  ControlsCount    : Integer;
  ControlTag       : String;
  CBarControl      : CommandBarControl;
  ButtonFace       : TBitmap;
begin
  Result:=Nil;
  CBarControl:=Nil;
  ControlsCount:=aCommandBar.Controls.Count;
  // Gibt es schon einen Button mit dem gleichen Tag?
  For iCnt:=1 to ControlsCount do
    begin
    ControlTag:=aCommandBar.Controls.Item[iCnt].Tag;
    If AnsiUpperCase(ControlTag)= AnsiUpperCase(CommandBarButtonTag) then
      begin
      CBarControl:=aCommandBar.Controls.Item[iCnt];
      Result:=CBarControl as CommandBarButton;
      Exit;
      end;
    end; // For iCnt:=1 to ControlsCount do
  CBarControl:=aCommandBar.Controls.Add(msoControlButton,EmptyParam,EmptyParam,EmptyParam,False);
  Result:=CBarControl as CommandBarButton;
  Result.Set_Style(CommandBarSytle); // = msoButtonIcon
  Result.Set_Caption(CommandBarButtonCaption);
  Result.Set_TooltipText(CommandBarButtonToolTip);
  Result.Set_Tag(CommandBarButtonTag);
  Result.Set_FaceId(0);

{Da das Addin auch unter Excel2000 laufen soll muss das Bild
 über die Zwischenablage auf/in den Button kopiert werden.
 ExcelXP hat dafür eine Picture-Eigenschaft}
  ButtonFace:=TBitmap.Create;
  Try
    DM.ImageList.GetBitmap(ImageIndex,ButtonFace);
    clipboard.Assign(ButtonFace) ;
    Result.PasteFace;
  Finally
    ButtonFace.Free;
    end;
end;

marabu 30. Sep 2005 11:58

Re: Excel-Addin und Tranzparenz bei CommandBarButtons
 
Hallo Jens,

ist PasteFace() eine von dir geschriebene Methode? Irgendwo müssen die Anweisungen cbb.Set_Picture() und cbb.Set_Mask() stehen, denke ich.

Grüße vom marabu

Luckie 30. Sep 2005 12:09

Re: Excel-Addin und Tranzparenz bei CommandBarButtons
 
Das
Zitat:

{Da das Addin auch unter Excel2000 laufen soll muss das Bild
über die Zwischenablage auf/in den Button kopiert werden.
ExcelXP hat dafür eine Picture-Eigenschaft}
kann ich mir eigentlich nicht vorstellen. Das würde ja bedeuten, dass dem Benutzer der Inhalt seiner Zwischenablage überschrieben wird, wenn dein Plugin ausgeführt wird. Ich würde mich zu mindest ziemlich ärgern, wenn ich was kopiere, Excel aufrufe, um es dort einzufügen und mein text ist dann weg. Deswegen bin ich mir ziemlich sicher, dass es auch anders geht, gehen muss.

Jens Schumann 30. Sep 2005 14:11

Re: Excel-Addin und Tranzparenz bei CommandBarButtons
 
Zitat:

Zitat von marabu
Hallo Jens,

ist PasteFace() eine von dir geschriebene Methode? Irgendwo müssen die Anweisungen cbb.Set_Picture() und cbb.Set_Mask() stehen, denke ich.

Grüße vom marabu

Hallo Marabu,
die Methode PasteFace ist nicht von mir sondern eine Methode de CommandBarButton-Interface.
Das IPictureDisp Interface wird aber erst ab Office2003 unterstüzt.
Mein Addin muss aber ab Office2000 laufen. In Office200 gibt es IPictureDisp noch
nicht.

Zitat:

Zitat von Luckie
Das
Zitat:

{Da das Addin auch unter Excel2000 laufen soll muss das Bild
über die Zwischenablage auf/in den Button kopiert werden.
ExcelXP hat dafür eine Picture-Eigenschaft}
kann ich mir eigentlich nicht vorstellen. Das würde ja bedeuten, dass dem Benutzer der Inhalt seiner Zwischenablage überschrieben wird, wenn dein Plugin ausgeführt wird. Ich würde mich zu mindest ziemlich ärgern, wenn ich was kopiere, Excel aufrufe, um es dort einzufügen und mein text ist dann weg. Deswegen bin ich mir ziemlich sicher, dass es auch anders geht, gehen muss.

Hallo Luckie,
Du wirst es nicht glauben aber in der Hilfe zu Office2000 (VBAOFF9.chm) steht ein Beispiel für PasteFace.

Jens Schumann 30. Sep 2005 14:59

Re: Excel-Addin und Tranzparenz bei CommandBarButtons
 
Hallo,
es scheint doch recht aufwendig zu sein einen transparenten Button darzustellen.
Im Zwischennetz bin ich auf folgende Seite gestolpert.
http://www.daveswebsite.com/articles.../default.shtml

Unter SourceCode ist ein Beispiel in C. Dummerweise sind meine C Kenntnisse
eher eingeschränkt.
In der Headerdatei steht folgendes:
Code:
class CCOMAddinUtil
{
   private:
      CCOMAddinUtil(void);
      ~CCOMAddinUtil(void);
        static HANDLE _DDBToDIB( CBitmap& bitmap, DWORD dwCompression, CPalette* pPal );

   public:
      static void CopyTransBitmap(HBITMAP hSrcBmp);

       
};
Bis auf CBitmap& bitmap und CPalette* pPal komm ich damit klar.
Weiss jeamand was das bedeutet.

Waldteufel 30. Sep 2005 15:33

Re: Excel-Addin und Tranzparenz bei CommandBarButtons
 
Hallo Jens.

Nach Delphi übersetzt steht da in etwa folgendes:

Delphi-Quellcode:
type
  PPalette = ^CPalette;

  CComAddinUtil = class
    private
      constructor Create; // in C++ hat der Konstruktor den Namen der Klasse
      destructor Destroy; // in C++ hat der Konstruktor den Namen der Klasse und ein ~ vornedran
      function DDBToDIB(var bitmap: CBitmap; dwCompression: DWORD; pPal: PPalette) : THandle;
    public
      procedure CopyTransBitmap(hSrcBmp: HBITMAP);
  end;
Wenn CPalette allerdings eine Klasse ist, heißt die Deklaration von DDBToDIB so:
Delphi-Quellcode:
function DDBToDIB(var bitmap: CBitmap; dwCompression: DWORD; pPal: CPalette) : THandle;

Jens Schumann 30. Sep 2005 15:39

Re: Excel-Addin und Tranzparenz bei CommandBarButtons
 
Zitat:

Zitat von Waldteufel
Hallo Jens.

Nach Delphi übersetzt steht da in etwa folgendes:

Delphi-Quellcode:
type
  PPalette = ^CPalette;

  CComAddinUtil = class
    private
      constructor Create; // in C++ hat der Konstruktor den Namen der Klasse
      destructor Destroy; // in C++ hat der Konstruktor den Namen der Klasse und ein ~ vornedran
      function DDBToDIB(var bitmap: CBitmap; dwCompression: DWORD; pPal: PPalette) : THandle;
    public
      procedure CopyTransBitmap(hSrcBmp: HBITMAP);
  end;
Wenn CPalette allerdings eine Klasse ist, heißt die Deklaration von DDBToDIB so:
Delphi-Quellcode:
function DDBToDIB(var bitmap: CBitmap; dwCompression: DWORD; pPal: CPalette) : THandle;

Gute Antwort. Leider aber nicht die Antwort auf meine Frage. CBitmap und CPalette kannt Delphi
nicht. Bei CBitmap handelt es sich um eine CashedBitmap. Ich hoffe eine normale Bitmap tut es auch.

Bedeutet CBitmap& bitmap so viel wie var Bitmap : TBitmap ?

marabu 30. Sep 2005 15:45

Re: Excel-Addin und Tranzparenz bei CommandBarButtons
 
Hallo Jens,

ich gehe davon aus, dass CBitmap das C++ Äquivalent zu Delphi TBitmap ist. Übrigens basiert der C++ Code auf einem VB Beispiel aus der MSKB (288771): klick

marabu

Jens Schumann 30. Sep 2005 15:48

Re: Excel-Addin und Tranzparenz bei CommandBarButtons
 
Zitat:

Zitat von marabu
Hallo Jens,

ich gehe davon aus, dass CBitmap das C++ Äquivalent zu Delphi TBitmap ist. Übrigens basiert der C++ Code auf einem VB Beispiel aus der MSKB (288771): klick

marabu

Hallo marabu,
Danke. Das VB-Beispiel habe ich auch schon gefunden. Leider kann ich VB noch weniger.

marabu 30. Sep 2005 18:30

Re: Excel-Addin und Tranzparenz bei CommandBarButtons
 
Hallo Jens,

mit Graphik habe ich es nicht so, aber das ganze Geheimnis der transparenten Bildchen für einen MSO9 CommandBarButton ist die Registrierung zweier spezieller Clipboard-Formate:

In KB288771 steht geschrieben:

' Get the cf for button face and mask.
cfBtnFace = RegisterClipboardFormat("Toolbar Button Face")
cfBtnMask = RegisterClipboardFormat("Toolbar Button Mask")

Dieser Trick stellt sicher, dass der Inhalt des Clipboard nicht beschädigt wird. Die Herstellung der monochromen Maske kannst du ruhig mit Delphi machen - kein C++ und auch kein VB ist nötig. Das hier könnte dir dabei helfen: klick

marabu


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