VC++6 ActiveXのOnDraw関数 – プログラミング – Home

VC++6 ActiveXのOnDra...
 
通知
すべてクリア

[解決済] VC++6 ActiveXのOnDraw関数


にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

再度お世話になります。
今、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
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

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


返信引用
にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

不良PGさん 回答有難うございます。

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


返信引用
にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

不良PGさんへ

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

ストックプロパティを使っている場合のプロパティの変更タイミングをどこで受けるかわかりま
せんが、変更されたタイミングで
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
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

>ストックプロパティを使っている場合のプロパティの変更タイミングをどこで受けるかわかり
>ませんが、変更されたタイミングで
これですね(^^;

virtual void OnBackColorChanged( );

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

COleControl::OnBackColorChanged();
}


返信引用
にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

不良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
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

この辺りは、いろいろ面倒ですね
こんなんで何とか成りそうですね(^^;;;;

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 ) );
}


返信引用
にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

不良PGさん 有難うございました。

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

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


返信引用
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

>それにしてもこの複雑なMFCを良く知ってますね(驚)!!!
このスレッドがたってから調べました(汗

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


返信引用
にし
 にし
(@にし)
ゲスト
結合: 23年前
投稿: 22
Topic starter  

不良PGさんへ

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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