View ClassからAfxWInApp()->OnFileOpenを呼ぶと叱られる

[戻る]
Baby Chicken [HomePage] 2009/05/22(金) 14:44:56
先日質問させて頂きました続きを改めてさせて頂きます。
Visual Studio 2008 Standard on Vista BusinessでMFC SDIで Windowsプログラムの勉
強をしています。
View ClassのOnKeyイベントで'o'キーがおされれば、Document ClassのSerialize関数の
ファイルを開く、と同じ事をしたいと思っています。先日のお二人の方のご指導によ
り、
    if (nChar == 'o') {
        CString fileName;
        CFile pFile;
        CFileDialog cf(TRUE);
        if (cf.DoModal() == IDOK) {
            fileName = cf.GetPathName();
            pFile.Open((LPCTSTR)fileName, CFile::modeRead);
            pDoc->dwFileLength = pFile.GetLength();
            if (pDoc->buf != NULL) delete[] pDoc->buf;
            if (pDoc->pbHitBufferTop != NULL) delete[] pDoc->pbHit
            pDoc->buf = new BYTE[pDoc->dwFileLength];            
            pFile.SeekToBegin();
            pFile.Read(pDoc->buf, pDoc->dwFileLength);
        }
    }
で、無事Document Classのbufに読み込むことができました。
また、AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FILE_OPEN);の方が簡単に作動し
ました。
しかし、AfxWinApp()->OnFileOpen()をこの部分で呼ぼうとすると、コンパイラに「宣言
を確認してください」と叱られます。
宣言に行くと、protected:になっており、MFCの階層図を見ると、View ClassはWinAppク
ラスから派生していないようです。
どのようにすれば良いかご指導お願いします。

Blue 2009/05/22(金) 14:56:10
単にCXXXAppにOnFileOpenを呼ぶメソッドをpublicで追加して(もしくはオーバーライドし
て)それを呼ぶだけでは?
virtualではないので、AfxWinApp()をキャストする必要がありますけど。


単に
>AfxGetMainWnd()->PostMessage(WM_COMMAND, ID_FILE_OPEN);
で十分なような気もしますが。

bun 2009/05/22(金) 16:44:37
失礼しました、protectedでしたか。
Blueさんの話通り、CWinApp派生クラスに public関数を作り、
その関数を通して、CWinApp::OnFileOpen()を呼べばOKです。

あと、昨日、聞こうとして忘れてしまったので、放ったらかしだったんですが、
機会が与えられたので、聞かせてください。

要するに、やりたいのは[Ctrl+O]で[ファイルを開く]を実現したいだけでは?
だとしたら、もっと一般的なやり方があります。
アクセラレータというものを調べてみてください。

Baby Chicken [HomePage] 2009/05/23(土) 05:45:05
[[解決]]
Blue様、bun様
ありがとうございます。
まだまだ、派生というものをきちんと分かっていませんので、このようなことになりま
した。すみません。
bun様
おっしゃる通り、単にCtrl+Oで「ファイルを開く」を実現したかっただけであること
に、今気付きました。我ながら馬鹿さに呆れています。
アクセラレータについて習得するようにします。度々のご指導ありがとうございます。

古いスレッドには追加発言できません。