Image 将图片从表加载到Microsoft Access 2010功能区

Image 将图片从表加载到Microsoft Access 2010功能区,image,bitmap,ms-access-2010,ribbon,Image,Bitmap,Ms Access 2010,Ribbon,我正在使用Access 2010的新功能区功能,并试图找出将图像从表加载到功能区的最简单方法。我知道我可以通过使用GDIAPI函数来实现这一点,但从我看到的代码看起来很复杂,似乎利用了额外的DLL,如果不需要的话,我也可以避免调用这些DLL。我还知道我可以在窗体上创建控件,将图像加载到窗体,然后将图像从窗体加载到ribbon image变量。虽然使用表单是可行的,但它看起来很草率。最后,如果有必要,我将使用前面两种方法中的一种,但似乎应该有一些简单的方法将图像从表直接加载到ribbon的图像变量

我正在使用Access 2010的新功能区功能,并试图找出将图像从表加载到功能区的最简单方法。我知道我可以通过使用GDIAPI函数来实现这一点,但从我看到的代码看起来很复杂,似乎利用了额外的DLL,如果不需要的话,我也可以避免调用这些DLL。我还知道我可以在窗体上创建控件,将图像加载到窗体,然后将图像从窗体加载到ribbon image变量。虽然使用表单是可行的,但它看起来很草率。最后,如果有必要,我将使用前面两种方法中的一种,但似乎应该有一些简单的方法将图像从表直接加载到ribbon的图像变量中

需要注意的是,我愿意使用任何最简单的图像格式。这些图标文件非常小,所以我不关心文件大小,也不关心它们是否具有透明度。因此,如果有一种方法只适用于位图文件类型,我觉得这很好

以下是我为功能区XML中的按钮编写的代码:

<button id="CCTrans" label="Credit Card Trans." getImage="GetMnuIcn" onAction="=OpenCCTrans()" />
我尝试将图像存储为OLE对象和附件。无论哪种方式,当我试图检索它时,它都会导致错误类型不匹配。为了简单起见,我一直将其存储为位图,但在第一次尝试中,我也尝试了.gif和.png

注意:功能区图标显然是IPICUTREDISP对象。如果我能弄清楚如何将图像从表加载到这些对象类型中,我应该能够将其用于功能区


另外,微软的网站上有很多很好的信息,但我还没能把它们整合成一个解决方案。这里有一个链接:

经过几天乏味的寻找更好的解决方案后,我不得不在我认为的各种平庸方法之间做出选择。我真的很想直接把它加载到一个变量中,但唯一的方法是需要引用一堆DLL,而且代码非常复杂。为了避免任何额外的依赖关系并使代码更简单,我决定将包含附加图像的表分配给表单,以隐藏模式打开该表单,然后从表单中分配图片变量

由于某种原因,我在别处看到的通过这种方法按需加载图片的代码导致我的程序崩溃,因此我不得不在程序打开时将图片加载到变量中,然后在选择菜单时让菜单栏设置这些变量中的图标

我的代码如下:

Dim Icn(15) As IPictureDisp, IcnLbl(15) As String   

Function SetMnuIcn()
    Dim Img As Recordset, i As Byte
    DoCmd.OpenForm "frmImg", acNormal, , , acFormReadOnly, acHidden  
    Set Img = Forms!frmImg.Recordset
    While Not Img.EOF
        i = i + 1
        Set Icn(i) = Forms!frmImg!Img.PictureDisp
        IcnLbl(i) = Img!Lbl
        Img.MoveNext
    Wend
    DoCmd.Close acForm, "frmImg", acSaveNo
End Function

Sub GetMnuIcn(control As IRibbonControl, ByRef Image)
    Set Image = Icn(GetAryLoc(IcnLbl, control.ID, 15))
End Sub

Function GetAryLoc(varValues As Variant, varMatch As Variant, NumOfValues As Integer) As Integer
    Dim i As Integer
    For i = 1 To NumOfValues
        If varValues(i) = varMatch Then GetAryLoc = i
    Next
End Function
注意:为了确保图标在需要之前已加载,我指定了SetMnuIcn在功能区加载时运行:

<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="=SetMnuIcn()">
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="=SetMnuIcn()">