OwnerDraw CButton MFC фокус

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

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

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

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

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 captiondc.Detach();
}

0

Решение

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

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

2

Другие решения