ActiveX のプロパティーの変更について – プログラミング – Home

ActiveX のプロパティーの変更に...
 
通知
すべてクリア

[解決済] ActiveX のプロパティーの変更について


Takahashi
 Takahashi
(@Takahashi)
ゲスト
結合: 21年前
投稿: 45
Topic starter  

環境 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を使用するのは間違いなのでしょうか?
また、一般的にはどのようにしたらいいのでしょうか?

よろしくお願いいたします。


引用未解決
トピックタグ
Takahashi
 Takahashi
(@Takahashi)
ゲスト
結合: 21年前
投稿: 45
Topic starter  

自己解決です。

void CTestXCtrl::OnfPosChanged(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

InvalidateControl();
}

として、描画の更新をかけることで動作しました。
うーーん、MFC の力で何となく動いているが、理解が足りないようです。
ActiveX 関係の本一回読んだ方が良いようですね・・・
お騒がせしました!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました