OwnerDraw CButton mfc фокус

Со стандартными кнопками, если у меня есть «ОК» и «Отмена», по умолчанию «ОК», и я нажимаю стрелку вправо, «Отмена» фокусируется, и нажатие клавиши «Ввод» на клавиатуре вызывает функцию кнопки «Отмена».

Этого не происходит с кнопками ownerdraw. Если я нажимаю стрелку вправо, кнопка «Отмена» фокусируется, но при нажатии клавиши ввода на клавиатуре вызывается функция кнопки «ОК».

Как я могу иметь кнопку отрисовки владельца со стандартным поведением?

Это мой класс.

BEGIN_MESSAGE_MAP(CFlatButton, CButton)
    //{{AFX_MSG_MAP(CMyClass)
        // NOTE - the ClassWizard will add and remove mapping macros here.
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CFlatButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // TODO: Add your code to draw the specified item
    CDC dc;
    dc.Attach(lpDrawItemStruct->hDC);       //Get device context object
    CRect rt;
    rt = lpDrawItemStruct->rcItem;      //Get button rect

    UINT state = lpDrawItemStruct->itemState;   //Get state of the button
    if ( (state & ODS_SELECTED) )
        dc.FillSolidRect(rt, RGB(255, 0, 0));
    else
    {
        if ((state & ODS_DISABLED))
        {
            dc.FillSolidRect(rt, RGB(0, 255, 0));
        }
        else
        {
            if ((state & ODS_FOCUS))       // If the button is focused
            {
                // Draw a focus rect which indicates the user 
                // that the button is focused
                dc.FillSolidRect(rt, RGB(0, 0, 255));
            }
            else
            {
                dc.FillSolidRect(rt, RGB(255, 255, 0));
            }
        }
    }
    dc.SetTextColor(RGB(255,255,255));      // Set the color of the caption to be yellow
    CString strTemp;
    GetWindowText(strTemp);     // Get the caption which have been set
    dc.DrawText(strTemp,rt,DT_CENTER|DT_VCENTER|DT_SINGLELINE);     // Draw out the caption


    dc.Detach();
}

person SNC    schedule 24.06.2015    source источник


Ответы (1)


Основная причина заключается в том, что диалоговое окно обычно использует BS_DEFPUSHBUTTON и BS_PUSHBUTTON для обозначения этого, но флаг ownerdraw является взаимоисключающим.

Проверьте эту статью: в ней объясняется полная предыстория: http://www.codeproject.com/Articles/1318/COddButton

person xMRi    schedule 24.06.2015
comment
Статья проекта кода немного устарела. Начиная с Windows Vista, можно использовать вместо этого пользовательская отрисовка, которая позволяет сохранить стиль BS_DEFPUSHBUTTON, поскольку BS_OWNERDRAW не требуется. - person zett42; 14.01.2018