• ベストアンサー

【VC++2005】複数ビットマップの表示方法

【VC++2005】複数ビットマップの表示方法 BMPファイルを読み込み、ピクチャーコントロールに表示する方法を以下を参考に作成しました。 →http://www-higashi.ist.osaka-u.ac.jp/~k-maeda/vcpp/sec4-1bmpfile.html そこから今度は、複数のBMPを読み込み、画面に連結して表示させたいと思いましたが、どのように行えば実現可能なのか検討もつきません・・・。 参考になりそうなサイト等、ご存知の方がおられましたらご教授お願いいたしますm(__)m

  • ya-cha
  • お礼率68% (184/268)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

BitBltの第2、第3引数で、元の画像を新しい画像のどこにコピーするかが指定できます。 なので、例えば100×100のサイズの画像2つを横に並べたいなら、1枚目のコピー先を(0,0)とし、2枚目のコピー先を(100,0)にします。

その他の回答 (1)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

本題とはそれてしまいますが御容赦を 提示されているURLではWM_PAINTの中で画像の読み込みを行っています 少ないファイルならかまわないとおもいますが もし大量のファイルを同時に開きたいならこの方式は好ましくありません (再描画の度にDISKへのアクセスが発生します -- レスポンスの低下になります) WM_PAINTではあくまで表示だけを行って画像ロードは別のアクションで 行うようにした方がいいでしょう(既にそうやられてるのかもしれませんが)

関連するQ&A

  • VC++で困ってます・・・。

    VC++で、ビットマットフォーマットをする。課題がでました。 課題は、ピクチャーボックスにbmpファイルを表示して、表示したbmpからボタンを使って、ラベルや、テキストボックスに、そのbmpのバイト数や、画像に関する、情報を表示する課題です。 今は、ピクチャーボックスから画像を出すことはできたんですが、その後にどうやって画像に関する色のバイト数や、情報を表示するかわかりません。 どこを、いじってプログラムを作っていくかもわからない状況です。 初心者なんで、プログラムの例や、ビットマップファイルに使うプログラムとかいろいろ教えてください。

  • 【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 ; }

  • ビットマップ(表示速度とサイズ)

    タバコサイズのLCDのデータを取り込んでPC上に描写させています。 小さくて見難いLCDを、PCの画面上で大きく表示させています。 私はSHでファームを作っていて、アプリはVCで作られた既存のもので動かしています。 SHから送られたセグメントの情報をもとに、ビットマップファイルを数百枚貼り付けて表示しているようです。 それで、このLCDデータを表示させている(ビットマップを貼り付けている)処理が重たいくて困っています。 PCの環境にも依存するのかもしれませんが、たとえばLCD全点灯させたときなどは、表示させるのに約2秒くらいかかっています。 各ビットマップファイルのサイズをみると600kバイトくらいあります。 そこでFireWorksをつかって8bitサイズにしたところ、200k位になったのですが・・いざ動かしたら、画面が化けて原型をとどめていませんでした。 VCは無知なのでよくわからないのですが、CreateDIBitmapという関数の設定とかをいじる必要があるのでしょうか? 長々とわかりにくい文章になってしまいましたが、要は処理速度を上げる方法を知りたいです。 よろしくお願いします<(_ _)>

  • VC++でマウスホイールイベントを使いたいのですが

    VC++2010のフォームアプリケーションについての質問です。 フォームに設置したピクチャーボックス上でマウスホイールをすることで、ピクチャーボックスに表示されている画像(BMP)を拡大・縮小できるようにしたいのですが… 色々と試しているのですが、 ・マウスホイールのイベントが反映されない ・拡大縮小のやり方がわからない です。 どなたかご教授頂けると幸いです。

  • VC++のマネージ形式での課題で・・・。

    VC++で、ビットマットフォーマットをマネージ形式でをする。課題がでました。 課題は、ピクチャーボックスにbmpファイルを表示して、表示したbmpからボタンを使って、ラベルや、テキストボックスに、そのbmpのバイト数や、画像に関する、情報を表示する課題です。 今は、ピクチャーボックスから画像を出すことはできたんですが、その後にどうやって画像に関する色のバイト数や、情報をマネージ形式で表示するかわかりません。 プログラムつくってもエラーばっかでわかりません。 例として、ボタン1をクリックして、ボタン1でラベルにbmpのバイト数を出したいんですがエラーします。 プログラム例は、  botton1 click ・・・ { bitmap^bmp; bmp = Bitmap("bmpのファイル名"); label1->Text = bmp; }   これで、ずっとエラーします。誰か適切なアドバイスください。いろいろサイトみてもMFC形式のやりかたばかりでわかりません。 マネージ形式でのやり方を教えてください。

  • ビットマップ表示と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); }

  • ビットマップの描画方法

    こん○○は。 BCB5を使ってますが、 高速にビットマップを描画する方法はないでしょうか? TImage コンポーネントを使用し Picture->Bitmap->Canvas->Pixels[x][y] へ SDKから取得したカメラ画像データをTColor RGB(r,g,b)で設定しています。 フォームに画像が表示されるまで1秒ほどかかるためコマ送り状態になっています。

  • CADデータを表示したい

    AutoCAD(LT)で作ったデータを自分のプログラムで表示したいのですが、どういった手法を用いれば実現できるのか悩んでおります。表示することさえできればよくて編集機能などは必要ありません。 ただ拡大縮小やスクロールは必要なのでビットマップとして表示する方法は使えません。 メタファイルとかDXF形式を利用するのかなと漠然と考えているのですが、具体的な方法や参考となるサイトなどアドバイス頂けると幸いです。 環境:Windows Me,VC++6.0(SDK),AutoCAD LT 2000i

  • Bitmapを重ね合わせる方法

    最近プログラミングを始めた初心者です。 環境はXP SP2 及びVC++6.0 です。 Win32APIのみを用いてプログラミングしております(MFCは使えません)。 宜しくお願い致します。 やりたいことは、あるビットマップを背景にして(bmpback.bmp)、その上に、bmpback.bmpよりサイズが小さいbmp1.bmpとbmp2.bmpを、WM_TIMERを使って交互に表示させる、です。 その際、WM_TIMER内でbmpback.bmpとbmp1.bmp(又はbmp2.bmp)を重ね合わせたbitmapを作成し、そのbitmapをWM_PAINT内でBitBltなどを用いてメモリDCからクライアント領域用のDCに転送して、ディスプレイに表示させたいと考えています。 検索したところ、以下のリンクに正に同じ質問があったのですが、難しくて理解出来ませんでした。 http://oshiete1.goo.ne.jp/qa1474735.html 回答者様が、良回答20ptで書かれている内容の、 >最終的に表示したい大きさのビットマップをメモリDCに割り当てて、 >そのメモリDCに対して10回のBitBltを行います。 の部分です。 最終的に表示したい大きさのビットマップ、というのが私の場合bmpback.bmpになると思いますが、例えばbmpback.bmpがSelectObject()でメモリDCに関連付けされているとして、そのメモリDCにbmp1.bmpをBitBltで転送する場合、bmp1.bmpに関連付けられるべきDC(デバイスコンテキスト)は何になるのでしょうか? (メモリDC→メモリDCかなあとも思ったのですが、それだとbmp1.bmpを紐付けした時点でbmpback.bmpが消えてしまうような気がして、ちょっと違うかなあと) 分かり辛い説明で申し訳ありませんが、知りたいことは、あるBitmapに別のBitmapをBitBltで転送して重ね合わせたい場合、コピー元のビットマップに関連付けるDCは何にすべきか、ということです。 本当は透過処理もしたいところですが、それは後で調べることにしてまずはBitBltで動作を見たいと思っています。 宜しくお願い致します。

  • 配列を使ったビットマップクラス

    VC++を使ったフォームアプリケーションでビットマップなどの画像を表示させ、ピクセル処理を施せるプログラムを作りました。このプログラム上ではピクチャボックスを1つ用意していますが、今後もっと多くのピクチャボックスが必要になってきます。以下のプログラムではBitmapクラスのbmpをピクチャボックス1の画像に入れています。単純にBitmapクラスのbmpを増やせば(例:bmp1)、ピクチャボックスが増えても平気ですが、処理の関係上配列を使いたいと思っています。なので下に書いてあるプログラムのbmp->という部分をbmp[0]->というふうに変えたいと考えています。自分なりに調べて(1)、(2)の部分を変えればいいと思うのですがどうもうまくいきません。わかる方がいたらご教授ください、おねがいします。 #pragma once namespace bmp { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; using namespace System::Text; using namespace System::Collections::Generic; /// <summary> /// Form1 の概要 /// /// 警告: このクラスの名前を変更する場合、このクラスが依存するすべての .resx ファイルに関連付けられた /// マネージ リソース コンパイラ ツールに対して 'Resource File Name' プロパティを /// 変更する必要があります。この変更を行わないと、 /// デザイナと、このフォームに関連付けられたローカライズ済みリソースとが、 /// 正しく相互に利用できなくなります。 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクタ コードを追加します // bmp = nullptr; ……… (1) //Bitmap^ bmp[300]; }      //省略// #pragma endregion //private: array<Bitmap^>^ bmp = gcnew array<Bitmap^>(300); ……… (2) private: Bitmap^ bmp; private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { bmp = gcnew Bitmap("C:/Documents and Settings/Owner/デスクトップ/lena.bmp",true); pictureBox1->Image = bmp; } private: System::Void pictureBox1_Click(System::Object^ sender, System::EventArgs^ e) { /*bmp = gcnew Bitmap("C:/Documents and Settings/Owner/デスクトップ/lena.bmp",true);*/ int x,y; int w = bmp->Width; int h = bmp->Height; for(x = 0; x < w; x++){ for(y = 0; y < h; y++){ if(x < (w * 0.05) || y < (h * 0.05) || (y > (h - (h*0.05)))&&(y < h) || (x > (w - (w*0.05)))&&(x < w)){ Color pixelColor = bmp->GetPixel( x, y ); Color newColor = Color::FromArgb( 255, 0, 0 ); bmp->SetPixel( x, y, newColor ); } } } pictureBox1->Image = bmp; } private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { } }; }

専門家に質問してみよう