![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_10.png?5a7ff87)
No.1ベストアンサー
- 回答日時:
CRect Rect;
CDC memDC;
CDC *pDC;
CBitmap Bmp;
CBitmap *oldBmp;
void CPaintView::OnDraw(CDC* pDC)
{
CPaintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
pDC->BitBlt(0,0,Rect.Size().cx,Rect.Size().cy,&memDC,0,0,SRCCOPY);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
}
void CPaintView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO : ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
if(memDC==NULL)
{
pDC=GetDC();
GetClientRect(&Rect);
Bmp.CreateCompatibleBitmap(pDC,Rect.Size().cx,Rect.Size().cy);
memDC.CreateCompatibleDC(pDC);
oldBmp=memDC.SelectObject(&Bmp);
memDC.FillSolidRect(Rect,RGB(255,255,255));
ReleaseDC(pDC);
}
memDC.TextOut(point.x,point.y,"Hello");
Invalidate();
CView::OnLButtonDown(nFlags, point);
}
大まかにはこんな感じだと思います。
WM_DESTROYの時にでも
memDC、CBitmapの破棄を
適当に処理してください。
この回答への補足
ありがとうございます。質問させて頂きたいのですが
最初の行のCRECT Rect;からCBitmap *OldBmp;までを
Viewクラスのメンバー変数にし、
void CMyView::OnDestroy()
{
memDC.SelectObject(OldBmp);
Bmp.DeleteObject();
memDC.DeleteDC();
CView::OnDestroy();
}
を追加し、後はthulalaさんのご指摘どうり書かせていただいたのですが、ビルドは通っても実行するとフリーズするもしくはDebug Assertion Failedというウィンドウが表示されるます。OnPaintの中では何も書かなくてもよいのでしょうか? 恐縮ですが、もう一度アドバイス頂けないでしょうか?
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_10.png?5a7ff87)
No.4
- 回答日時:
Visual C++ 6.0 なら
ClassView内の鍵マークのついた赤い関数を右クリックして削除を選択します。
Visual C++ .NET なら
表示-プロパティウインドウのプロパティでWM_****と
たくさん書かれている項目があります。
そこで、追加のときと同様にクリックして、削除を選択します。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_10.png?5a7ff87)
No.3
- 回答日時:
**OnPaint関数は、イベントハンドらごと削除されましたか?
//DEL void CPaintView::OnPaint()
//DEL {
//DEL CPaintDC dc(this); // 描画用のデバイス コンテキスト
//DEL
//DEL // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
//DEL
//DEL // 描画用メッセージとして CView::OnPaint() を呼び出してはいけません
//DEL }
**こんな感じにしてもらえましたか?
**ヘッダーも同様
memDC.CreateCompatibleDC(pDC);が初期化作業です。
LButtonを最初に押すときに何も初期化していないので、if(memDC==NULL){}の中の関数が実行されて、memDCなどが構築されます。2度目のLButtonDownで初期化作業が済んでいるのでif(memDC==NULL){}は無視されます。
memDC=NULL;とはしません。
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_10.png?5a7ff87)
No.2
- 回答日時:
メンバー変数にするならば、
CDC *pDCをCDC *mDCに変更して、
OnLButtonDown()内のpDCをmDCに変更してください。
void C***View::OnDraw(CDC* pDC)
{
***
//もしかすると、
if(memDC!=NULL)
{
pDC->BitBlt(0,0,Rect.Size().cx,Rect.Size().cy,&memDC,0,0,SRCCOPY);
}
}
ウインドウが作成されたときに、まず描画がされます。
そのときに、memDCの中身が何も存在しないので
BitBltできずにエラーを起こしたのかもしれません。
へんな書き方をしましたが、
すみません。
MFCのViewには、普通は
OnDraw(CDC *pDC){}内部で描画します。
OnPaintには、何もしません。
コードを削除してください。
この回答への補足
度々すいません。本当にありがとうございます。
実行時のエラーは出なくなりましたが左クリックを押しても何もウィンドウに描画できません。あと、最初にmemDCをNULLで初期化しようとするとエラーが出て初期化できないのですが、どこでmemDCを初期化するのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ブラウザ) bingチャットの内容(縦長)をスクリーンショットで保存する方法 3 2023/02/28 02:13
- Gmail GmailでのPOPメールの保存先はどこなのか 3 2022/06/09 02:06
- CPU・メモリ・マザーボード ストリーミングの一時処理用の領域について 1 2023/04/11 21:55
- CPU・メモリ・マザーボード デスクトップPCのOS(C:)の空き領域がどんどん減ります。 9 2022/12/12 09:24
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Google Drive Google Drive (G:)の容量を、購入した容量と一致させるにはどうすればよいでしょうか? 1 2022/04/10 22:32
- ドライブ・ストレージ HDDの未割り当て領域が認識されない 7 2022/11/27 18:51
- その他(パソコン・周辺機器) NVIDIAのシェーダーキャッシュ 1 2022/05/30 22:36
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
- PHP php 入力画面から確認表示画面へ情報の受け渡しについて。 1 2023/06/07 18:00
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
Spreadで表全体を選択した場合...
-
文字の行間
-
TextBoxに文字を書いても表示さ...
-
MFCのタイマーのつかい方を教え...
-
ビットマップを表示させる(MFC)
-
UpdateData( FALSE); による文...
-
スピードの速い描画
-
FPS処理について
-
C#のタブコントロールについて...
-
ダイアログベースの再描画について
-
StretchBlt関数について
-
NVIDIAのシェーダーキャッシュ
-
C# ゲーム作成 FPSと描画...
-
GDI+のDrawStringを使って文字...
-
MFCでOnPaintのタイミング
-
word
-
ウインドウサイズを変更しても...
-
[VB.net] DataGridViewの列ヘッ...
-
VC++でテキストエディタを作ろ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PCで「使用可能な場合はグラフ...
-
[VB.net] DataGridViewの列ヘッ...
-
UpdateData( FALSE); による文...
-
NVIDIAのシェーダーキャッシュ
-
VB6,リストボックスの特定行の...
-
TextBoxに文字を書いても表示さ...
-
word
-
MFCでOnPaintのタイミング
-
エクセルでガンチャートを作成...
-
MFCのタイマーのつかい方を教え...
-
InvalidateRectの使い方について
-
VC++プログラムをつかったBMP画...
-
CScrollViewの使用方法について
-
VB.netでのライン描画方法がわ...
-
CStaticコントロールの静的イメ...
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
VBAにGDI+を参照させる方法
-
C++にて、塗りつぶされた円を描...
-
GetGlyphOutline() ご利用経験...
おすすめ情報