これは最善の方法ではないかもしれませんが、カスタム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);
}
私はMFCのものを描画するのはかなり新しいです。 CButtonをサブクラス化して、['Bitmap']というメンバ(http://msdn.microsoft.com/en-us/library/ms534420%28v=vs.85%29.aspx)のメンバーを持つことを提案していますか?サブクラスの 'DrawItem'は、代わりにメンバーのBitmap上で' DrawImage'を呼び出しますか?オーバーライドされた 'DrawItem'には何が必要ですか?私はMSDNのドキュメントで適切な 'DrawImage'メソッドを見つけることができません。いくつかのコードスニペットを投稿できますか? – Chowlett
上記の応答を参照してください(コードを投稿することができます)。 – Redeye
FromResourceがNULLを返しています。ロードが失敗した原因を特定するにはどうすればよいですか? – Chowlett