初投稿です。よろしくお願いします。
現在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出来ていない
のかと思いますが、自力で解決出来ませんでした。
他に必要な情報がございましたら補足いたしますの
で、ご助言お願いします。
追加です。
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;
}
上記※内です。
よろしくお願いします。
おそらく原因は、
>m_pg1.GetClientRect(&r);
これが実行されるとき、まだタブコントロールが作成されていない、
もしくはタブコントロールがほかのウインドウの下に隠れているですね。
これを解決するためには、「m_pg1.GetClientRect(&r);」をタブコントロールの
「OnCreate」内で実行するのがいいと思いますね。
>ITO様
返答ありがとうございます。
>これを解決するためには、「m_pg1.GetClientRect(&r);」をタブコントロールの
>OnCreate」内で実行するのがいいと思いますね。
と申されましたが、私のタブコントロール内にOncreateがありません。
ダイアログベースで作成している場合、Oncreateを自分で新たに作るしかないでしょう
か?
>私のタブコントロール内にOncreateがありません。
失礼しました。
タブコントロールではないですね。
タブコントロールのために作った二つのダイアログ
>m_pg1.Create(CPage1::IDD,this);
>m_pg2.Create(CPage2::IDD,this);
です。
今回は、
>m_pg1.GetClientRect(&r);
となると、m_pg1のほうですね。
これの、「Oncreate」、もしくは、OnInitDialogかですね。
追伸、
>m_pg1.MoveWindow(&r,false);
>m_pg2.MoveWindow(&r,false);
これも個々のダイアログで実行したほうがいいですね。