• 締切済み

MFC CSplitter内にコントロールを表示させるには

Viewクラスを作り中に表示させる方法はわかったのですが、 分割ウィンドウ内にListCtrlなどを表示させるにはどうすればいいのでしょうか? コンパイルはできるのですが、afxcmn.inl Line:266の ASSERT(::IsWindow(m_hWnd));でエラーが出てしまいます。 何がいけないのか教えてください。お願いします。 //.h CSplitterWnd m_wndSplitter; virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext); //.cpp BOOL CWnd::OnCreateClient(LPCREATESTRUCT /*lpcs*/,CCreateContext* pContext) { if(!m_wndSplitter.CreateStatic( this, 1, 2, WS_CHILD | WS_VISIBLE ) ) return FALSE; if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CListCtrlA),CSize(200,300),pContext)) return FALSE; if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CListCtrlB) ,CSize( 200,300),pContext)) return FALSE; }

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

当方のVS2003ではクライアントエリアが透けてしまうのはスプリッターウィンドウのWS_VISIBLEプロパティが正しく設定されていない場合でした 開発アプリをデバッグ起動して SPY++で クライアントエリアを指示してもウィンドウが見つかりませんか? OnCreateClientがCWndクラスのメンバーとして記述されているようですが CMainFrameクラスのメンバーではないのでしょうか このルーチンを通っているのでしょうか ・・・ BOOLが戻り値なのにクライアントエリアの生成が成功した際に値を返していないようですがこのあたりは大丈夫なのでしょうか・・・

_jast
質問者

補足

ありがとうございます。 CWndはMainFrameじゃないウィンドウで名前をつけました。 ややこしくてすいません。CWndはCDockablePaneから派生させたクラスです。CWndPaneにしました。 BOOLもreturnを書いていませんでしたがなぜかコンパイルできていたので忘れていました。return 0; を追加しました。 SPY++で選択されたオブジェクトを見るとCWndPane自体は、MainFrameクラスになっていて、その中はControlBarになっています。 オーバーライドで呼び出されると思っていたOnCreateClientが 呼び出されていませんでした。これはどうやって呼び出せばいいのでしょうか? BOOL CWndPane::OnCreateClient(LPCREATESTRUCT /*lpcs*/,CCreateContext* pContext) { if(!m_wndSplitter.CreateStatic( this, 1, 2, WS_CHILD | WS_VISIBLE ) ) return FALSE; if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTreeTESTA),CSize(200,300),pContext)) return FALSE; if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CListTESTB) ,CSize( 200,300),pContext)) return FALSE; return 0; } class CTreeTESTA : public CTreeView { public: CTreeTESTA(){} virtual ~CTreeTESTA(){} }; class CListTESTB : public CListView { public: CListTESTB(){} virtual ~CListTESTB(){} };

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

> afxcmn.inl Line:266 だと TreeCtrlのようですので CTreeViewからの派生クラスで ClistCtrlA/Bを構築してみましょう

_jast
質問者

補足

ありがとうございます。 CTreeViewとCListViewを作りコンパイル後起動できました。 しかし、分割もされず、裏側が透けたウィンドウが出来上がっただけでした。どうすればコントロールが表示されるんでしょうか? CListViewも同じように作りました。 BOOL CWnd::OnCreateClient(LPCREATESTRUCT /*lpcs*/,CCreateContext* pContext) { if(!m_wndSplitter.CreateStatic( this, 1, 2, WS_CHILD | WS_VISIBLE ) ) return FALSE; if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTreeTESTA),CSize(200,300),pContext)) return FALSE; if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CListTESTB) ,CSize( 200,300),pContext)) return FALSE; } class CTreeTESTA : public CTreeView { public: CTreeTESTA(){} virtual ~CTreeTESTA(){} };

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

CListCtrlAおよびCListCtrlBを CListView(またはCView)の派生クラスから生成する必要がありますがこの辺りは確認なさったのでしょうか? CListCtrlはコントロールとしてのListViewのMFCでのラッパーですのでCViewが必要とするメンバー関数が無いためにビューとして構築できないのが原因のように思います

関連するQ&A