MFC SDI C++プロジェクトでCFormViews
を切り替える際に助けが必要です。私は長い間掘り下げていて、なぜ自分のコードが機能していないのか理解できません。インターネット(とこのサイトが含まれています)を検索して、MainFrm.cpp(CMainFrame
オブジェクト、CFrameWnd
から継承したオブジェクト)に2つの関数を追加してフォームを切り替えるためのチュートリアルをいくつか紹介しました。それらのうちの1つは、私が切り替えたいフォームのidを渡され、アクティブなビューへのポインタを取得し、そこから他のコードを実行します。ただし、GetActiveView()
は常にNULL
のポインタ値を返します。私はアクティブなフォームからボタンをクリックしているので、アクティブなビューがあることを知っています。私のコードは以下の通りです。これはちょうど私が参照している関数です。 MainFrm.cpp(新しいMFCプロジェクトを開始するときに作成される既定のウィンドウファイル)にあります。MFC SDI GetActiveView()は常にNULLを返します
これまでのところ、私はどこからでも現在のCDocument
かCView
を取得する方法についての協議は、私はその後、CFrameWnd
からGetActiveView
と呼ばれ、最初のアクティブなフレームを取得しようとしました、と私は、コードを試したことのMicrosoft Knowledge Baseからのコードを試してみました以下。すべて無駄に。私は明らかに何かを理解するためにMFCについて十分に知りません。私からのより多くの情報が必要な場合は、お尋ねください。私はおそらく私が持っているべきすべてを言及しなかった。私は学校プロジェクトのためにMFCを選択しましたが、UMLを作成したり、他のコードを書くことはできません。
void CMainFrame::SelectView(UINT ViewID)
{
// If the view the user selected is already displaying, do nothing
if (ViewID == m_CurrentView)
return;
// Get a pointer to the current view
CView* pCurrentView = GetActiveView();
// We are about to change the view, so we need a pointer to the runtime class
CRuntimeClass* pNewView = NULL; // Added = NULL because it wouldn't allow program to be run without initialization of pNewView
// We will process a form
// First, let's change the identifier of the current view to our integer
::SetWindowLong(pCurrentView->m_hWnd, GWL_ID, m_CurrentView);
// Now we will identify what form the user selected
switch (ViewID)
{
case IDD_CHOOSE_ITEM:
pNewView = RUNTIME_CLASS(CChooseItemView);
break;
case IDD_ITEM_INFORMATION:
pNewView = RUNTIME_CLASS(CItemInformationView);
break;
}
// We will deal with the frame
CCreateContext crtContext;
// We have a new view now. So we initialize the context
crtContext.m_pNewViewClass = pNewView;
// No need to change the document. We keep the current document
crtContext.m_pCurrentDoc = GetActiveDocument();
CView* pNewViewer = STATIC_DOWNCAST(CView, CreateView(&crtContext));
// Now we can create a new view and get rid of the previous one
if (pNewViewer != NULL)
{
pNewViewer->ShowWindow(SW_SHOW);
pNewViewer->OnInitialUpdate();
SetActiveView(pNewViewer);
RecalcLayout();
m_CurrentView = ViewID;
pCurrentView->DestroyWindow();
}
}
を追加します。どのようにさまざまなオブジェクトへのポインタを取得しますか?[リンク](http://forums.codeguru.com/showthread.php?281430-MFC-Doc-View-How-to-obtain-a-pointer-to-various-objects)非常に良い概観、この表からの1つは助けるべきです..! –
NULLを返すと、他のペイン、スプリッタなどがアクティブになることがあります。しかし、既存のCDocumentから関連付けられたCViewを取得することはできます。 –
ありがとうございますが、私はすでにあなたが与えたリンクを試しました。私はCMainFrameからCView(上のコードの一部)を取得しようとしました。他のペインとスプリッターはどのようにアクティブになりますか?私は1つのウィンドウと1つのフォーム(ウィザードが設定するデフォルトフォームが何であれ)を開くだけのデフォルトのSDIコードを使用しています。 MainFrameからCViewにアクセスする必要がある場合、CDocumentファイルからどのようにビューを取得できますか?私はCDocumentオブジェクトを作成し、その中から関数を呼び出しますか?ご協力いただきありがとうございます! –