MFCでのBITMAP作成について

このQ&Aのポイント
  • VC++2005MFCで開発しています。カメラからの画像入力の部分を作成しているのですがchar配列からのカラーbitmapの作成の仕方が分かる方いませんでしょうか?
  • 直接ファイルに書き込む方法ですとフォーマット通りに書き込めば良いとは思うのですが、画面表示をしたいのでCBitmap又はHBitmapで取得したいです。
  • 調べていると、モノクロだとSepBitmapBitsでできそうです。しかし、msdnを見るとカラーの場合はSetDIBitsを使用しろとあるのですが、SetDIBitsの項を見ると何か思っている用法と違いそうです。また、VC++.NETですとDrawing::Bitmap(( width, height, stride, format, scan0);でフォーマットを指定して作成できそうなのですが、それに相応するようなものはないかと探しているのですが見つかりません。すいませんがご教授お願いします。
回答を見る
  • ベストアンサー

MFCでのBITMAP作成について

VC++2005MFCで開発しています。 カメラからの画像入力の部分を作成しているのですがchar配列からのカラーbitmapの作成の仕方が分かる方いませんでしょうか? 直接ファイルに書き込む方法ですとフォーマット通りに書き込めば良いとは思うのですが、画面表示をしたいのでCBitmap又はHBitmapで取得したいです。 調べていると、モノクロだとSepBitmapBitsでできそうです。 しかし、msdnを見るとカラーの場合はSetDIBitsを使用しろとあるのですが、SetDIBitsの項を見ると何か思っている用法と違いそうです。 また、VC++.NETですとDrawing::Bitmap(( width, height, stride, format, scan0);でフォーマットを指定して作成できそうなのですが、それに相応するようなものはないかと探しているのですが見つかりません。 すいませんがご教授お願いします。

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

  • ベストアンサー
  • uyama33
  • ベストアンサー率30% (137/450)
回答No.3

回答2;続きです。 これは、画像ファイルに下に、 新しく勝手に作成したデータを追加して全体を一つの画像ファイルにしています。 勝手に追加しているデータ部分をカメラからの画像データにしてテストすれば 見えるようになると思います。 参考になれば幸いです。VC++2005を使っています。 if((dstfile = fopen(ct, "wb")) == NULL){ printf("Can not open crypted file. \n"); return; } srand( (unsigned)time(NULL) ); //in constracter strcpy(FName, pt);// = srcfile.GetFileName(); nsize = strlen(FName); //.GetLength();// length of file name. // 平文 fseek(srcfile, 0, SEEK_END); long filelen = ftell(srcfile); fseek(srcfile,0,0); fsize = filelen; //fsize = srcfile.GetLength();// as char 8 bit sidesize = int((4+1+(fsize/2)+1+(nsize/2))/nhsize) + 1; //sidesize = 1 + (int)sqrt((double)(4+1+(fsize/2)+1+(nsize/2)));// as short int 16 bit // Write the header of bitmap file. *((DWORD*)(&(bmpHeader[2]))) = 54+4*sidesize*(sidesize + nvsize); *((DWORD*)(&(bmpHeader[18]))) = nhsize; *((DWORD*)(&(bmpHeader[22]))) = sidesize + nvsize; *((DWORD*)(&(bmpHeader[34]))) = sidesize*(sidesize + nvsize); fwrite( bmpHeader,sizeof(char),54, dstfile); //dstfile.Write(bmpHeader, 54); j = rand(); // 16 bits k = nsize & 0x0000ffff; jj = (j<<16) + (j^k); *((unsigned int*)&tmpch) = jj;//32 bit fwrite( tmpch,sizeof(char),4, dstfile); //dstfile.Write(tmpch, 4);//32 bit j = rand(); // 16 bits k = nsize & 0xffff0000; jj = (j<<16) + (j^(k>>16)); *((unsigned int*)&tmpch) = jj;//32 bit fwrite( tmpch,sizeof(char),4, dstfile); //dstfile.Write(tmpch, 4);//32 bit j = rand(); // 16 bits k = fsize & 0x0000ffff; jj = (j<<16) + (j^k); *((unsigned int*)&tmpch) = jj;//32 bit fwrite( tmpch,sizeof(char),4, dstfile); //dstfile.Write(tmpch, 4);//32 bit j = rand(); // 16 bits k = fsize & 0xffff0000; jj = (j<<16) + (j^(k>>16)); *((unsigned int*)&tmpch) = jj;//32 bit fwrite( tmpch,sizeof(char),4, dstfile); //dstfile.Write(tmpch, 4);//32 bit for(i=0; i<nsize/2 ; i++){ j = rand(); // 16 bits k = (unsigned char)FName[2*i]; l = (unsigned char)FName[2*i+1]; jj = (j<<16) + (j^((k<<8)+ l)); *((unsigned int*)&tmpch) = jj;//32 bit fwrite( tmpch,sizeof(char),4, dstfile); //dstfile.Write(tmpch, 4);//32 bit } if(nsize%2 == 1){ j = rand(); // 16 bits k = (unsigned char)FName[nsize-1]; jj = (j<<16) + (j^((k<<8)+ 0)); *((unsigned int*)&tmpch) = jj;//32 bit fwrite( tmpch,sizeof(char),4, dstfile); //dstfile.Write(tmpch, 4);//32 bit } if(nsize%2 == 0){ j = rand(); // 16 bits k = 0; jj = (j<<16) + (j^((k<<8)+ 0)); *((unsigned int*)&tmpch) = jj;//32 bit fwrite( tmpch,sizeof(char),4, dstfile); //dstfile.Write(tmpch, 4);//32 bit } for(i=4+1+nsize/2; i<sidesize*nhsize ; i++){ j = rand(); // 16 bits if(1 == fread(tmprbuf, sizeof(char), 1, srcfile)){//1 == srcfile.Read(tmprbuf,1)){ k = (unsigned char)tmprbuf[0]; k ^= (unsigned char)key[(i-(4+1+nsize/2))%mn]; } else{k = 0;} if(1 == fread(tmprbuf, sizeof(char), 1, srcfile)){//1 == srcfile.Read(tmprbuf,1)){ l = (unsigned char)tmprbuf[0]; l ^= (unsigned char)key[(i-(4+1+nsize/2))%mn]; jj = (j<<16) + (j^((k<<8)+ l)); } else{jj = (j<<16) + (j^((k<<8)+ 0));} *((unsigned int*)&tmpch) = jj;//32 bit fwrite( tmpch,sizeof(char),4, dstfile); //dstfile.Write(tmpch, 4);//32 bit } tmprbuf[3] = 0; for(i=0; i<nhsize*nvsize ; i++){ fread(tmprbuf, sizeof(char), 3, nekofile); fwrite( tmprbuf,sizeof(char),4, dstfile); } fclose(nekofile); fclose(srcfile);//.Close(); fclose(dstfile);//.Close(); }

nori1112
質問者

お礼

CreateCompatibleBitmapでDDBのHBITMAPを作成し、取得したバッファを24bitの形式の配列に格納しなおして(8bit/pixのバッファから24bitGBR/pixの配列)SetBitmapBitsをしたら無事表示できました。 いまいち、DIBとDDBの違いと、ファイルでのBitmapと表示するためのオブジェクトとしてのBitmapの違いが分かっていなかったようです。 ベストアンサーは丁寧にソースコードを回答していただいたuyama33とさせていただきます。 ありがとうございました!!

nori1112
質問者

補足

補足遅くなってすいません。 質問にも書いたのですがファイルに落とせばいけそうなのですが、毎フレームファイルを作成していると時間のロスなので、ハンドルやクラスでの変換ができないかと思っています。 その後調べているとSetDIBitsで出来そうな感じもあり組んでいるところです。 結果出ましたら報告させていただきます。

その他の回答 (2)

  • uyama33
  • ベストアンサー率30% (137/450)
回答No.2

回答1;原始的だが以下のようにして扱いました。 #include "stdafx.h" #include <string.h> #include <stdlib.h> #include <stdio.h> #include <time.h> #include <math.h> typedef unsigned char uchar; typedef unsigned short ushort; typedef unsigned long DWORD; FILE* keyfile; FILE* srcfile; FILE* dstfile; FILE* nekofile; void bmp1(char* keyfn, char* pt, char* ct) // 暗号化 { int mode,klen; //,blen,rc; char c_mode[4], c_klen[8], c_key[64]; int nsize, fsize, sidesize; char FName[256], tmpfn[256], tmpfn2[256], nekofn[256], c; unsigned int j, k, l, jj; int i, mn; unsigned char tmpch[16]; unsigned char tmprbuf[16]; char key[64];//32]; unsigned char bmpHeader[54] = { 'B', 'M', /* [ 0] ファイルタイプ */ 54, 4, 0, 0, /* [ 2] ファイルサイズ 54+4*16*16=1078*/ 0, 0, 0, 0, /* [ 6] 予約 */ 54, 0, 0, 0, /* [10] ビットマップデータのシーク位置 */ 40, 0, 0, 0, /* [14] ここから始まるヘッダの高さ */ 16, 0, 0, 0, /* [18] ビットマップの幅 */ 16, 0, 0, 0, /* [22] ビットマップの高さ */ 0x01, 0, /* [26] プレーン数 */ 32, 0, /* [28] 1ピクセルあたりのビット数 (課題が4バイト指定されていたので32bitに変更) */ 0, 0, 0, 0, /* [30] 圧縮タイプ */ 0, 1, 0, 0, /* [34] ビットマップデータの長さ 16*16=256*/ 0, 0, 0, 0, /* [38] 水平解像度(px/m) */ 0, 0, 0, 0, /* [42] 垂直解像度(px/m) */ 0, 0, 0, 0, /* [46] カラーインデックス数 */ 0, 0, 0, 0, /* [50] 重要なカラーインデックス数 */ }; unsigned char bmpHeader2[54] = { 'B', 'M', /* [ 0] ファイルタイプ */ 54, 4, 0, 0, /* [ 2] ファイルサイズ 54+4*16*16=1078*/ 0, 0, 0, 0, /* [ 6] 予約 */ 54, 0, 0, 0, /* [10] ビットマップデータのシーク位置 */ 40, 0, 0, 0, /* [14] ここから始まるヘッダの高さ */ 16, 0, 0, 0, /* [18] ビットマップの幅 */ 16, 0, 0, 0, /* [22] ビットマップの高さ */ 0x01, 0, /* [26] プレーン数 */ 32, 0, /* [28] 1ピクセルあたりのビット数 (課題が4バイト指定されていたので32bitに変更) */ 0, 0, 0, 0, /* [30] 圧縮タイプ */ 0, 1, 0, 0, /* [34] ビットマップデータの長さ 16*16=256*/ 0, 0, 0, 0, /* [38] 水平解像度(px/m) */ 0, 0, 0, 0, /* [42] 垂直解像度(px/m) */ 0, 0, 0, 0, /* [46] カラーインデックス数 */ 0, 0, 0, 0, /* [50] 重要なカラーインデックス数 */ }; strcpy(nekofn,"nyanya2.bmp"); if( fopen_s(&nekofile, nekofn, "rb") != 0){ printf("Can not open neko file. \n"); return; } fseek(nekofile,0,0); fread(bmpHeader2, sizeof(char), 54, nekofile);//srcfile.Read(bmpHeader, 54); int nhsize = *((DWORD*)(&(bmpHeader2[18]))); int nvsize = *((DWORD*)(&(bmpHeader2[22]))); int nfsize = *((DWORD*)(&(bmpHeader2[2])));//54+24*256*166, 1ピクセルあたり24=3*8ビット if((keyfile = fopen(keyfn, "rt")) == NULL){ // printf("Can not find key file for encryption. \n"); return; } fgets( c_mode, 4, keyfile ); fgets( c_klen, 8, keyfile ); fgets( c_key, 64, keyfile ); fclose(keyfile); strcpy(key, c_key); mode = atoi(c_mode); klen = atoi(c_klen); mn = 8; if(klen == 128){ mn = 16; } if(klen == 192){ mn = 24; } if(klen == 256){ mn = 32; } if((srcfile = fopen(pt, "rb")) == NULL){ printf("Can not open plane file. \n"); return; }

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

MFC使っていませんけどね…。 # VS2005Stdならあるので使える環境ではある。ただしC++をちゃんと習得しているわけではないが。 >char配列からのカラーbitmapの作成 そもそも、そのchar配列に入っているものってなんです? CBitmap::CreateBitmapIndirect()とかで作成することになるんじゃないですかね? API使ってHBITMAPでもいいのかもしれませんが。

nori1112
質問者

補足

補足遅くなってすいません。 カメラメーカーAPIによってchar配列にはピクセル値が入ってくるようになっています。 その後調べているとSetDIBitsで出来そうな感じもあり組んでいるところです。 結果出ましたら報告させていただきます。

関連するQ&A

  • VC++6.0でGDI+利用してメモリリーク?

    Microsoft VC++6.0 で、画像を表示するアプリケーションを作っていて、GDI+ で様々な画像を呼び出せるようにしています。 Gdiplus::Bitmap* pGdiBitmap = Gdiplus::Bitmap::FromFile( ファイル名 ) ; で呼び出し、 HBITMAP hBitmap ; pGdiBitmap->GetHBITMAP(color , hBitmap) によりHBITMAPを取得し、 CBitmap* pBitmap をクラス内に用意し、BitBlt() 関数で画像データを pBitmap にコピーし、その後 delete pGdiBitmap で削除しています。CBitmap* pBitmap にデータを保持していればいいので。 しかし、ファイルを「開く→閉じる」を繰り返し20回や30回行うと、画像を読み込めなくなりました。 最初に調べたのが、 「pGdiBitmap を読み込んだ後に pGdiBitmap->GetHBITMAP() を実行すると戻り値が、 OutOfMemory = 3」 でした。 そこで、タスクマネージャでメモリを見ながら画像を何度も開くと、開いた画像を閉じてもメモリはそんぽままで、画像を開く度にメモリが増え、150Mとかになって、メモリ不足になることがわかりました。  これは、delete pGdiBitmap ではダメと言うことですか?それとも、プログラムがおかしいでしょうか。 Windows7 , Microsoft VC++6.0 Professional Edition , (Microsoft Platform SDK) class CMyPicture { public (コンストラクタなど) void LoadPicture(LPCTSTR lpszFilename); protected: CBitmap* m_pBitmap ; } void CMyPicture::LoadPicture(LPCTSTR lpszFilename) { HBITMAP hBitmap ; WCHAR wPath[MAX_PATH] ; ※ファイル名 lpszFilename をMultiByteToWideChar()で変換済み Gdiplus::Bitmap* pGdiBitmap = Bitmap::FromFile(wPath , TRUE) ; Status r = pGdiBitmap->GetHBITMAP( Color(0,0,0,0) , &hBitmap) ; ※ CDC dcMemory などを用意してBitBlt()で hBitmap から(CBitmap*)m_pBitmap に転送 delete pGdiBitmap ; } こんな感じです。 画像を開いて表示すること自体は成功していますが、画像を閉じてもメモリをどんどん使ってしまいます。 根本的に何か間違っていますか?GDI+をVC++6.0で使っていては限界なのでしょうか。 どなたか、教えていただけると助かります。

  • 丸いボタンの表示でCPU100%

    VC6.0でMFCアプリケーションを作成しています。 ・ダイアログベース ・背景はビットマップ(スタイルにWS_CLIPCHILDRENを追加) ・ボタンはビットマップ&非矩形(丸) これを作成し、実行するとCPU使用率が100%になってしまいます。 OnPaint()での描画をしなければ、ボタンが丸く表示されません。 ご存知の方は教えてください。 以下、ソース抜粋です。 メンバ CButton m_cbImage; CBitmap m_cBmpBack; CBitmap m_cBmpButton; HBITMAP m_hBmpBack; BITMAP m_bmp; HDC m_hDc; OnInitDialog(){ //背景ビットマップ m_cBmpBack.LoadBitmap(IDB_BITMAP_BACK); //ボタンビットマップ m_cBmpButton.LoadBitmap(IDB_BITMAP_BUTTON); HBITMAP hBmpButton = HBITMAP(m_cBmpButton); m_cbImage.SetBitmap(hBmpButton); // ウィンドウに関する情報を取得 // BMPサイズ取得 m_hBmpBack = HBITMAP(m_cBmpBack); GetObject(m_hBmpBack, sizeof(BITMAP), &m_bmp); // BMPデバイスコンテキスト作成 m_hDc = CreateCompatibleDC(NULL); // オブジェクトを選択する SelectObject(m_hDc, m_hBmpBack); // ボタン変形 CRect cRectButton; m_cbImage.GetClientRect(cRectButton); CRgn rgnButton; rgnButton.CreateEllipticRgn(cRectButton.Width() * 1 / 8, cRectButton.Height() * 1 / 8, cRectButton.Width() * 7 / 8, cRectButton.Height() * 7 / 8); m_cbImage.SetWindowRgn((HRGN)rgnButton, TRUE); } OnPaint(){ HDC hdc = ::GetDC(m_hWnd); BitBlt(hdc, 0, 0, (int)m_bmp.bmWidth, (int)m_bmp.bmHeight, m_hDc, 0, 0, SRCCOPY); ::ReleaseDC(m_hWnd, hdc); } 以上、よろしくお願いします。

  • GDI+の使用方法について

    現在VC++2010でWin32アプリケーションを作成していて、 最近GDI+の使用を試みているのですが・・・・ Bitmapのクローンを作成する場合に、PixelFormatを指定するとことですが、 PixelFormatはどのように定義するのでしょうか? Gdiplus::Rect *rect=new Gdiplus::Rect(0,0,OrgRect.right,OrgRect.bottom); PixelFormat pf; Bitmap1=Bitmap2->Clone(rect,pf.); とすると構文のエラーになってしまいます。 PixelFormatはDontcareにしたいのですが、PixelFormatはINT型になってしまっているらしく pf.Dontcareなどもできません。 そもそも、MSDNを確認していると、名前空間:System.Drawingとありますが、 名前空間にusing System.Drawing;と記述すると「Systemが定義されていません」 となっています。ファイルの参照?というものが必要なのでしょうか? Bitmap1からBitmap2へコピーする場合(クローンを作成する場合)は 実際どのように書けばいいのでしょうか? 質問内容がゴチャゴチャして申し訳ございません。 初歩的な質問で大変恐縮ですが、ご教示願います。

  • Win32APIを使って入力されたキーによって表示する画像を変えるプログラムについて

    Win32APIを使って入力されたキーによって表示する画像を変えるプログラムを今、VisualSutudio2005のVC++で作っている最中なのですが、 上手く画像が表示されず困っています。具体的には、キーボードからキーが入力されたらTranslateMessage関数でWM_CHARメッセージを送って、その値(wParam)をWM_CHARメッセージ内でTCHAR型の変数に代入し、InvalidateRect関数を使ってWM_PAINTメッセージを送って、再描画処理を行ってその中で、if(tchar == 'a') { hbitmap = (HBITMAP)LoadImage(NULL,BMP,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); SelectObject(hMemdc,hbitmap); GetObject(hbitmap,sizeof(BITMAP),&bitmap); BitBlt(painthdc,0,0,350,467,hMemdc,0,0,SRCCOPY); } という処理をしてaが入力されたら読み込んだ画像を表示!という形にしたいのですが、実際ウィンドウには表示されなくて悩んでいます。わかりにくくて誠に申し訳ありませんが、どなたかどうかご教授願えないでしょうか。何卒よろしくお願い致します。

  • 色の変更

    また分からないことが出来ましたので、よろしくお願いいたします。 今、openFileDialogで画像を読取、その画像の黒色を白色に変更してpicutreBoxに表示するプログラムを作成しています。 [C#] Bitmap img = new Bitmap(openFileDialog.FileName); Graphics g = Graphics.FromImage(img); System.Drawing.Imaging.ColorMap[] cms = new System.Drawing.Imaging.ColorMap[] {new System.Drawing.Imaging.ColorMap(), new System.Drawing.Imaging.ColorMap()}; cms[0].OldColor = Color.Black; cms[0].NewColor = Color.White; System.Drawing.Imaging.ImageAttributes ia = new System.Drawing.Imaging.ImageAttributes(); ia.SetRemapTable(cms); g.DrawImage(img, new Rectangle(img.Width + 10, 0, img.Width, img.Height), 0, 0, img.Width, img.Height, GraphicsUnit.Pixel,ia); g.Dispose(); PictureBox1.Image = img; という風に作成したのですが、色が変更されませんでした。 どこが違うのか分かられる方がいらっしゃいましたら、よろしくお願いいたします。

  • モノクロBMPがうまく作成できません。

    はじめまして、ハンドルネームから揚げ増し増しと申します。 VC++2005でモノクロのビットマップ(幅200pixel,高さ100pixel,上半分が白、下半分が黒)を作成しようとしたのですが、全部真っ黒のBitmapができてしまいます。どなたか、間違っている場所を教えて頂けませんでしょうか? ソースは以下のとおりです。 http://p01.sakura.ne.jp/program.txt

  • Open CVについて

    現在,OpenCVとVC++2008のC++/CLIでwindows formアプリケーションを作成しています。 フォーム上のpictureBoxにUSBカメラから取得した画像を,録画しながら,pictureBoxに表示させています。しかし,取り込んだ画像が,pictureBoxに収まり切っていないようです。(添付画像のようなに枠内の画像に対して,肌色部分しか,pictureBoxに表示されていない状態) コードは http://hisoap.jugem.jp/?eid=156 を参考に,以下のように記述しています。 CvCapture *capture srcImage = cvQueryFrame(capture); Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox->Width, pictureBox->Height); pictureBox->Image = bmpPicBox; Graphics^g = Graphics::FromImage(pictureBox->Image); Bitmap^ bmp = gcnew Bitmap(pictureBox->Width, pictureBox->Height, srcImage->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb, IntPtr(srcImage->imageData)); g->DrawImage(bmp, 0, 0, srcImage->width , srcImage->height); どのようにすれば,画像をpictureBoxにぴったりと表示させることができるでしょうか?

  • VB.NETにおける二値化処理の高速化

    いつも参考にさせて頂いております。 現在、VB.NET(VS2003/.NET Framework1.1)を使用して画像の二値化処理のプログラムを作成しております。 処理する事は簡単で、ビットマップファイルのRED要素を取り出し、閾値内なら白に変換して二値化するプログラムです。 以下がそのプログラムです。 ----- '変換する前の画像をファイルから読み込む Dim img1 As System.Drawing.Bitmap = New System.Drawing.Bitmap(filepath) '変換後のビットマップ Dim img2 As System.Drawing.Bitmap = New System.Drawing.Bitmap(img1.Width, img2.Height) '二値化処理 Dim b As Byte For i = 0 To img1.Width - 1 For j = 0 To img1.Height - 1 b = img1.GetPixel(i, j).R If b >= 閾値下限 And b <= 閾値上限 Then img2.SetPixel(i, j, Color.White) Else img2.SetPixel(i, j, Color.Black) End If Next Next PictureBox1.Image = img ----- これで処理は出来るのですが、ファイルが大きい場合は、非常に時間が掛かってしまいます。処理速度はCPUの速度にもよると思うのですが、できるだけ高速化したのですが、何かよい知恵があればご教授頂けると助かります。よろしくお願いいたします。 XP Pro SP2/VS2003/VB.NET/.NET Framework1.1

  • ダイアログの表示と同時に、ピクチャーボックスを塗る方法

    あるサイトの過去ログで以下を見つけました。 エラーは出ませんが、何も起こりません。 このコードは何をしようとしているのでしょうか? ************************* ダイアログ上にピクチャーボックスを配置して、ダイアログの表示と同時に、ピクチャーボックスを塗る方法。 まず、ピクチャコントロールをClassWizardのメンバ変数タブによりm_pictureとして実態を作成します。 その後、 class CPictureDlg { private: CBitmap m_bitmap; // ... }; BOOL CPictureDlg::OnInitDialog() { CDialog::OnInitDialog(); // ... CDC desktopDC; desktopDC.Attach ( ::GetDC ( NULL ) ); CDC memDC; memDC.CreateCompatibleDC ( &desktopDC ); m_bitmap.CreateCompatibleBitmap ( &desktopDC, 100, 100 ); CBitmap *pOldBitmap = memDC.SelectObject ( &m_bitmap ); CRect rcPicture ( 0, 0, 100, 100 ); CBrush brush; brush.CreateStockObject ( WHITE_BRUSH ); memDC.FillRect ( &rcPicture, &brush ); memDC.SelectObject ( pOldBitmap ); m_picture.SetBitmap ( ( HBITMAP ) m_bitmap.GetSafeHandle () ); ReleaseDC ( &desktopDC ); memDC.DeleteDC (); }

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

    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); }

専門家に質問してみよう