環境 WinXPSP2, VS2008, MFC
みなさん、こんにちは、Takahashiと申します。
早速ですが・・・
TestX というActiveXをMFC ActiveXコントロールで生成し、
プロパティー fPos を追加しました。
OnDraw で fPos の値を真ん中に表示するコードを追加し
void CTestXCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
if (!pdc)
return;
// TODO: 以下のコードを描画用のコードに置き換えてください
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
CString str;
str.Format(_T(%f), m_fPos);
pdc->TextOut(rcBounds.Width() / 2, rcBounds.Height() / 2, str);
}
また、追加された OnfPosChanged に同様の動作をするコードを追加しました。
void CTestXCtrl::OnfPosChanged(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if(m_hWnd != NULL) //(1)
{
CRect rcBounds;
GetClientRect(rcBounds);
CDC* pdc = GetDC();
pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));
pdc->Ellipse(rcBounds);
CString str;
str.Format(_T(%f), m_fPos);
pdc->TextOut(rcBounds.Width() / 2, rcBounds.Height() / 2, str);
ReleaseDC(pdc);
}
SetModifiedFlag();
}
次に、クライアント側をダイアログベースで制作し
(TestXを使う側という意味ですが、表現合ってるかな?)
ActiveXの挿入でTestXを貼り付けました。
と、ここまでは良かったのですが・・・
ダイアログエディタのプロパティーの fPos を変更した場合
TestX 側の GetClientRectの最初で
ASSERT(m_hWnd != NULL ・・・
となり、assertされてしまいます。
そこで ソース内のように (1) を追加したのですが、
これをしてしまうとダイアログエディタのプロパティーを変更しても表示が変更されません。
(位置をずらしたりして OnDraw が動いた場合は当然ですが表示されます)
そこで、質問なのですが、
OnfPosChanged 内でGetDC、GetClientを使用するのは間違いなのでしょうか?
また、一般的にはどのようにしたらいいのでしょうか?
よろしくお願いいたします。
自己解決です。
void CTestXCtrl::OnfPosChanged(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
InvalidateControl();
}
として、描画の更新をかけることで動作しました。
うーーん、MFC の力で何となく動いているが、理解が足りないようです。
ActiveX 関係の本一回読んだ方が良いようですね・・・
お騒がせしました!