MFCプログラミングについて教えてください。

同じドキュメントに対して、
通常の表示とOpenGL表示
2つのViewを作り、
切り替えボタンまで作ったのですが、
肝心のViewを切り替える方法が全く分かりません。

MDIなので、childframeで操作するのでしょうか?

ご教示よろしくお願い致します。

A 回答 (1件)

正攻法だと全てのビューを検索して、表示させたい


ビューと一致するものがあれば、それをアクティブに
するという方法になると思います。
それらしいソースがあったので参考にどうぞ。


void CMainFrame::SwitchToView(CDocTemplate* pTemplate, CRuntimeClass *pViewClass)
{
CMDIChildWnd* pMDIActive = MDIGetActive();
CDocument* pDoc = pMDIActive->GetActiveDocument();
CView* pView;

POSITION pos = pDoc->GetFirstViewPosition();
while (pos != NULL) {
pView = pDoc->GetNextView(pos);
if (pView->IsKindOf(pViewClass)) {
// 要求されたビュークラスはすでに作成されているので、
// それを表示する
pView->GetParentFrame()->ActivateFrame();
return;
}
}

// 要求されたビュークラスはまだ作成されていない
CMDIChildWnd* pNewFrame = (CMDIChildWnd*)
pTemplate->CreateNewFrame(pDoc, NULL);

if (pNewFrame == NULL)
return;

pTemplate->InitialUpdateFrame (pNewFrame, pDoc);
}



使えるかどうかわかりませんが、子ウィンドウのポインタがわかっていれば、
CMDIFrameWnd::MDIActivate()
でもできるかもしれません。
(CMDIChildWndクラスにも似たようなメンバがあります)
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QMFC:MDIにおけるビューのアクティブ化

・環境
VisualStudio2008SP1+FeaturePack
Windows7 64bit

タブドキュメント形式でMDIアプリを作っているのですが、複数ドキュメントがある際にプログラムから任意のビューを安全にアクティブ化させる方法がわからずに困っております。CMainFrame::SetActiveViewメソッドを使用すると指定したビューがアクティブになり所望の動作になるのですが、この方法だとドキュメントをクローズするときに以下の例外が出て怒られます。SetActiveViewはビューのOnCreate内で実行しています。

 アクティブ化を解除しているアクティブ化コンテキストは、最近アクティブ化されたものではありません。

こういった状況に遭遇しない方法を探っているのですが使用するAPIと適切な使用タイミングがつかめず困っております。どなたかにご教授いただければ幸いです。

Aベストアンサー

ちょっと今環境がないのでテストしていませんが
これでどうでしょうか?

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200302/03020076.txt

QMFC MDIでステータスバーの追加。

Vd++6.0 MFC。

MDIにてプログラムを作成しているのですが、
親ウィンドウにはステータスバーがついているのですが、
子ウィンドウにはついていません。

子ウィンドウごとにそれぞれのステータスを表示しようと思っているのですが、
ステータスバーを作成する方法がわかりません。

そなたか、ご存知の方宜しくお願い致します。

足りない部分は補足させていただきます。

Aベストアンサー

------------------CPP------------------

// MainFrame.cpp のグローバル変数 indicators と同じもの
static UINT IDArray[] =
{
ID_SEPARATOR, // ステータス ライン インジケータ
ID_INDICATOR_KANA,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
m_bar.Create(this);

// CMainFrame::OnCreate() 内と同様の処理
m_bar.SetIndicators(IDArray, sizeof(IDArray)/sizeof(UINT));

// ↓メインウィンドウのステータスバーからペインスタイルのコピー
int nIndex;// ペインインデックス
UINT nID;// ペインインジケータID
UINT nStyle;// ペインスタイル
int cxWidth;// ペイン幅
for(nIndex = 0; nIndex < sizeof(IDArray)/sizeof(UINT); nIndex++) {
((CStatusBar*)GetMessageBar())->GetPaneInfo(nIndex, nID, nStyle, cxWidth);
m_bar.SetPaneInfo(nIndex, nID, nStyle, cxWidth);
}
// ↑ここまで

return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}




ペインのインジケータIDが ID_SEPARATOR のときに凸の
状態のペインになるらしいです。独自の設定にする場合は
CStatusBar::SetPaneInfo()等を使用して下さい。

ただ、MFCのMDIやSDIはステータスバー・メニュー
等に、独自の内部処理がデフォルトで入っているので(
CStatusCmdUIなる内部クラスが管理する)、MFCの
標準の画面設計と少し異なる方法を取りたい場合は注意が
必要です(といってもどうしようも無いが)

APIの CreateStatusWindow() を使用して1から自分好みに
完全アレンジするという手もありますが、ビューの描画領域の
再計算等を全て自分で実装しなければならなくなります。
要するに結論:一応同じものは実現できますが(同じ過ぎて
むしろ気味が悪い)、親ウィンドウのステータスバーがそもそも
変だということで考えておいて下さい。

------------------CPP------------------

// MainFrame.cpp のグローバル変数 indicators と同じもの
static UINT IDArray[] =
{
ID_SEPARATOR, // ステータス ライン インジケータ
ID_INDICATOR_KANA,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
m_bar.Create(this);

// CMainFram...続きを読む

QMFC ダイアログ→MDI風に変更

ダイアログベースで画面作成をしていたのですが、
MDIのように左右のペインの大きさをドラッグして変更出来るようにしたいのですが、
どんな方法があるでしょうか。
VisualStudioとかでもペインの大きさをドラッグして変更できますよね。
あんな感じです。
MDIだと簡単に出来るのでしょうが、既にダイアログベースにしてしまっています。

宜しくお願い致します。

Aベストアンサー

こんにちは。
VisualStudioのようなドッキングペインではなく、ただ単に左右の大きさを変えたいということであれば方法はいくつかあると思います。
(1)スプリッターウィンドウ(CSplitterWnd)をダイアログ上に貼り付けて使う方法。
スプリッターウィンドウ内の貼り付ける子ウィンドウが 2 枚必要になります。
(2)左右用の子ウィンドウを用意して、ダイアログの上に置いて境目を操作を自前で実装する。

どちらにしても、ダイアログ上に置いたコントロールは、すべて左右用の子ウィンドウに移す必要があります。
メッセージの送信先に注意してください。SetOwnerを有効に使ってください。

スプリッターウィンドウを使う場合は少々癖がありますので注意してください。

QMFCのView終了時の終了確認

環境:WindowsXP + VisualStudio2010 + MFC

MFCのViewの終了処理に関して質問があります。
Viewの右上の×印をクリックした際に終了確認を表示して
ユーザーが終了を拒否した場合、Viewの終了を無効にしたい
と考えています。

MFCでこのような制御を行うには、どのようなイベントで
どのような処理をすれば良いのでしょうか?

ご存知の方がいたら教えて下さい。
どうぞ宜しくお願い致します。

Aベストアンサー

Viewと言われているのかわからないので違うかもしれませんが。
×印はシステムコマンドに該当する機能ですから、WM_SYSCOMMANDを使えば可能ですよ。
×印がクリックされるとnIDにSC_CLOSEが送られてきますから、メッセージボックスを出してNOならデフォルト処理を省略するようにすればいいです。

但し処理する場所はCMainFrameの方です。
WM_SYSCOMMANDのハンドラ作って、以下の感じで制御できます。

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
  if((nID != SC_CLOSE) || ((nID == SC_CLOSE) && (MessageBox(_T("終了しますか?"), _T("終了"), MB_YESNO) == IDYES))) {
    CFrameWndEx::OnSysCommand(nID, lParam);
  }
}

QMFCのマルチドキュメントで

VisualC++.net MFCのウィザードでマルチドキュメントのアプリケーションを作成しました。
起動時はウィンドウが1つだけ開いているのですが、起動時に複数のウィンドウを起ち上げるようにするには、どの部分を変更したらよいのでしょうか?
ご存知の方おしえてください。

Aベストアンサー

BOOL CXXXXApp::InitInstance()
の最後(return TRUEの前)に次の行を追加すればよいと思います。

pMainFrame->SendMessage(WM_COMMAND,ID_FILE_NEW);


人気Q&Aランキング

おすすめ情報