- 締切済み
VC++ MFC CFrameWndって・・・
こんにちわMFC初心者です MFCアプリケーションウィザードを利用してMFCの画面を作成するとCFrameWndを元にしたCMainFrameクラスが作成されますが、コレはプロジェクト起動時に一番最初にインスタンスが作成されるクラスと考えて良いのでしょうか? また、他のサンプルプログラムでCMainFrameクラス内のメンバとしてCWndクラスを元にしたCChildViewが定義されていますが、この場合はCChildViewはCMainFrameの子フォームになるのですかね? 更にCChildView内部でCImageクラスを元にしたimgOriginalが定義されていますが、これはCChildViewに設置するコントロールですかね?(VBでいうところのピクチャーコントロール見たいなモンですかね?) 目的として、特殊な画像形式を利用する為、CImageクラスを利用して画像表示が出来ないので、特殊な画像形式のファイルからピクセル単位のデータを取得して画像表示をしたいのですが、この時にCDCクラスを利用して画像表示したいのですが、上手く表示されません これは、自分のMFCに対する認識が間違っているのでは無いかと思い皆様に質問させて戴いた次第です 皆様、私の認識に間違いがないかどうか、コメントをお願い致します m(__)m
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>void CChildView::SetImagePixcel() あのう、このメソッド、誰がいつ呼んでるんでしょう? ですからぁ、ちゃんと説明してくれないとわからないんですって。 >子フォームのメッセージマップから呼び出される >OnFileOpenimageメンバ関数の中で これも。OnFileOpenimageってなんですか? それにCChildView、これだけですとCWndの派生クラスという情報しかわかりません。 普通にウィザード使うとSDIのViewでしたらCViewの派生クラスになるはずなんですが。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>コレはプロジェクト起動時に一番最初にインスタンスが作成されるクラスと考えて良いのでしょうか? 違います。CWinAppの派生クラスが一番最初に作成されます。 >また、他のサンプルプログラムでCMainFrameクラス内のメンバとしてCWndクラスを元にしたCChildViewが定義されていますが、 そんなものは、サンプルプログラムを実際に見ないとわかりません。 imgOriginalも同様。 >これは、自分のMFCに対する認識が間違っているのでは無いかと思い皆様に質問させて戴いた次第です とても間違ってると思います。どこまでがMFCか、どこからが参考にしたサンプルプログラム独自のものか再確認してください。 MFCが提供しているクラス、ウィザードが作成するクラスなら解説できる人はいると思いますが、あなたやサンプルプログラム内で定義しているクラスや関数は誰も解説できません。 画像の描画に関しては、CDCクラスを使おうとしているんでしたら説明できますよ。 >この時にCDCクラスを利用して画像表示したいのですが、上手く表示されません 特殊なことをいきなりするのではなく、BMPやDIBの表示から始めて、次に独自形式→BMPやDIBに変換という順番に進めていくべきです。
補足
taka_tetsuさま いつも助言有難う御座います 今回もインラインで回答して戴き有難う御座います。 もう一度、ソースコードを読んでみました CCImageApp::InitInstance()メンバ関数で メインフォームと子フォーム(CChildView)のインスタンスを生成している様に見えますので 子フォームのメッセージマップから呼び出される OnFileOpenimageメンバ関数の中で CDCを利用して描画したいのですが、上手くできません CDCにCChildViewが利用しているデバイスコンテキストを渡せば良いと思い void CChildView::SetImagePixcel() { COLORREF pixel; CDC *pCdc=this->GetDC(); pixel=RGB((BYTE)0,(BYTE)0,(BYTE)0); pCdc->SetPixel(10,10,pixel); } 上記の様に記載したのですが画面上に点が表示されなくて悩んでます 何処に問題箇所が判れば、是非ご指摘戴きたいと思っております よろしくお願い致します 以下、主要ソースを記載しました 〓〓CImage.h〓〓 class CCImageApp : public CWinApp { public: CCImageApp(); public: virtual BOOL InitInstance(); public: afx_msg void OnAppAbout(); DECLARE_MESSAGE_MAP() }; 〓〓CMainFrm.h〓〓 #pragma once #include "ChildView.h" class CMainFrame : public CFrameWnd { public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: CChildView m_wndView; } 〓〓ChildView.h〓〓 // CChildView window class CChildView : public CWnd { protected: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); public: virtual ~CChildView(); void SetImagePixcel(void); CImage imgOriginal; 〓〓CImage.cpp〓〓 BOOL CCImageApp::InitInstance() { CWinApp::InitInstance(); // Initialize OLE libraries if (!AfxOleInit()) { AfxMessageBox(IDP_OLE_INIT_FAILED); return FALSE; } AfxEnableControlContainer(); SetRegistryKey(_T("Local AppWizard-Generated Applications")); CMainFrame* pFrame = new CMainFrame; m_pMainWnd = pFrame; pFrame->LoadFrame(IDR_MAINFRAME, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, NULL); pFrame->ShowWindow(SW_SHOW); pFrame->UpdateWindow(); return TRUE;
お礼
>普通にウィザード使うとSDIのViewでしたらCViewの派生クラスになるはずなんですが。 試してみたら、Cviewの派生クラスが作成されました CViewの派生クラスのマウスダウンイベントを追加して CDCのSetPixelで点を描画したら上手く出来ました サンプルでは描画時点で別のダイアログボックスが最上位に来ていたので、すぐに点が消えてしまった様で描画されていない認識をしてしまった様です (尚且つCviewの派生クラスの変わりにCWndの派生クラスが生成されてました) ウィザードで作成されたMFCフォームと私のサンプルのMFCフォームでは、CWinAppの派生クラスのInitInstance()に記載された内容が随分違っており taka_tetsuさんに指摘されるまで、気にも留めてませんでした。 MFCの概念的な部分を勉強せずに質問し、回答者に混乱を招いた事を痛感しました もっと、もっとMFCを勉強して次回はクリティカルな回答をもらえる様に勤めます またよろしくお願いします。