在上下文菜单中定位菜单项图像(MENUITEMINFO的hbmpItem)

时间:2016-12-18 06:48:11

标签: vb.net winapi pinvoke outlook-addin

我将菜单项插入到主题文本控件的Outlook上下文菜单中。 Here you can find a previous question I had on doing this.

我遇到的问题是,Outlook 2010中的菜单项图像位置奇怪。在Outlook 2007中,它的位置不同。似乎菜单项在Outlook 2010中保留了已选中图像的位置。

Menu Item with no unChecked image 这显示了我的菜单项看起来如下所示。注意图像左侧的大空间。

Menu Item with an unChecked image 这显示了我将MIIM_CHECKMARKS标志添加到fMask并将位图添加到hbmpUnchecked指针时的外观。

            Dim bmp As Drawing.Bitmap = My.Resources.olContextMenuIcon
            bmp.MakeTransparent(bmp.GetPixel(10, 10))

            hbitmap = bmp.GetHbitmap

            Dim mii As New NativeMethodsEX.MENUITEMINFO
            With mii
                .cbSize = Marshal.SizeOf(mii)
                .fMask = NativeMethodsEX.MIIM.MIIM_BITMAP Or NativeMethodsEX.MIIM.MIIM_STRING Or NativeMethodsEX.MIIM.MIIM_FTYPE Or NativeMethodsEX.MIIM.MIIM_STATE Or NativeMethodsEX.MIIM.MIIM_ID
                .wID = WM_APP
                .fType = NativeMethodsEX.MFT.MFT_STRING
                .dwTypeData = String.Concat("Wrong Position")
                .fState = NativeMethodsEX.MFS.MFS_ENABLED
                .hbmpItem = hbitmap
            End With

            If ShowTop Then
                NativeMethodsEX.InsertMenuItem(aHwnd, 0, True, mii)
                NativeMethodsEX.InsertMenu(aHwnd, 1, NativeMethodsEX.MFT.MFT_BYPOSITION Or NativeMethodsEX.MFT.MFT_SEPARATOR, Nothing, Nothing)
            Else
                Dim menuItemCount As Integer = NativeMethodsEX.GetMenuItemCount(aHwnd)
                NativeMethodsEX.InsertMenu(aHwnd, menuItemCount, NativeMethodsEX.MFT.MFT_BYPOSITION Or NativeMethodsEX.MFT.MFT_SEPARATOR, Nothing, Nothing)
                NativeMethodsEX.InsertMenuItem(aHwnd, menuItemCount + 1, True, mii)
            End If

            NativeMethodsEX.DrawMenuBar(subjectRegionHwnd)

那么如何判断菜单项不保留检查/取消选中图像的空间?

1 个答案:

答案 0 :(得分:1)

我对这个问题有两个答案。

我在上面指出,问题存在于Outlook 2010中的菜单上,但不存在于Outlook 2007中。但事实并非如此。这些办公室版本当然是在不同的计算机上,它是Windows中的显示设置,是导致问题的原因。上面的菜单是您在Windows上使用视觉样式和按钮"在“效果选项”中>视觉效果关闭(Win 7)。如果启用此设置,则菜单看起来会有很大不同。

但是如果用户禁用此设置怎么办呢(不确定这是否与Win10相关)。

You need to set the menu style through the use of the Menuinfo特别需要设置标志MNS_NOCHECK。然后空间消失,因为菜单不再需要复选标记。

此解决方案can also be seen here在另一个stackoverflow答案中。