2013-10-10 42 views
1

首先,我不是C++開發人員,主要使用C#編程。我正在嘗試在.NET中使用ContextMenu(是的,我知道ContextMenuStrip)類,它是我的應用程序中圍繞CMenu的一個包裝。在CMenu的菜單項旁邊顯示正確透明度的位圖的簡單方法

如何在具有適當透明度的菜單項旁邊顯示圖像?

什麼我迄今所做的就是調用我的菜單項SetMenuItemBitmaps,這裏是連接結果:

enter image description here

正如你可以看到有一個白色背景上的菜單項。這只是令人沮喪地接近我想要的。我怎樣才能讓透明度問題消失?我已經把它貼在下面我就用這個菜單項的精確圖像:

enter image description here

我知道SetMenuItemBitmaps並不意味着對彩色圖像。

選定的和清晰的位圖應該是單色的。系統使用布爾AND操作符 將位圖與菜單組合,以使 白色部分變爲透明,黑色部分變爲 菜單項顏色。如果您使用彩色位圖,結果可能是 不合需要的。

那麼這樣做的適當方法(希望是簡單的)是什麼?

編輯

另一件事我試着打電話SetMenuItemInfo,但我不斷收到錯誤87(無效參數)。

這是MENUITEMINFO結構是什麼樣子之前,我打電話SetMenuItemInfo:

enter image description here

而對於我在SetMenuItemInfo調用的參數值是:

HMENU - 的句柄上下文菜單?

uItem - 0(第一項指標?)

fByPosition - 真

lpmii - (上面的結構內容)

+0

我可以看到的結構沒有明顯的錯誤,所以也許檢查'hMenu'是否有效?也許通過調用'GetMenuItemInfo()'來獲得一些簡單的東西(例如'fState')。 –

+0

@JonathanPotter嗯,我能夠得到SetMenuItemInfo的工作,感謝您的方向。唯一的問題是它看起來與上面完全相同(像素化爲白色背景)。 – test

+0

您的位圖32bpp是否帶有預乘alpha? –

回答

1

當您添加菜單項,只需設置MIIM_BITMAP標誌並通過結構的hbmpItem成員中的HBITMAP即可。如果你的位圖是32bpp和預乘alpha,那麼它將被正確顯示。

+0

對不起,對你這樣做,但你能給我一個正確的調用SetMenuItemInfo的例子嗎?我實際上嘗試了你所描述的第一次嘗試,但無法實現。 – test

+0

'mi.fMask | = MIIM_BITMAP; mi.hbmpItem = hbmp;' –

+0

是的,我想到了那部分,我只是沒有真正在C++中創建菜單。這是一個C#應用程序,所以我必須去做這件事。我不是100%確定我將如何調用SetMenuItemInfo並填充MENUITEMINFO結構。我始終得到錯誤87(無效的參數)。 – test