Кнопки управления в MDI
От: Kernel0  
Дата: 11.12.13 06:34
Оценка:
В MDI-приложении при наличии меню в его правой части появляются кнопки управления развернутым child-окном. У меня меню убрано (тулбар only) и как следствие теряется возможность свернуть окно обратно стандартными кнопками. Через тулбар его свернуть можно (есть пункт, аналогичный стандартному подменю "Window"), но это не очень дружелюбно к пользователю. Вопрос, как тут быть? Возвращать ненужное меню?.. В некоторых приложениях в аналогичных ситуациях я видел добавляющуюся кнопку управления, похожую на "Свернуть", только в виде точки. Но вроде бы стандартной такой нет, а делать свою, учитывая разные темы и разные ОС, глупо. Я бы не отказался и от упрощенного контрола управления, не зависящего от тем, который добавляется в строку меню, при его наличии. Его можно как-то вытащить и ввинтить в тулбар или, скажем, ребар?
Re: Кнопки управления в MDI
От: MTimur  
Дата: 12.12.13 08:17
Оценка: 1 (1)
  Здравствуйте, Kernel0, Вы писали:
K>В MDI-приложении при наличии меню в его правой части появляются кнопки управления развернутым child-окном. У меня меню убрано (тулбар only) и как следствие теряется возможность свернуть окно обратно стандартными кнопками. Через тулбар его свернуть можно (есть пункт, аналогичный стандартному подменю "Window"), но это не очень дружелюбно к пользователю. Вопрос, как тут быть? Возвращать ненужное меню?.. В некоторых приложениях в аналогичных ситуациях я видел добавляющуюся кнопку управления, похожую на "Свернуть", только в виде точки. Но вроде бы стандартной такой нет, а делать свою, учитывая разные темы и разные ОС, глупо. Я бы не отказался и от упрощенного контрола управления, не зависящего от тем, который добавляется в строку меню, при его наличии. Его можно как-то вытащить и ввинтить в тулбар или, скажем, ребар?

DrawCaption + DC_BUTTONS
Re[2]: Кнопки управления в MDI
От: Kernel0  
Дата: 13.12.13 11:19
Оценка:
Здравствуйте, MTimur, Вы писали:

MT>DrawCaption + DC_BUTTONS


Было бы неплохо давать более развернутые ответы ... Я не понял, как этим пользоваться. Этот код не работает:

void CMainFrm::OnPaint()
{
    CPaintDC dc(this);
    CRect r; GetClientRect(r);
    r.bottom = ::GetSystemMetrics( SM_CYCAPTION );
    r.left = r.right / 2;
    DrawCaption( &dc, r, DC_SMALLCAP );
    //dc.DrawFrameControl( r, DFC_CAPTION, DFCS_CAPTIONRESTORE );
}


Я пытаюсь посередине заголовка окна нарисовать хоть что-нибудь. DrawCaption не делает, кажется, ничего. DrawFrameControl хотя бы пытается что-то нарисовать, но под заголовком и поверх него рисуется тулбар. Это видно при растяжении окна. Надеюсь, мне не надо использовать богомерзкий OnNcPaint, который, кажется, заставляет перерисовывать весь заголовок.
Re[3]: Кнопки управления в MDI
От: Stanislav V. Zudin Россия  
Дата: 13.12.13 11:32
Оценка:
Здравствуйте, Kernel0, Вы писали:

K>Я пытаюсь посередине заголовка окна нарисовать хоть что-нибудь. DrawCaption не делает, кажется, ничего. DrawFrameControl хотя бы пытается что-то нарисовать, но под заголовком и поверх него рисуется тулбар. Это видно при растяжении окна. Надеюсь, мне не надо использовать богомерзкий OnNcPaint, который, кажется, заставляет перерисовывать весь заголовок.


Таки придется.
OnPaint() вызывается для перерисовки _клиентской_ области окна.
_____________________
С уважением,
Stanislav V. Zudin
Re[4]: Кнопки управления в MDI
От: Kernel0  
Дата: 16.12.13 09:12
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

K>>Надеюсь, мне не надо использовать богомерзкий OnNcPaint, который, кажется, заставляет перерисовывать весь заголовок.


SVZ>Таки придется.

SVZ>OnPaint() вызывается для перерисовки _клиентской_ области окна.

Ну то есть заголовок окна весь вручную рисовать придется?

А нельзя вытащить вот этот контрол (выделенный желтеньким), рисуя его в клиентской области? Он вроде как автоматически переводится в стиль винды, что вроде бы удобно.

Re[5]: Кнопки управления в MDI
От: Stanislav V. Zudin Россия  
Дата: 16.12.13 09:22
Оценка:
Здравствуйте, Kernel0, Вы писали:

K>А нельзя вытащить вот этот контрол (выделенный желтеньким), рисуя его в клиентской области? Он вроде как автоматически переводится в стиль винды, что вроде бы удобно.


Это не контрол. Обычные рисованные кнопки. Стиль винды берется из темы (uxtheme.dll)
Вот кусок кода из WTL, который отрисовывает их:

    void _DrawMDIButton(CWindowDC& dc, LPRECT pRects, int nBtn)
    {
#ifndef _WTL_NO_AUTO_THEME
        if(m_hTheme != NULL)
        {
#ifndef TMSCHEMA_H
            const int WP_MDICLOSEBUTTON = 20;
            const int CBS_NORMAL = 1;
            const int CBS_PUSHED = 3;
            const int CBS_DISABLED = 4;
            const int WP_MDIRESTOREBUTTON = 22;
            const int RBS_NORMAL = 1;
            const int RBS_PUSHED = 3;
            const int RBS_DISABLED = 4;
            const int WP_MDIMINBUTTON = 16;
            const int MINBS_NORMAL = 1;
            const int MINBS_PUSHED = 3;
            const int MINBS_DISABLED = 4;
#endif // TMSCHEMA_H
            if(nBtn == -1 || nBtn == 0)
                m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDICLOSEBUTTON, m_bParentActive ? ((m_nBtnPressed == 0) ? CBS_PUSHED : CBS_NORMAL) : CBS_DISABLED, &pRects[0], NULL);
            if(nBtn == -1 || nBtn == 1)
                m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIRESTOREBUTTON, m_bParentActive ? ((m_nBtnPressed == 1) ? RBS_PUSHED : RBS_NORMAL) : RBS_DISABLED, &pRects[1], NULL);
            if(nBtn == -1 || nBtn == 2)
                m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIMINBUTTON, m_bParentActive ? ((m_nBtnPressed == 2) ? MINBS_PUSHED : MINBS_NORMAL) : MINBS_DISABLED, &pRects[2], NULL);
        }
        else
#endif // !_WTL_NO_AUTO_THEME
        {
            if(nBtn == -1 || nBtn == 0)
                dc.DrawFrameControl(&pRects[0], DFC_CAPTION, DFCS_CAPTIONCLOSE | ((m_nBtnPressed == 0) ? DFCS_PUSHED : 0));
            if(nBtn == -1 || nBtn == 1)
                dc.DrawFrameControl(&pRects[1], DFC_CAPTION, DFCS_CAPTIONRESTORE | ((m_nBtnPressed == 1) ? DFCS_PUSHED : 0));
            if(nBtn == -1 || nBtn == 2)
                dc.DrawFrameControl(&pRects[2], DFC_CAPTION, DFCS_CAPTIONMIN | ((m_nBtnPressed == 2) ? DFCS_PUSHED : 0));
        }
    }


Собственно, вся обработка неклиентской части (рисование нажатие кнопок) есть в файле atlctrlw.h Скачай любую версию WTL и слизни оттуда.
_____________________
С уважением,
Stanislav V. Zudin
Re[6]: Кнопки управления в MDI
От: Kernel0  
Дата: 16.12.13 09:47
Оценка:
Попробую, спасибо!

Эх, и почему в MFC шаг в сторону карается геморроем?..
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.