VC++6 ActiveXのOnDraw関数

[戻る]
にし 2002/03/04(月) 21:36:18
再度お世話になります。
今、VC++6のActiveX ControlWizardを使用して
OCXを作成しています。ツリーコントロールを作成し、ストックプロパテーの
Font、BackColor、ForeColorをインプリメントしています。
ところが、下記OnDraw関数の DoSuperclassPaint(pdc, rcBounds) を
コメントにするとColor設定は有効になるが、文字は表示されなくなり、
コメントをはずすとその逆になります。文字も表示され、Color設定も有効に
するには、どのように変更したらいいでしょうか?

void CTreeDsp1Ctrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& 
rcInvalid)
{
    CBrush bkBrush(TranslateColor(GetBackColor()));
    pdc->FillRect(rcBounds, &bkBrush);
    DoSuperclassPaint(pdc, rcBounds);
}

不良PG 2002/03/05(火) 11:23:07
COleControl::DoSuperclassPaintによって、
サブクラスされた"SysTreeView32"の描画が呼ばれてしまう為に
塗りつぶした上に通常のコントロールが描画されてしまうので、
BackColor,ForeColorプロパティが変更された場合に
CTreeCtrl::SetBkColorを呼ぶようにすれば良さそうです。

にし 2002/03/05(火) 15:31:11
不良PGさん 回答有難うございます。

今、回答に従っていろいろやっているところです。
とりあえず途中経過です。

にし 2002/03/06(水) 10:02:03
不良PGさんへ

先日は回答有難うございました。< CTreeCtrl::SetBkColor > をいろいろ試して
みましたが上手くいきませんでした(大変抽象的ですが的を絞れていません)。
CDC:SetBkColor 、 virtual COLORREF SetBkColor(COLORREF crColor)の説明も読んで
いろいろ試してみましたが駄目でした。
そこで申し訳ありませんが、よろしかったらOnDraw関数の機能を代用するような 
CTreeCtrl::SetBkColor の一般的な使い方についてヒント程度で結構ですので
再度説明していただけませんでしょうか?

不良PG 2002/03/06(水) 11:19:27
ストックプロパティを使っている場合のプロパティの変更タイミングをどこで受けるかわかりま
せんが、変更されたタイミングで
CTreeCtrl* pTreeCtrl = (CTreeCtrl*)this;
pTreeCtrl->SetBkColor( TranslateColor(GetBackColor()) );
こうすれば良い気がします

OnDrawは

void CTreeDsp1Ctrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& 
rcInvalid)
{
    SelectStockFont(pdc);
    DoSuperclassPaint(pdc, rcBounds);
}

こんな感じかな・・

こういうことじゃない?かな?

不良PG 2002/03/06(水) 11:51:40
>ストックプロパティを使っている場合のプロパティの変更タイミングをどこで受けるかわかり
>ませんが、変更されたタイミングで
これですね(^^;

virtual void OnBackColorChanged( );

void CTreeDsp1Ctrl::OnBackColorChanged( )
{
    CTreeCtrl* pTreeCtrl = (CTreeCtrl*)this;
    pTreeCtrl->SetBkColor( TranslateColor( GetBackColor() ));

    COleControl::OnBackColorChanged();
}

にし 2002/03/06(水) 21:43:18
不良PGさんへ

適切な回答をいただき有難うございます。

今までの試行錯誤で、ごちゃごちゃになったプログラムを全部削除し、
ActiveXのウイザードから作り直して、ご指摘のコードを挿入しました。
その結果、ActiveXのデバッグ環境では完全な動作をするようになりました。

ただ、このOCXをVBで使用したところTreeViewコントロールの
ボタンとラインのBackColorがTreeViewコントロールの
BackColorと同じにならず、VBのFormの色と同じになってしまいます。
この部分の設定は下記のようにしています。

BOOL CTreeDspCtrl::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.lpszClass = _T("SysTreeView32");
    cs.style = cs.style | TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT;

    return COleControl::PreCreateWindow(cs);
}

目下、この所を検討中です。
今までに数々のアドバイスをいただき大変心苦しいのですが、何かきずいた所を連絡
いただければ幸いです。

不良PG 2002/03/07(木) 15:26:38
この辺りは、いろいろ面倒ですね
こんなんで何とか成りそうですね(^^;;;;

int CTreeDsp1Ctrl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (COleControl::OnCreate(lpCreateStruct) == -1)
        return -1;
        
        :
        :


    CTreeCtrl* pTreeCtrl = (CTreeCtrl*)this;
    pTreeCtrl->SetBkColor( TranslateColor( GetBackColor()) );
}

void CTreeDsp1Ctrl::DoPropExchange(CPropExchange* pPX)
{
    ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
    COleControl::DoPropExchange(pPX);

    PX_Color(pPX, _T("BackColor"), m_clrBackColor,
                                         ::GetSysColor( COLOR_WINDOW ) );
}

にし 2002/03/07(木) 19:13:25
[[解決]]
不良PGさん 有難うございました。

すべてうまく動作しました。 感謝、感謝です。
それにしてもこの複雑なMFCを良く知ってますね(驚)!!!
いずれにしても、それなりの苦労、努力の賜物と思いますが...。

とにかく、いろいろお手数をかけました。
有難うございました。

不良PG 2002/03/07(木) 19:59:35
>それにしてもこの複雑なMFCを良く知ってますね(驚)!!!
このスレッドがたってから調べました(汗

>いずれにしても、それなりの苦労、努力の賜物と思いますが...。
なので合計2時間位の努力かな(笑)

にし 2002/03/08(金) 11:37:42
不良PGさんへ

>このスレッドがたってから調べました(汗
>なので合計2時間位の努力かな(笑)

これからも利用者、研鑽のためにがんばって下さい。

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