AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Excel-Addin und Tranzparenz bei CommandBarButtons
Thema durchsuchen
Ansicht
Themen-Optionen

Excel-Addin und Tranzparenz bei CommandBarButtons

Ein Thema von Jens Schumann · begonnen am 30. Sep 2005 · letzter Beitrag vom 30. Sep 2005
Antwort Antwort
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#1

Excel-Addin und Tranzparenz bei CommandBarButtons

  Alt 30. Sep 2005, 08:23
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;
Miniaturansicht angehängter Grafiken
transparenz_363.jpg  
I come from outer space to save the human race
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Excel-Addin und Tranzparenz bei CommandBarButtons

  Alt 30. Sep 2005, 12:58
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Excel-Addin und Tranzparenz bei CommandBarButtons

  Alt 30. Sep 2005, 13:09
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Excel-Addin und Tranzparenz bei CommandBarButtons

  Alt 30. Sep 2005, 15:11
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 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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Excel-Addin und Tranzparenz bei CommandBarButtons

  Alt 30. Sep 2005, 15:59
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Waldteufel
(Gast)

n/a Beiträge
 
#6

Re: Excel-Addin und Tranzparenz bei CommandBarButtons

  Alt 30. Sep 2005, 16:33
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:
function DDBToDIB(var bitmap: CBitmap; dwCompression: DWORD; pPal: CPalette) : THandle;
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Excel-Addin und Tranzparenz bei CommandBarButtons

  Alt 30. Sep 2005, 16:39
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:
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 ?
I come from outer space to save the human race
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Excel-Addin und Tranzparenz bei CommandBarButtons

  Alt 30. Sep 2005, 16:45
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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#9

Re: Excel-Addin und Tranzparenz bei CommandBarButtons

  Alt 30. Sep 2005, 16:48
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Excel-Addin und Tranzparenz bei CommandBarButtons

  Alt 30. Sep 2005, 19:30
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:38 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