- ベストアンサー
MFCでJPEG画像を表示するプログラムの初期化方法について
- MFCでJPEG画像を表示するプログラムの初期化方法について教えてください。
- 現在はOnPaint()関数内でCreateCompatibleDC関数を使用して初期化を行っていますが、PreCreateWindow関数などの初期化関数内に移したいと考えています。
- また、CreateCompatibleDC関数を再描画のたびに呼び出すことも試しましたが、異常終了してしまいます。スマートな初期化方法をご教示いただけないでしょうか?
- みんなの回答 (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を破棄する際に選択を元に戻すのがセオリーです
お礼
うまくいきました、ありがとうございます!