2012-02-15 15 views
2

MFCダイアログには、いくつかのボタンが追加されています。透明なMFC画像ボタン

現在のところ、このダイアログには、パターン付き背景を提供するダイアログ全体をカバーするPictureコントロールがあります。さらに、各ボタンは、カバーする背景の領域に合わせて慎重に生成された(不透明な)画像を使用するCBitmapButtonです。

画像がほとんど透明に作成されていれば、背景が自動的に表示されることは明らかです。しかし、この場合、透明イメージを正しくレンダリングする方法をMFCに教えることはできません。

私は、CBitmapButtonとは異なるクラスが必要な場合や、カスタムサブクラスを作成する必要があることを理解しています。それは問題ありませんが、どこから始めるべきかわかりません。 32ビットのBMPやPNGをアルファチャンネルでサポートするのは良いことですが、 "指定された色は透明にする必要があります"タイプのために解決します。

答えて

1

これは最善の方法ではないかもしれませんが、カスタムCButton派生クラスを作成して(実際には残りのCButton機能を使用していると仮定して)、DrawItem関数を

イメージ自体については、ビットマップGDI +オブジェクト(BMPまたはPNGにアルファチャンネルを読み込むことができます)を使用し、通常のDrawImage関数を使用してビットマップを描画します。

リソースファイルにPNGを配置する場合は、「PNG」タイプとして配置する必要があります。 「:\一時\のtest.png C」

と「あなたそれ以外BITMAPリソースとして扱いしようとしませんが、エントリが

IDB_PNG1 PNGのように見えるリソースファイルのコードで見たときに確認してくださいそれらをロードする際に問題があります。

編集

私はコードを投稿することができますので、ここに私の応答を置きます。はい、私はCButtonからカスタムクラスを派生させ、Gdiplus :: Bitmapメンバ変数を追加するつもりでした。コードを実際にコンパイルして動作させることはチェックしていませんが、実際には動作させるためには何をする必要がありますか?それはそれを行う最も効率的な方法ではありませんが、それ以前に多くのカスタム図面を行っていないなら、それは簡単であるという利点があります!

void CMyButton::LoadImage(const int resourceID) 
{ 
    m_pBitmap = Gdiplus::Bitmap::FromResource(NULL, MAKEINTRESOURCE(resourceID)); 
    ASSERT(m_pBitmap); 
} 

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{ 
    ASSERT(lpDrawItemStruct->CtlType == ODT_BUTTON); 

    CRect rcClient; 
    GetClientRect(&rcClient); 
    if (lpDrawItemStruct->itemState & ODS_SELECTED) 
    { 
     // If you want to do anything special when the button is pressed, do it here 
     // Maybe offset the rect to give the impression of the button being pressed? 
     rcClient.OffsetRect(1,1); 
    } 
    Graphics gr(lpDrawItemStruct->hDC); 
    gr.DrawImage(m_pBitmap, rcClient.left, rcClient.top); 
} 
+0

私はMFCのものを描画するのはかなり新しいです。 CButtonをサブクラス化して、['Bitmap']というメンバ(http://msdn.microsoft.com/en-us/library/ms534420%28v=vs.85%29.aspx)のメンバーを持つことを提案していますか?サブクラスの 'DrawItem'は、代わりにメンバーのBitmap上で' DrawImage'を呼び出しますか?オーバーライドされた 'DrawItem'には何が必要ですか?私はMSDNのドキュメントで適切な 'DrawImage'メソッドを見つけることができません。いくつかのコードスニペットを投稿できますか? – Chowlett

+0

上記の応答を参照してください(コードを投稿することができます)。 – Redeye

+0

FromResourceがNULLを返しています。ロードが失敗した原因を特定するにはどうすればよいですか? – Chowlett