2015-06-24 3 views
0

Со стандартными кнопками, если у меня есть ОК и Отмена, с настройкой по умолчанию OK, и я нажимаю стрелку вправо, на которой фокусируется Отмена, и нажатие на клавиатуре вызывает функцию «Отмена».OwnerDraw CButton mfc focus

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

Как я могу создать кнопку 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(); 
} 

ответ

2

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

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

+0

В статье код проекта является немного устаревшей. Начиная с Windows Vista можно использовать [пользовательский ничья] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb761847 (v = vs.85) .aspx), что позволяет вам поддерживать стиль 'BS_DEFPUSHBUTTON', потому что' BS_OWNERDRAW' не требуется. – zett42

Смежные вопросы