2009-02-07 4 views
1

Я использую класс, полученный из CControlBar, и я хотел бы определить, когда изменилось состояние стыковки CControlBar (т. Е. Стыковка от вертикали к горизонтали или когда она переходит в плавающий режим).Обнаружение при изменении состояния стыковки CControlBar

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

Может ли кто-нибудь указать мне в правильном направлении?

ответ

3

Вы можете переопределить виртуальную функцию CControlBar::OnBarStyleChange для обнаружения изменений в стиле панели управления (CBRS_XXX значений - посмотрите в файле заголовка <afxres.h>).

Чтобы определить, плавает ли панель управления или закрепляется, проверьте стиль CBRS_FLOATING. Для проверки горизонтальной/вертикальной ориентации используйте стили CBRS_ORIENT_HORZ и CBRS_ORIENT_VERT.

Таким образом, используя CToolBar (который является производным от CControlBar) в качестве примера:

class CMyToolBar : public CToolBar { 
public: 
    virtual void OnBarStyleChange(DWORD dwOldStyle, DWORD dwNewStyle); 
}; 

void CMyToolBar::OnBarStyleChange(DWORD dwOldStyle, DWORD dwNewStyle) 
{ 
    // Call base class implementation. 
    CToolBar::OnBarStyleChange(dwOldStyle, dwNewStyle); 

    // Use exclusive-or to detect changes in style bits. 
    DWORD changed = dwOldStyle^dwNewStyle; 

    if (changed & CBRS_FLOATING) { 
     if (dwNewStyle & CBRS_FLOATING) { 
      // ToolBar now floating 
     } 
     else { 
      // ToolBar now docked 
     } 
    } 

    if (changed & CBRS_ORIENT_ANY) { 
     if (dwNewStyle & CBRS_ORIENT_HORZ) { 
      // ToolBar now horizontal 
     } 
     else if (dwNewStyle & CBRS_ORIENT_VERT) { 
      // ToolBar now vertical    
     } 
    } 
} 

Я надеюсь, что это помогает!

+0

Это очень помогает! Спасибо, что ответили так быстро и на пример - это просто отлично :-) – fhe

Смежные вопросы