CCommandBarCtrl в диалоговом окне
От: stbzh  
Дата: 22.07.08 11:04
Оценка:
Прошу прощения, если все таки где то пропустил подобный топик, но смотрел достаточно внимательно на rsdn, в yahoo группах, гуглил, и codeproject смотрел (cобственно использую код статьи www.codeproject.com/KB/wtl/menuxp_wtl.aspx).
А задача такая: требуется в приложении (WTL dialog-based GUI) отрисовать красивое меню (стиль ХР, скины натянуть и пр.)
Пытаюсь для этой цели использовать CCommandBarCtrlImpl наследуя его таким образом:

// определение класса
template< class T, class TBase = CCommandBarCtrlImpl< T > >
class ATL_NO_VTABLE CMyCommandBarControlImpl : public TBase
{
public:
    DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName())

    typedef CMyCommandBarControlImpl< T, TBase >    thisClass;
    typedef TBase                    baseClass;

    BEGIN_MSG_MAP( CMyCommandBarControlImpl )
        CHAIN_MSG_MAP(baseClass)
        ALT_MSG_MAP(1)      // Parent window messages
        NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw)
        CHAIN_MSG_MAP_ALT(baseClass,1)
        ALT_MSG_MAP(2)        // MDI client window messages
        CHAIN_MSG_MAP_ALT(baseClass,2)
        ALT_MSG_MAP(3)        // Message hook messages
        CHAIN_MSG_MAP_ALT(baseClass,3)
    END_MSG_MAP()

    LRESULT OnCustomDraw (int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
    {...}
    void DrawItem (LPDRAWITEMSTRUCT lpDrawItemStruct)
    {...}
};

class CMyCommandBarControl :
    public CMyCommandBarControlImpl< CMyCommandBarControl >
{
public:
    DECLARE_WND_SUPERCLASS(_T("MyCommandBarControl"), GetWndClassName())
};

В классе диалога объявляю переменную:
class CMainDlg : ...
{
...
        CMyCommandBarControl m_CmdBar;
};

В реализации диалога при инициализации

void CCMainDlg::InitDialog(LPARAM lParam)
{
...
    //
    // CREATING MENU
    //
    
    HWND hWndCmdBar = m_CmdBar.Create( 
        m_hWnd,
        rcDefault,
        NULL,
        WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CBRWS_TOP | CBRWS_NODIVIDER // | CBRWS_NORESIZE | CBRWS_NOPARENTALIGN
        //ATL_SIMPLE_CMDBAR_PANE_STYLE
        );

    // replace current menu with the command bar
    m_CmdBar.AttachMenu( GetMenu() );
    m_CmdBar.LoadImages( IDR_MAIN_MENU );
    SetMenu( NULL );
}


Проблема в том, что в том месте, где должно быть меню, место под него не выделяется, как выделялось при обычном меню (оно появляется прямо на диалоге, перекрывая часть клиентской области), зато добавляется область внизу окна, которая не отрисовывается
То есть ощущение, что место выделилось внизу руководствуясь координатами rcDefault, а на место ресурсного меню не переносится. Как с этим бороться? Может можно каким то образом определить правильные координаты меню и задавать их вместо rcDefault?
Подскажите, плз, обобщенный правильный механизм добавления отрисовываемого контрола производного от CCommandBarCtrl, на диалог, созданный в редакторе ресурсов, вместо меню, также созданного редактором ресурсов.
Можно ли в диалоге использовать фрэймовые функции для создания ReBar-а ( что то типа AddSimpleReBarBand( hWndCmdBar ); ) и помещения на него данного контрола?
Re: CCommandBarCtrl в диалоговом окне (дополнение)
От: stbzh  
Дата: 22.07.08 12:06
Оценка:
Непрорисованная область внизу окна — следствие того, что диалоговое окно зарисовывает битмапом клиентскую часть окна, не растягивая рисунок. Ну а после удаления меню, клиентская область стала больше. То есть этот вопрос отпадает — надо всего лишь переделать функцию перерисовки диалога так, чтобы начальные координаты учитывали положение меню. Опять же нужно знать размеры меню...
Re[2]: CCommandBarCtrl в диалоговом окне (дополнение)
От: HoseCo  
Дата: 04.08.08 16:25
Оценка:
Здравствуйте, stbzh, Вы писали:

S>Опять же нужно знать размеры меню...


может ::GetWindowRect() поможет?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.