• 締切済み

ビットマップボタンを押したときの処理についてなんですが

環境はVC++6.0 MFC ダイアログベースです。 MFC初心者なんですが、 HBITMAP hBitmap; hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), (LPCTSTR)csBMPFile,      IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); を使いビットマップハンドルをし取得しました。 ビットマップの貼り付けは出来たのですが、ボタンを押したときにビットマップの画像を変える処理の仕方がわかりません>< loadbitmapsなら容易に出来るのですが、どうしてもloadimageを使って表示したいのですが、どのようにすれば良いでしょうか? 御教授よろしくお願いします><

みんなの回答

回答No.1

 こんばんは。  要するに、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);  }  と言った具合です。

rocker1215
質問者

お礼

回答ありがとうございます! 解からない用語など調べながら読ませていただきましたが、いまの自分の知識では解読出来なさそうです>< 知識を蓄えてから再度、回答くださった方法でチャレンジしてみます!

関連するQ&A

  • ビットマップハンドルからビットマップボタンを作りたいです

    MFC初心者です。どうかよろしくお願いいたします。 環境はVC++6.0 MFC ダイアログベースです。 HBITMAP hBitmap; hBitmap = (HBITMAP)LoadImage(AfxGetInstanceHandle(), (LPCTSTR)sSaveFile,IMAGE_BITMAP, 0,0,LR_LOADFROMFILE); を使ってビットマップハンドルを取得しました。 ここからボタンに貼り付ける方法がわかりません。 リソースにボタンを作った後、どのようにすれば良いでしょうか? あと、ボタンの好きな位置にビットマップを貼り付ける方法も教えていただけると幸いです。

  • ビットマップの表示ができません。

    Visual Studio.net 2003 MFCを使用しています。 ビットマップの表示とフォームのサイズ変更はできたのですが、 以下のソースのように フォームのサイズをビットマップのサイズに変更すると ビットマップが表示されません。 一瞬表示はされているようですが、 真っ白になります。 フォームをきちんとビットマップのサイズに変更し、 ビットマップを表示するにはどうすればいいでしょうか? int num=35; void CProject1View::OnLButtonUp(UINT nFlags, CPoint point) {   // TODO : ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。   char str[128];   wsprintf(str,"c:\\test\\%d.bmp",num);num++;   HBITMAP hbm = (HBITMAP)LoadImage(NULL, str, IMAGE_BITMAP,0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION );   CBitmap *pBmp = CBitmap::FromHandle( hbm );   BITMAP bmp;   GetObject(hbm,sizeof(bmp),&bmp );   CDC bmpdc;   CDC *mydc=GetDC();   bmpdc.CreateCompatibleDC(mydc);   CBitmap *pOldBmp = bmpdc.SelectObject(pBmp);   GetParentFrame()->SetWindowPos(&wndTop,0,0,bmp.bmWidth,bmp.bmHeight,SWP_NOMOVE);   mydc->BitBlt( 0, 0,bmp.bmWidth, bmp.bmHeight, &bmpdc, 0, 0, SRCCOPY );   bmpdc.SelectObject(pOldBmp);   DeleteObject(hbm);   CView::OnLButtonUp(nFlags, point); }

  • 【VC++6.0 MFC】画像表示について

    お世話になっております。C++初心者です。 とある開発でVC++6.0のMFCを利用して画像表示を行う作業をしています。 リソースファイルを使用せず、 外部の画像ファイルを読み込みピクチャーボックスに表示しなければならないのですが、 下記の関数を呼び、BMPファイルを読み込み、 NULLの場合はエラーメッセージを表示するようにしているのですが、 必ずNULLが返ってきてしまいます。 何が問題なのかもわからず苦戦しております。 知識不足で申し訳ないのですが、お願いします。 【疑問点】 ・画像ファイルの指定は絶対パス?相対パス? ***問題の箇所*** HBITMAP hBmp; // ビットマップハンドル // ビットマップのハンドル取得 hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); // ハンドルのチェック if(hBmp == NULL) {   AfxMessageBox("読み込みに失敗しました");   return ; }

  • JPEGやPNGが読めるLoadImage関数

    BCCで、 hBitmapA=(HINSTANCE)LoadImage(hInst,"A.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hBitmapB=(HINSTANCE)LoadImage(hInst,"B.BMP",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);    : GetObject(hBitmapA,sizeof(BITMAP),&bitmapA); GetObject(hBitmapB,sizeof(BITMAP),&bitmapB);    : のように複数のBMPファイルを読んで、描画しているプログラムがあります。 JPEGファイルやPNGファイルを同様に扱えるように拡張したいのですが、LoadImage関数では、対応していないので、たとえば、LoadImagePng()やLoadImageJpeg()といった関数を探しています。どこかにありますか?

  • 画面の更新

    開発環境 XP Home Edtion Microsoft Visual C++ 2008 Express Edition SQL Server2005 Express Edtion ボタンを押すと画像を画面に表示させるというものを作っています、実行時は白紙の状態で、ボタンを押すとその値の画像が表示されるというものです。 HDC hMdc; HBITMAP hbmp = (HBITMAP)LoadImage( NULL, dstLPCSTR3, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION ); hMdc= CreateCompatibleDC(hdc ); SelectObject(hMdc, hbmp ); BitBlt(hdc, 0, 0, 2000, 5000, hMdc, 0, 0, SRCCOPY); DeleteDC(hMdc); DeleteObject(hbmp); これはボタンを押されたときの処理です。 判りにくいところもあると思いますがどうかよろしくお願いいたします。

  • ビットマップ表示とSetTimer関数を同居させる方法

    ビットマップ表示とSetTimer関数を同居させる方法 現在、vc++2005を使用して、簡易的なGUIアプリケーションを作成しようとしているのですが、自分では解決ができない問題が発生してしまったので、質問させていただきます。 それはビットマップ表示とSetTimer関数を同居させる方法についてです。 ビットマップを読み込んで表示させる機能を追加してから、SetTimer関数が反応しなくなってしまい困っています。 ちなみにビットマップ表示の機能を追加する前まではSetTimer関数が正常に機能していました。 ウィンドウのハンドルhWndが何か関係しているのかと思ったのですが、解決方法がわからず・・・・・・ ご存知の方がいらっしゃましたら御教授いただけると幸いです。 ↓ ソースの一部です case WM_CREATE: //ビットマップファイル読み込み + 表示の準備 static HBITMAP hbitmap,prebitmap; static HDC hDC, hcomDC;      hbitmap = (HBITMAP)LoadImage(NULL,_T("kouen.bmp"),IMAGE_BITMAP,0,0, LR_LOADFROMFILE); if( hbitmap == NULL ) { MessageBox(hWnd, _T("ビットマップのロードに失敗しました"), _T("エラー"),MB_OK | MB_ICONWARNING); return 0; } hDC =GetDC(hWnd); hcomDC =CreateCompatibleDC(hDC); prebitmap= (HBITMAP)SelectObject(hcomDC,hbitmap);            (中略) break;                     case WM_LBUTTONDOWN: //2連続のシングルクリック防止 EnableWindow(hWnd,FALSE); SetTimer(hWnd, ID_TIMER1, 500, NULL); ← これが機能していない          (中略) break; case WM_PAINT: BitBlt( hDC, 0, 0, 1024, 690, hcomDC, 0, 0, SRCCOPY ); break; case WM_TIMER://機能しなくなってしまった部分 if(wParam==ID_TIMER1){ KillTimer(hWnd,ID_TIMER1); EnableWindow(hWnd,TRUE); }

  • BitmapをIDで指定したい

    お世話になります。 C++ 6.0 MFC で開発しております。 下記の方法で、ImageList_LoadImageを使用してHIMAGELISTを取得しています。 HIMAGELIST hImagList = ::ImageList_LoadImage(NULL, TEXT("bitmap5.bmp ),16, 0 CLR_NONE, IMAGE_BITMAP,LR_LOADFROMFILE"); そこで、ImageList_LoadImageの第2引数が現在TEXT("bitmap5.bmp )になっているのですが、(Resourceにbitmap5.bmpですでに登録している)IDB_BITMAP5を代わりに使用して、実現したいのですが、どのようにすればよいのでしょうか? ※MAKEINTRESOURCE(IDB_BITMAP5)を代わりにいれたのですが、失敗しました。 以上大変申し訳ございませんが、よろしくお願いします。

  • ビットマップのコピーについて

    はじめまして。 ビットマップ操作について勉強をしております。 現在、ビットマップファイルを読み込んでメモリDC上でコピーし、新しいファイルを生成するプログラムを作っております。 手順としては 1. LoadImageでBMPファイルを読み込み、ハンドルを取得。 hdcmem_old = CreateCompatibleDC ( NULL ); SelectObject( hdcmem_old , hBitmap_old ); 2. hdcmem_new = CreateCompatibleDC ( NULL ); hBitmap_new = CreateDIBSection( hdcmem_new , (BITMAPINFO*)&bmpInfoHeader , DIB_PAL_COLORS , (void **) &Pixel , NULL , 0 ); SelectObject( hdcmem_new, hBitmap_new ); 3. BitBlt( hdcmem_new , 0 , 0 , LCD_WIDTH , LCD_HEIGHT , hdcmem_old , 0 , 0 , SRCCOPY ) でデータを転送後、ビットマップファイルのヘッダを取り出し、&Pixelからビットデータを加えて新たなファイルを生成しているのですが、生成された画像を見ると全黒になっております。 メモリDCを完全に理解してないせいか、解決策がみあたりません。 もしよろしければ、解決策、またはヒントをご教授していただければと思います。 よろしくお願いします。

  • BASICで画像のx,y座標の取得方法について

    Active Basicでプログラムを書いています。 今、簡単なゲームを作ってみようと思い、プログラムを書いているのですが、画像の座標の取得の部分で躓いてしました。 画像Aに画像Bが触れたときに『アウト』とメッセージを出す、簡単な、物を避けるゲームなのですが、グローバルで、 Dim BombRect As RECT Dim HitoRect As RECT を定義して、画像が重なったかどうかを判定するときに、 GetWindowRect(hBmp04,BombRect) GetWindowRect(hBmp01,HitoRect) で、読み込もうとしましたが、座標が格納されてくれません。 hBmp01とhBmp04には、下のようにして画像を読み込みました。 'グローバル Dim hBmp01 As HWND Dim hBmp02 As HWND Dim hBmp03 As HWND Dim hBmp04 As HWND 'ウインドウ作成時 hBmp01 = LoadImage(0,".\画像\人\普通.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp02 = LoadImage(0,".\画像\人\右.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp03 = LoadImage(0,".\画像\人\左.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) hBmp04 = LoadImage(0,".\画像\爆弾\ボム.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE) もし、やり方をご存知の方がいらっしゃいましたら、すみませんが、ご教授お願いします。 また、もっと簡単な方法がありましたら、そちらも教えていただけると嬉しいです。

  • 画像操作について2

    どなたか助けてください。 下記ソースをチェックしていただけないでしょうか? ビットマップ画像処理を行うために、CreateDIBSection()で編集領域を 確保して、imageにコピーして画像操作を行いたいのですが、 Debug Assertion Failedというエラーがでます。 知識不足ということもあり、ソース自体に問題がある可能性の方が高いのですが、 根本的に画像操作に対する考え方が間違っているのでしょうか? ご教授よろしくお願い致します。 環境はVC++6.0 MFC ダイアログベースです BOOL C***Dlg::*******() { HBITMAP hBmp; BITMAPINFOHEADER bi; unsigned *bmbuf; image , MemDC, MemDC2はPublicです。 bi.biSize = sizeof(BITMAPINFOHEADER); bi.biWidth = 16; bi.biHeight = -40; //top-down bi.biPlanes = 1; bi.biBitCount = 32; bi.biCompression = BI_RGB; bi.biSizeImage = 0; bi.biXPelsPerMeter = 0; bi.biYPelsPerMeter = 0; bi.biClrUsed = 0; bi.biClrImportant = 0; hBmp=CreateDIBSection(NULL, (LPBITMAPINFO)&bi, DIB_RGB_COLORS, (void **)(&bmbuf), NULL, 0); CDC* pDC = this->GetDC(); MemDC.CreateCompatibleDC(pDC); SelectObject(MemDC.m_hDC,hBmp); MemDC2.CreateCompatibleDC(pDC); HBITMAP h_BMP = (HBITMAP)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDB_******), IMAGE_BITMAP, 16, 40, LR_CREATEDIBSECTION); HBITMAP h_OLD_BMP = (HBITMAP)::SelectObject(MemDC2.m_hDC,h_BMP); m_pbg1dc->BitBlt(42,16,100,100,&MemDC2,0,0,SRCCOPY); memcpy(image, bmbuf, 16 * 40 * 4); ::SelectObject(MemDC2.m_hDC,h_OLD_BMP); MemDC2.DeleteDC(); DeleteObject(hBmp); return TRUE; }