manifest使用XPスタイルでのReBar描画不具合を修正するには?


いかた  2005-11-28 23:35:49  No: 59831

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


ヨロシコ  2005-11-30 03:06:45  No: 59832

OnPaint内でInvalidateすればよいのでは?


いかた  2005-12-02 05:53:23  No: 59833

ヨロシコさん
回答ありがとうございます。OnPaint内でInvalidateしてみましたが、
他のコンポーネント操作により、ダイアログバー内のコントロールが描画されない現象となってしまいました。
・・・が!なんと、CMyDlgBarのOnPaintをオーバーライドするだけ(MFCで作成されたコードのまま、何も追記しない)で、現象が改善しました。

void CMyDlgBar::OnPaint() 
{
  CPaintDC dc(this); // 描画用のデバイス コンテキスト
  
  // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
  
  // 描画用メッセージとして CDialogBar::OnPaint() を呼び出してはいけません
}

↑のように、何も追記していません。
なぜ解消されたのか、かなりギモンです…
思い通りの動きはしてくれているのですが、気になって仕方ありません。

もし現象の理由がお分かりでしたら、教えて頂きたく。
よろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加