Командные сообщения
От: KokS  
Дата: 20.02.06 18:41
Оценка:
Исправлено форматирование текста. — SchweinDeBurg

Недавно начал изучать MFC.
Возникла следующая проблема:

В SDI проекте разделяю окно на три части с помощью CSplitterWnd. Сначала вертикально, затем правую часть горизонтально.

    |    
    |----
    |

В каждой части создаю свой "вид". Вроде все замечательно, но при попытке передать сообщения каждому представлению из меню, доходит только до одного (левого). Для остальных ClassWithard честно создает обработчики, но команды не доходят. Подскажите в чем может быть дело.

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
    CCreateContext* pContext)
{
    if (!m_wndSplitter.CreateStatic(this, 1, 2))
    {
        TRACE0("Failed to CreateStaticSplitter\n");
        return FALSE;
    }

    CRect rect;
    GetClientRect(&rect);

    // Создаем главный вид
    if (!m_wndSplitter.CreateView(0, 0,
        RUNTIME_CLASS(CSFView), CSize(rect.Width()-300, rect.Height()), pContext))
    {
        TRACE0("Failed to create first pane\n");
        return FALSE;
    }

    //add the second splitter pane - which is a nested splitter with 2 rows
    if (!m_wndSplitter2.CreateStatic(
                        &m_wndSplitter,     // our parent window is the first splitter
                        2, 1,               // the new splitter is 2 rows, 1 column
                        WS_CHILD | WS_VISIBLE | WS_BORDER,  // style, WS_BORDER is needed
                        m_wndSplitter.IdFromRowCol(0, 1)
                        // new splitter is in the first row, 2nd column of first splitter
                        ))
    {
        TRACE0("Failed to create nested splitter\n");
        return FALSE;
    }

    // Создаем вид для FlexGrid
    if (!m_wndSplitter2.CreateView(0, 0,
        RUNTIME_CLASS(CFGView), CSize(300, rect.bottom - 200), pContext))
    {
        TRACE0("Failed to create second pane\n");
        return FALSE;
    }

    // Вид пока не понятно для чего
    if (!m_wndSplitter2.CreateView(1, 0,
        RUNTIME_CLASS(CSFView), CSize(300, 200), pContext))
    {
        TRACE0("Failed to create third pane\n");
        return FALSE;
    }

}
[от модератора]
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 21.02.06 08:19
Оценка:
Убедительная просьба — использовать коды форматирования при вставке текстов программ.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
Re: Командные сообщения
От: molostov  
Дата: 21.02.06 08:44
Оценка:
Здравствуйте, KokS, Вы писали:


KS>Недавно начал изучать MFC.

KS>Возникла следующая проблема:

KS>В SDI проекте разделяю окно на три части с помощью CSplitterWnd. Сначала вертикально, затем правую часть горизонтально.


KS>
KS>    |    
KS>    |----
KS>    |    
KS>

KS>В каждой части создаю свой "вид". Вроде все замечательно, но при попытке передать сообщения каждому представлению из меню, доходит только до одного (левого). Для остальных ClassWithard честно создает обработчики, но команды не доходят. Подскажите в чем может быть дело.

Сообщения посылаются только активному представлению.
Re: Командные сообщения
От: Symon Россия  
Дата: 21.02.06 09:54
Оценка: 2 (1)
class CMainFrame : public CFrameWnd
{
    ......
    CWnd                *m_pLeftView;
    CWnd                *m_pRightTopView;
    CWnd                *m_pRightBottomView;
    ......
};

CMainFrame::CMainFrame ()
{
    m_pLeftView = NULL;
    m_pRightTopView = NULL;
    m_pRightBottomView = NULL;
}

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/, CCreateContext* pContext)
{
    .....
    // в конец функции добавляем
    m_pLeftView = m_wndSplitter.GetPane (0, 0);
    m_pRightTopView = m_wndSplitter2.GetPane (0, 0);
    m_pRightBottomView = m_wndSplitter.GetPane (1, 0);
    return TRUE;
}

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
    // расставляешь в порядке приоритета обработки коммандных сообщений видами
    if ((m_pLeftView) && m_pLeftView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
        return TRUE;

    if ((m_pRightTopView) && m_pRightTopView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
        return TRUE;

    if ((m_pRightBottomView) && m_pRightBottomView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
        return TRUE;

    return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
    // расставляешь в порядке приоритета обработки коммандных сообщений видами
    if ((m_pLeftView) && AfxCallWndProc (m_pLeftView, m_pLeftView->m_hWnd, WM_COMMAND, wParam, lParam))
        return TRUE;

    if ((m_pRightTopView) && AfxCallWndProc (m_pRightTopView, m_pRightTopView->m_hWnd, WM_COMMAND, wParam, lParam))
        return TRUE;

    if ((m_pRightBottomView) && AfxCallWndProc (m_pRightBottomView, m_pRightBottomView->m_hWnd, WM_COMMAND, wParam, lParam))
        return TRUE;

    return CFrameWnd::OnCommand(wParam, lParam);
}
Re[2]: Командные сообщения
От: KokS  
Дата: 21.02.06 15:45
Оценка:
Большое спасибо. Завтра на работе попробую.
Re: Командные сообщения
От: RealBobEx  
Дата: 24.02.06 08:40
Оценка:
Удалено избыточное цитирование. — SchweinDeBurg

Здравствуйте, KokS, Вы писали:

KS>В каждой части создаю свой "вид". Вроде все замечательно, но при попытке передать сообщения каждому представлению из меню, доходит только до одного (левого). Для остальных ClassWithard честно создает обработчики, но команды не доходят. Подскажите в чем может быть дело.


Нужно самому строить цепочку диспетчеризации посредством
либо

OnCmdMsg(...) //Для элементов управления глав. окна

Либо

OnWndMsg(...) //Для всех остальных

Обработчики созданные мастером для каждого вью будут работать только с элементами созданными в этом вью.
Вообще, если ваше приложение — SDI, то со сплитерами ооооччеень большой гемор .
Re[2]: Командные сообщения
От: KokS  
Дата: 24.02.06 18:46
Оценка:
Здравствуйте, RealBobEx, Вы писали:

RBE>Обработчики созданные мастером для каждого вью будут работать только с элементами созданными в этом вью.

RBE>Вообще, если ваше приложение — SDI, то со сплитерами ооооччеень большой гемор .

А как по другому сделать? Больше одного документа мне не надо. А вот видов надо несколько. Можно конечно все что я хочу разместить на одном виде, но это не красиво получиться .
[от модератора]
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 25.02.06 14:35
Оценка:
Строгое предупреждение за оверквотинг.
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
- Искренне ваш, Поросенок Пафнутий
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.