• ベストアンサー

DeleteObjectについて

環境 WIN98 VC++6.0 MFC にて DeleteObjectについて以下のように”xxx”の位置が異なる2種類の記述を見かけたのですが、どちらも正しいのでしょうか? そうだとするとどう使い分けるのですか? <記述1> CBitmap xxx; 略 xxx.DeleteObject(); <記述2> static HBITMAP xxx; 略 DeleteObject(xxx);

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

  • ベストアンサー
noname#5537
noname#5537
回答No.2

少し補足しておくと, CBitmap というのはクラスで,DeleteObject というメンバ関数を持っているので, CBitmap xxx; xxx.DeleteObject(); と書けるのです。 CDC もクラスで,DeleteDC というメンバ関数がありますから, CDC dc; dc.DeleeDC(); と出来ます。 HBITMAP と HDC はクラスじゃないです。

VitaminBB
質問者

お礼

回答ありがとうございます。 分かってるつもりで、似たようで同じでないパターンが 多く混乱してました。 これですっきりしました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#5537
noname#5537
回答No.1

どちらも正しいです。 使い分けは,xxx が CBitmap 型なら,  xxx.DeleteObject(); ですし,xxx が HBITMAP 型なら,  DeleteObject(xxx); です。

VitaminBB
質問者

お礼

回答ありがとうございます。 そう言うことなのですか。そうすると使い分けは、そう覚えておくしかないのですね。 さらに以下の場合は、これまたこういうものだということでしょうか? <記述3> CDC memDC; 略 memDC.DeleteDC();

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • リソースの低減について

    環境 WIN98 VC++6.0 MFC にて 下記サイトを参考にデスクトップ上で猫を動かしました。 http://plaza2.mbn.or.jp/~yoshio2/vcmemo4-1.html 参考サイトではデスクトップ上に絵を書いているだけですが、私は絵を2枚用意しタイマーで2枚の絵を切り替えて動かしました。 タイマーで 猫1用リージョン作成+猫1用絵のロード 猫2用リージョン作成+猫2用絵のロード を繰り返しました。 PGを起動しウィンドウズのリソースメーターで見てみると、どんどんリソースが減っていきます。 とりあえず以下のようにdeleteしてみましたが、改善されませんでした。 CRgn* m_rDone; CBitmap m_p[2]; 略 DeleteObject(*m_rDone); m_p[0].DeleteObject(); m_p[1].DeleteObject(); どう対処すれば良いでしょうか?

  • オブジェクトの削除について

    環境 WIN98 VC++6.0 MFC にて オブジェクトを使い終わってから削除している場合としていない場合が有るのですが、どうしてなのですか? 作ったオブジェクトはなんでもかんでも削除したほうが無難な気がしますが、本にのっているコードで削除してない場合も良く見かけます。 <削除していない>//著名な本のコード void Cxxx::OnDraw(CDC* pDC) {  CBitmap bmp;  bmp.LoadBitmap(nID);  略  //bmp.DeleteObject(); //■この記述が無い } <削除している>//ネット上でみかけたコード void CMainFrame::_SetBmp(CWnd* pBox,int nID,int  width,int height) // 単品 {  CDC* pDC=pBox->GetDC();  CDC memDC;  CBitmap bmp;  bmp.LoadBitmap(nID);  memDC.CreateCompatibleDC(pDC);  CBitmap* pOldBmp=memDC.SelectObject(&bmp);  pDC->BitBlt(0,0,width,height,&memDC,0,0,SRCCOPY);  memDC.SelectObject(pOldBmp);  bmp.DeleteObject();  memDC.DeleteDC(); }

  • MFCでのビットマップの扱いについて

    いつもお世話になってます、VC++初心者です。 ビットマップについての質問です。 MFCでCBitmapクラスを使うと、 ビットマップリソースのロード、そして表示とわりと楽に出来ました。 しかし、内容の方はさっぱりわかっていません(爆)。 今後色々触っていきたいのですが、 まず知りたいのは… ビットマップにはDDBとDIBがありますが、 ロードした時点でどのような扱いになるの? (使う方は意識しないでいいの?) CBitmap::operator HBITMAP演算子ってどうやって使うの? そもそも書式はどうなるの?(爆) ビットマップの知りたい位置の色情報を引き出すのってどうするの? って言う感じです(泣)。 どうぞ宜しくお願いします。

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

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

  • 変数の宣言場所について

    <環境> WIN98 VC++6.0 MFC  ダイアログベースにて 変数の宣言をグローバルにするとコンパイルはOKですが、 実行時にダウンしてしまいます。 グローバルに変えるだけでこのようなことがどうして起きるのでしょうか? CBitmap m_p[2];//エラー void CxxxDlg::OnPaint() { CBitmap m_p[2];//OK

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

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

  • LoadBitmapについて

    環境 WIN98 VC++6.0 MFC にて 下記のようにbmp.LoadBitmap(IDB_BITMAP1);を2度続けるとダウンしますがどうしてですか? void CAdvancedRgnDlg::OnPaint() { CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); bmp.LoadBitmap(IDB_BITMAP1);//2度続けるとダウンする CDialog::OnPaint(); }

  • MFCでのBITMAP作成について

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

  • OnPaint() とOnDraw()の違いについて

    OnPaint内に記述した下記コードでビットマップが描画されますが、OnDraw内だと描画されません。 どうしてなのか教えてください。 お願いします。 void CAbcView::OnPaint() { HBITMAP myDIB; // ビットマップのハンドル HBITMAP oldDIB; HDC hDC; // デバイスコンテキストのハンドル HDC hCompatiDC; // メモリデバイスコンテキスト PAINTSTRUCT ps; // クライアント領域の描画に使う情報を保持 if(!m_BmpInfo) return; hDC = ::GetDC(m_hWnd);//これでもOK ::BeginPaint(m_hWnd,&ps); hCompatiDC = ::CreateCompatibleDC(hDC);//hDC); myDIB = ::CreateDIBitmap(hDC,&m_BmpInfo->bmiHeader, CBM_INIT,m_BmpImage,m_BmpInfo,DIB_RGB_COLORS); oldDIB=(HBITMAP)::SelectObject(hCompatiDC,myDIB); BitBlt(hDC,5,25,m_BmpInfo->bmiHeader.biWidth, m_BmpInfo->bmiHeader.biHeight,hCompatiDC,0,0,SRCCOPY); 略 } 環境 WIN98 VC++6.0 MFC にて

  • LoadBitmapでCStringを使いたい

    VC++.NETでMFCアプリケーションを作っています。 CBitmap::LoadBitmapの定義では  BOOL LoadBitmap(LPCTSTR lpszResourceName); とあるのですが、リソースネームはCString型の変数では指定できないのでしょうか? ビットマップリソースがIDB_BMP1~IDB_BMP5まであり、状況により表示する画像を切り替える、ということをしたいのですが。   (略)  int n=1;  CString fname;  CBitmap bmp;  fname.Fromat("IDB_BMP%d",n);  bmp.LoadBitmap(fname);  pOldbmp = myDC.SelectObject(&bmp);  pDC->BitBlt(0, 300, 50, 77, &myDC, 0, 0, SRCCOPY);   (略) とすると画像が読み込まれません。 なお、LoadBitmapのfnameの部分を IDB_BMP1 と置き換えれば、画像は正常に表示できます。 MFC自体が初めてなので、分かりやすいご説明をいただけると嬉しいです。