- 締切済み
ビットマップボタンを押したときの処理についてなんですが
環境はVC++6.0 MFC ダイアログベースです。 MFC初心者なんですが、 HBITMAP hBitmap; hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), (LPCTSTR)csBMPFile, IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); を使いビットマップハンドルをし取得しました。 ビットマップの貼り付けは出来たのですが、ボタンを押したときにビットマップの画像を変える処理の仕方がわかりません>< loadbitmapsなら容易に出来るのですが、どうしてもloadimageを使って表示したいのですが、どのようにすれば良いでしょうか? 御教授よろしくお願いします><
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 要するに、CBitmapButtonクラスでは物足りないと言う事でしょうか。 思いつく限りでは、CButtonクラスを派生させ、其のクラス内でDrawItemメンバをオーバーライドしてオーナードローする位でしょうか。 例えば、 CButtonクラスからCMyImageButtonクラスを派生させる。 CDialogのヘッダに CMyImageButton m_imageButton; を入れる CDialogの初期化で BOOL CDialog::OnInitDialog() { //サブクラス化する m_bitmapButton.SubclassDlgItem(IDC_BUTTON1, this); } CMyImageButtonのソースで、 //デストラクタでビットマップリソースの一斉消去 void CMyImageButton::~CMyImageButton() { for(int i = 0; i < m_bitmapArray.GetSize(); ++i) ::DeleteObject(m_bitmapArray[i]); } void CMyImageButton::LoadImage(LPCSTR sUp, LPCSTR sDown, LPCSTR sGray) { //先立って読み出しておく LPCSTR arrFiles[] = {sUp, sDown, sGray}; for(int i = 0; i < sizeof(arrFiles) / sizeof(arrFiles[0]); ++i) { HBITMAP hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), arrFileName[i], IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); if(hBitmap == NULL)continue; //m_bitmapArrayはCArray<HBITMAP, HBITMAP&>型のコンテナ m_bitmapArray.Add(hBitmap); } } //ボタンへの描写 void CMyImageButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { const RECT rc = lpDrawItemStruct->rcItem; CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CDC memDC; memDC.CreateCompatibleDC(NULL); //通常は配列の0番 int i = 0; //選択されたら、配列の1番 if(lpDrawItemStruct->itemState & ODS_CHECKED || lpDrawItemStruct->itemState & ODS_SELECTED) i = 1; //灰化されたら、配列の2番 if(lpDrawItemStruct->itemState & ODS_DISABLED || lpDrawItemStruct->itemState & ODS_GRAYED) i = 2; CGdiObject* pObj = memDC.SelectObject(CBitmap::FromHandle(m_bitmapArray[i])); pDC->BitBlt(rc.left, rc.top, rc.right, rc.bottom, &memDC, 0, 0, SRCCOPY); memDC.SelectObject(pObj); //フォーカスがあれば描く if(lpDrawItemStruct->itemState & ODS_FOCUS) pDC->DrawFocusRect(&rc); } と言った具合です。
お礼
回答ありがとうございます! 解からない用語など調べながら読ませていただきましたが、いまの自分の知識では解読出来なさそうです>< 知識を蓄えてから再度、回答くださった方法でチャレンジしてみます!