![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
MFCでJPEG画像を表示するプログラムを OnPaint() の中に書いていたのですが・・・
:
bool m_bImageMemDCInit;
CImage m_Image;
CBitmap *m_pImageBitmap;
CDC m_ImageMemDC;
:
:
void CChildView::OnPaint()
{
CPaintDC dc(this);
if(!m_bImageMemDCInit){
m_bImageMemDCInit = true;
// イメージをロード
m_Image.Load("test.jpg");
m_pImageBitmap = CBitmap::FromHandle(m_Image);
m_ImageMemDC.CreateCompatibleDC(&dc);
m_ImageMemDC.SelectObject(m_pImageBitmap);
}
// 描画
dc.BitBlt(0, 0, 256, 256, &m_ImageMemDC, 0, 0, SRCCOPY);
}
このように、Load や CreateCompatibleDC などの初期化にあたる処理を、起動時に1度しか処理しないように書いています。
しかし、このプログラムではあまりに汚い。どうにかして PreCreateWindow などの初期化関数内に書きたいのですが、CreateCompatibleDC 関数で CPaintDC* を渡す必要があるので、OnPaint 関数内に書かざるを得ないのです。
(Loadだけなら初期化関数内に移せるのですが・・・)
いっそ CreateCompatibleDC を再描画のたびに呼んでもいいのでは? と思い、やってみると異常終了してしまいました。
また、CPaintDC dc(this); を PreCreateWindow 関数内に書いても異常終了しました。
どなたかスマートな方法をご存知でしたら、ご指導願います m(_ _)m
No.1ベストアンサー
- 回答日時:
PreCreateWindowで CPaintDC(this)としてもエラーになるのは当然です
CPaintDCはウィンドウハンドルを必要とします
しかし PreCreateWindowではまだウィンドウハンドルは作成されていません
# ウィンドウ作成の前処理なので当然ですが ・・・
WM_CREATEメッセージに対するイベントハンドラOnCreateかCreateで処理します
OnCreateでやるなら
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: ここに特定な作成コードを追加してください。
return 0;
}
といったスケルトンを VC++が作成してくれるので TODOコメントの部分で DCの初期化処理を行いましょう
int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: ここに特定な作成コードを追加してください。
m_Image.Load("test.jpg");
m_pImageBitmap = CBitmap::FromHandle( m_Image );
CClientDC dc(this);
m_ImageMemDC.CrateCompatibleDC( &dc );
m_ImageMemDC.SelectObject( m_pImageBitmap );
return 0;
}
といった具合です
本来は m_ImageMemDC.SelectObject( m_pImageBitmap ) の戻り値も記憶しておいて m_ImageMemDCを破棄する際に選択を元に戻すのがセオリーです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP 掲示板を資料を参考にして開発中ですが、画像がアップされません? 1 2022/11/21 06:44
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- ノートパソコン タブレット(dynapadN72)を知人に譲る時、どうしたら・・・ 4 2023/06/23 15:31
- Excel(エクセル) excelvbaでスライドショーを作りたい 2 2023/04/20 14:32
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
エクセルVBAでクリップボード内...
-
Excel VBA で処理中断(DoEvents...
-
VBSで応答不要のメッセージボッ...
-
ACCESS側からEXCELの書式を設定...
-
VBA kernel32 の意味
-
スロットゲームのプログラミング
-
VBA メッセージボックスを自動...
-
vb.netでバッチ処理
-
メッセージボックスのボタン名変更
-
Excel VBA 実行中に一瞬フリー...
-
Application.ScreenUpdating=Fa...
-
VB6 コマンドボタン クリック...
-
InvalidateRectがうまくいかない
-
VC++6.0 CDateTimeCtrl の暴走...
-
VB.NETのUsingキーワードの使い方
-
Excelのワークシートに行を挿入...
-
Excel VBA 自動的に閉じるMsgBox
-
スケジューリング方式
-
処理をとめるキャンセルボタン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
ACCESS側からEXCELの書式を設定...
-
VBSで応答不要のメッセージボッ...
-
VBA kernel32 の意味
-
エクセルVBAでクリップボード内...
-
【C#】 あるイベントから別イ...
-
Excel VBA で処理中断(DoEvents...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
-
Excel VBA 自動的に閉じるMsgBox
-
ASP.NETでのメッセージ画面を出...
-
メッセージBOXの「はい」「いい...
-
「キャンセル」ボタン付きの処...
-
B列に特定の文字列が入っている...
-
シャットダウン時のExcel強制終...
-
ASP VBScriptでスクリプト実行...
-
起動後直に実行するコードはど...
-
MFCのメニューバーのイベント取得
-
アクセスでのキー送信について
おすすめ情報