アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
}

A 回答 (3件)

当方のVS2003ではクライアントエリアが透けてしまうのはスプリッターウィンドウのWS_VISIBLEプロパティが正しく設定されていない場合でした



開発アプリをデバッグ起動して
SPY++で クライアントエリアを指示してもウィンドウが見つかりませんか?

OnCreateClientがCWndクラスのメンバーとして記述されているようですが CMainFrameクラスのメンバーではないのでしょうか
このルーチンを通っているのでしょうか ・・・

BOOLが戻り値なのにクライアントエリアの生成が成功した際に値を返していないようですがこのあたりは大丈夫なのでしょうか・・・

この回答への補足

ありがとうございます。
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(){}
};

補足日時:2008/11/25 12:38
    • good
    • 0

> afxcmn.inl Line:266


だと TreeCtrlのようですので CTreeViewからの派生クラスで ClistCtrlA/Bを構築してみましょう

この回答への補足

ありがとうございます。
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(){}
};

補足日時:2008/11/25 03:47
    • good
    • 0

CListCtrlAおよびCListCtrlBを CListView(またはCView)の派生クラスから生成する必要がありますがこの辺りは確認なさったのでしょうか?



CListCtrlはコントロールとしてのListViewのMFCでのラッパーですのでCViewが必要とするメンバー関数が無いためにビューとして構築できないのが原因のように思います
    • good
    • 0

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