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 ); ) и помещения на него данного контрола?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.