(MFC)タブの中にダイアログを表示出来ません。Assertが出ます。

[戻る]
てけてけ 2015/02/11(水) 03:47:54
初投稿です。よろしくお願いします。
現在VC++2013 MFC(ダイアログベース)を使用
しています。
下記URLを参考にタブ表示を行おうとしています。

http://blog.livedoor.jp/infoport/arch
ives/50278713.html

しかし、
//タブコントロールの初期化処理
CRect r;
m_pg1.Create(CPage1::IDD,this);
m_pg2.Create(CPage2::IDD,this);
※※※※※※※※※※※※※※※※※※※※※※※※※
m_pg1.GetClientRect(&r);
※※※※※※※※※※※※※※※※※※※※※※※※※
r.OffsetRect(40,40); // ここの数字は適宜
直す
m_pg1.MoveWindow(&r,false);
m_pg2.MoveWindow(&r,false);

m_tab.InsertItem(0,"ページ1");
m_tab.InsertItem(1,"ページ2");
// 最初のページを表示
m_nCurPage = 0;
OnTcnSelchangeTab1(0,0);

上記※の中の箇所でAssertが出てしまいます。
Assertは以下の箇所です。
_AFXWIN_INLINE void 
CWnd::GetClientRect(LPRECT lpRect) 
const
{ ASSERT(::IsWindow(m_hWnd)); 
::GetClientRect(m_hWnd, lpRect); }
m_hWndがNULLでしたので、Create出来ていない
のかと思いますが、自力で解決出来ませんでした。

他に必要な情報がございましたら補足いたしますの
で、ご助言お願いします。

てけてけ 2015/02/11(水) 10:44:02
追加です。
Assertion Failedのメッセージが出る具体的な場所を記載します。

BOOL AFXAPI AfxAssertFailedLine(LPCSTR lpszFileName, int nLine)
{
    // we remove WM_QUIT because if it is in the queue then the message 
box
    // won't display
    MSG msg;
    BOOL bQuit = PeekMessage(&msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE);
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
※
    BOOL bResult = _CrtDbgReport(_CRT_ASSERT, lpszFileName, nLine, NULL, 
NULL);
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
※
    if (bQuit)
        PostQuitMessage((int)msg.wParam);
    return bResult;
}

上記※内です。
よろしくお願いします。

ITO 2015/02/12(木) 10:37:43
おそらく原因は、
>m_pg1.GetClientRect(&r);
 これが実行されるとき、まだタブコントロールが作成されていない、
もしくはタブコントロールがほかのウインドウの下に隠れているですね。

これを解決するためには、「m_pg1.GetClientRect(&r);」をタブコントロールの
「OnCreate」内で実行するのがいいと思いますね。

てけてけ 2015/02/12(木) 23:05:20
>ITO様
返答ありがとうございます。

>これを解決するためには、「m_pg1.GetClientRect(&r);」をタブコントロールの
>OnCreate」内で実行するのがいいと思いますね。

と申されましたが、私のタブコントロール内にOncreateがありません。
ダイアログベースで作成している場合、Oncreateを自分で新たに作るしかないでしょう
か?

ITO 2015/02/13(金) 10:26:34
>私のタブコントロール内にOncreateがありません。
失礼しました。
タブコントロールではないですね。
タブコントロールのために作った二つのダイアログ
 >m_pg1.Create(CPage1::IDD,this);
 >m_pg2.Create(CPage2::IDD,this);
です。
今回は、
>m_pg1.GetClientRect(&r);
となると、m_pg1のほうですね。
これの、「Oncreate」、もしくは、OnInitDialogかですね。

ITO 2015/02/13(金) 10:30:08
追伸、
>m_pg1.MoveWindow(&r,false);
>m_pg2.MoveWindow(&r,false);
これも個々のダイアログで実行したほうがいいですね。

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