Поделиться через


Использование диалоговой панели с элементом управления главной панели

Как упоминание в элементах управления rebar и Bands, каждая группа может содержать только одно дочернее окно (или элемент управления). Это может быть ограничением, если вы хотите иметь несколько дочерних окон на группу. Удобное решение — создать ресурс панели диалоговых окон с несколькими элементами управления, а затем добавить полосу перестроения (содержащую панель диалоговых окон) в элемент управления перестроения.

Как правило, если вы хотите, чтобы полоса диалоговых строк отображалась прозрачно, вы задали бы WS_EX_TRANSPARENT расширенный стиль для объекта панели диалоговых окон. Тем не менее, поскольку WS_EX_TRANSPARENT имеет некоторые проблемы с правильной рисованием фона диалоговой панели, вам потребуется выполнить небольшую дополнительную работу, чтобы добиться желаемого эффекта.

В следующей процедуре описаны шаги, необходимые для обеспечения прозрачности без использования расширенного стиля WS_EX_TRANSPARENT.

Реализация прозрачной панели диалогов в полосе перекладки

  1. С помощью диалогового окна "Добавить класс" добавьте новый класс (например, CMyDlgBar), реализующий объект панели диалогов.

  2. Добавьте обработчик для сообщения WM_ERASEBKGND.

  3. В новом обработчике измените существующий код, чтобы он соответствовал следующему примеру:

    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 (BOOL)lResult;
    }
    
  4. Добавьте обработчик для сообщения WM_MOVE.

  5. В новом обработчике измените существующий код, чтобы он соответствовал следующему примеру:

    void CMyDlgBar::OnMove(int x, int y)
    {
       UNREFERENCED_PARAMETER(x);
       UNREFERENCED_PARAMETER(y);
    
       Invalidate();
    }
    

Новые обработчики имитируют прозрачность диалоговой строки, перенаправляя сообщение WM_ERASEBKGND в родительское окно и заставляя перенаправку при каждом перемещении объекта панели диалоговых окон.

См. также

Использование CReBarCtrl
Controls