2012-03-28 20 views
3

Win32メニューを処理しなければならなかったので、ずっと時間がかかりました。私はいくつかのPNGアイコンをWin32コンテキストポップアップメニューに追加する必要があります。当然のことながら、私はPNGの透明性とすべてのピクセルごとのアルファをプロセス内に保存したいと考えています。これは可能ですか?リソースからのPNGアイコン付きのWin32ポップアップメニューを表示

私はSetMenuItemBitmapsを使用することを考えていました。それは行く方法ですか?

PNGを「PNG」リソースとしてインポートしましたが、LoadBitmapでも​​でもロードできないようです。私はGdi+の使用についていくつかの提案を見つけましたが、明らかに私はメニューを描くことはありません。

Gdi + BitmapからHBITMAPを取得する方法があるようですが、すべてのアルファが処理中に失われているように見えます。 AFAIK、HBITMAPは喜んでアルファ情報をホストできます。

答えて

3

PNGを読み込むにはGDI +が必要です。次に、正しいサイズの32ビットアルファビットマップを作成し、ビットマップにGraphicsを作成し、DrawImageを使用してPNGをビットマップにコピーする必要があります。これにより、アルファチャンネルのビットマップが得られます。このような

何か:

Image* pimgSrc = Image::FromFile("MyIcon.png"L, FALSE); 
Bitmap* pbmpImage = new Bitmap(
    iWidth, iHeight, 
    PixelFormat32bppARGB 
); 
Graphics* pgraphics = Graphics::FromImage(bmpImage)) 
{ 
    // This draws the PNG onto the bitmap, scaling it if necessary. 
    // You may want to set the scaling quality 
    graphics->DrawImage(
     imageSrc, 
     Rectangle(0,0, bmpImage.Width, bmpImage.Height), 
     Rectangle(0,0, imgSrc.Width, imgSrc.Height), 
     GraphicsUnitPixel 
    ); 
} 
// You can now get the HBITMAP from the Bitmap object and use it. 
// Don't forget to delete the graphics, image and bitmap when done. 
+0

ありがとうございました。私は最後にそれを解決することができました。 'Graphics'描画は必要ないと思われる。リソースから最初にロードした後に 'Bitmap :: GetHBITMAP'を呼び出すだけで、ビットマップを取得できました。今私は実際にメニューにビットマップを表示することに関連する別の問題を抱えています。新しい質問を投稿します... – wpfwannabe

1

おそらく、あなたの代わりにアイコンを使用することができますか?ここで

ではなくPNGファイルのアイコンを使用するための私の理由です:

  1. GDI +を必要としないため、Win32 APIのは良いサポートのアイコンを持っており、それは比較的はるかに簡単にアイコンを描画します。
  2. アイコンも8ビット透過をサポートしています(PNGと同様)。
  3. アイコンのサイズは、ピクセル単位で指定できます(PNGと同様)。
  4. アイコンは、実行可能ファイルにリソースとして簡単に埋め込むことができます。
  5. アイコンはVisual Studioで編集できます。

リソースまたはファイルの使用からアイコンをロードするには、次のアイコンを描画するには

LoadImage() 

、使用:

DrawIcon() or DrawIconEx() 
+0

長い回答ありがとうございましたが、あなたはその点を逃しました。アイコンに切り替える場合でも、標準メニューにアイコン(透明)を割り当てる問題があります。私はオーナー描画とDrawIconをしたくありません。 Btw、PNGはリソースと同じように簡単に埋め込むことができます。 – wpfwannabe