VC6で、manifestファイルを使用したXPスタイルSDIアプリケーションを作成しています。
ダイアログバー(CDaialogBar)をCReBarに追加して表示してみたのですが、
ReBar上部に横線が描画されてしまいます。
おそらく、ダイアログバーの境界線のようなものだとは思うのですが、
消去方法が分かりません…
また、フレームをドラッグしてリサイズすると、ReBarの描画がおかしくなってしまいます(残像が残る感じ)。
ご有識者の方、回避方法を教えてください。
関連するソースは以下のとおりです。
■MainFrm.cpp
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
省略…
//-------------------------------------------------------------------------
// ダイアログバーの作成
if (!m_wndDlgBar.Create(this, IDD_DIALOGBAR, WS_VISIBLE | CBRS_TOP,
AFX_IDW_TOOLBAR))
{
TRACE0("Failed to create toolbar\n");
return -1; // ?i?¬?E?,”s
}
//-------------------------------------------------------------------------
// リバーの作成
if (!m_wndReBar.Create(this) ||
!m_wndReBar.AddBar(&m_wndDlgBar))
{
TRACE0("Failed to create rebar\n");
return -1; // 作成に失敗
}
// リバーを固定する
CReBarCtrl& rbc = m_wndReBar.GetReBarCtrl();
REBARBANDINFO rbbi;
rbbi.cbSize = sizeof(rbbi);
rbbi.fMask = RBBIM_STYLE;
int nCount = rbc.GetBandCount();
for (int i = 0; i < nCount; i++)
{
rbc.GetBandInfo(i, &rbbi);
rbbi.fStyle ^= RBBS_NOGRIPPER | RBBS_GRIPPERALWAYS;
rbc.SetBandInfo(i, &rbbi);
}
省略…
}
■MyDlgBar(ダイアログバーを透過にする)
BOOL CMyDlgBar::OnEraseBkgnd( CDC* pDC )
{
CWnd* pParent = GetParent();
ASSERT_VALID(pParent);
CPoint pt(0, 0);
MapWindowPoints(pParent, &pt, 1);
pt = pDC->OffsetWindowOrg(pt.x, pt.y);
LRESULT lResult = pParent->SendMessage(WM_ERASEBKGND,
(WPARAM)pDC->m_hDC, 0L);
pDC->SetWindowOrg(pt.x, pt.y);
return lResult;
}
void CMyDlgBar::OnMove(int x, int y)
{
CDialogBar::OnMove(x, y);
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
Invalidate();
}
OnPaint内でInvalidateすればよいのでは?
ヨロシコさん
回答ありがとうございます。OnPaint内でInvalidateしてみましたが、
他のコンポーネント操作により、ダイアログバー内のコントロールが描画されない現象となってしまいました。
・・・が!なんと、CMyDlgBarのOnPaintをオーバーライドするだけ(MFCで作成されたコードのまま、何も追記しない)で、現象が改善しました。
void CMyDlgBar::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
// 描画用メッセージとして CDialogBar::OnPaint() を呼び出してはいけません
}
↑のように、何も追記していません。
なぜ解消されたのか、かなりギモンです…
思い通りの動きはしてくれているのですが、気になって仕方ありません。
もし現象の理由がお分かりでしたら、教えて頂きたく。
よろしくお願いします。
ツイート | ![]() |