2

Access2007リボンのカスタムアイコンとして.pngを使用したいと思います。

これが私がこれまでに試したことです:

.bmpと.jpgをカスタム画像として問題なくロードできます。.gifを読み込むことはできますが、透明度が保たれていないようです。.pngをまったく読み込めません。他の形式では利用できないアルファブレンディングを利用するために、.pngを使用したいと思います。

SOでも同様の質問を見つけましたが、それはあらゆる種類のカスタムアイコンの読み込みを扱っているだけです。特に.pngに興味があります。その質問に対するAlbertKallalからの回答があります。これは、彼が作成したクラスモジュールにリンクしており、私が望んでいることを正確に実行しているように見えます。

meRib("Button1").Picture = "HappyFace.png"

残念ながら、その回答のリンクは無効です。

また、透明なアイコンのサポートを得るために、数十のAPI呼び出しでいっぱいの460行のモジュールのダウンロードを提供するこのサイトを見つけました。そのルートに行く前に、ここの専門家にもっと良い方法を知っているかどうか尋ねたかったのです。

.pngはかなり新しいものであり、すべてが新しいことは知っていますが、Office開発者がこの形式のネイティブサポートに参加してくれることを期待しています。

4

1 に答える 1

3

これが私が現在使用しているものです。Albert Kallalは、.pngをロードするだけでなく、Access2007リボンプログラミング用のより本格的なソリューションを提供しています。まだ使用していませんが、チェックする価値があります。

興味のある方のために、ここに私が使用しているコードがあります。これは、.pngサポートに必要な最小値にかなり近いと思います。ここに無関係なことがあれば、私に知らせてください。答えを更新します。

以下を標準コードモジュールに追加します。

Option Compare Database
Option Explicit

'================================================================================
'  Declarations required to load .png's in Ribbon
Private Type GUID
    Data1                   As Long
    Data2                   As Integer
    Data3                   As Integer
    Data4(0 To 7)           As Byte
End Type

Private Type PICTDESC
    Size                        As Long
    Type                        As Long
    hPic                        As Long
    hPal                        As Long
End Type

Private Type GdiplusStartupInput
    GdiplusVersion              As Long
    DebugEventCallback          As Long
    SuppressBackgroundThread    As Long
    SuppressExternalCodecs      As Long
End Type

Private Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, _
    inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
Private Declare Function GdipCreateBitmapFromFile Lib "GDIPlus" (ByVal filename As Long, bitmap As Long) As Long
Private Declare Function GdipCreateHBITMAPFromBitmap Lib "GDIPlus" (ByVal bitmap As Long, _
    hbmReturn As Long, ByVal background As Long) As Long
Private Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal image As Long) As Long
Private Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Long) As Long
Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PICTDESC, _
    RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
'================================================================================

Public Sub GetRibbonImage(ctl As IRibbonControl, ByRef image)
Dim Path As String
    Path = Application.CurrentProject.Path & "\Icons\" & ctl.Tag
    Set image = LoadImage(Path)
End Sub

Private Function LoadImage(ByVal strFName As String) As IPicture
    Dim uGdiInput As GdiplusStartupInput
    Dim hGdiPlus As Long
    Dim hGdiImage As Long
    Dim hBitmap As Long

    uGdiInput.GdiplusVersion = 1

    If GdiplusStartup(hGdiPlus, uGdiInput) = 0 Then
        If GdipCreateBitmapFromFile(StrPtr(strFName), hGdiImage) = 0 Then
            GdipCreateHBITMAPFromBitmap hGdiImage, hBitmap, 0
            Set LoadImage = ConvertToIPicture(hBitmap)
            GdipDisposeImage hGdiImage
        End If
        GdiplusShutdown hGdiPlus
    End If

End Function

Private Function ConvertToIPicture(ByVal hPic As Long) As IPicture

    Dim uPicInfo As PICTDESC
    Dim IID_IDispatch As GUID
    Dim IPic As IPicture

    Const PICTYPE_BITMAP = 1

    With IID_IDispatch
        .Data1 = &H7BF80980
        .Data2 = &HBF32
        .Data3 = &H101A
        .Data4(0) = &H8B
        .Data4(1) = &HBB
        .Data4(2) = &H0
        .Data4(3) = &HAA
        .Data4(4) = &H0
        .Data4(5) = &H30
        .Data4(6) = &HC
        .Data4(7) = &HAB
    End With

    With uPicInfo
        .Size = Len(uPicInfo)
        .Type = PICTYPE_BITMAP
        .hPic = hPic
        .hPal = 0
    End With

    OleCreatePictureIndirect uPicInfo, IID_IDispatch, True, IPic

    Set ConvertToIPicture = IPic
End Function

次に、まだ持っていない場合は、という名前のテーブルを追加しますUSysRibbons。(注:Accessはこのテーブルをシステムテーブルとして扱うため、[アクセスオプション]->[現在のデータベース]->[ナビゲーションオプション]に移動し、[システムオブジェクトの表示]がオンになっていることを確認して、ナビゲーションペインに表示する必要があります。 )次に、これらの属性をコントロールタグに追加します。

getImage="GetRibbonImage" tag="Acq.png"

例えば:

<button id="MyButtonID" label="Do Something" enabled="true" size="large"
getImage="GetRibbonImage" tag="MyIcon.png" onAction="MyPublicSub"/>
于 2011-03-06T21:26:12.487 に答える