Класс, унаследованный от wxOwnerDrawnComboBox, не фокусируется

Я реализовал собственное поле со списком, которое используется в качестве селектора шрифтов. Чтобы отобразить, как выглядят выбранные шрифты непосредственно в поле со списком, я создал новый класс FontStyleComboBox, который наследуется от wxOwnerDrawnComboBox. После того, как показан полный класс, отсутствует только часть управления шрифтами:

class FontStyleComboBox : public wxOwnerDrawnComboBox
{
private:
   std::vector<wxFont> m_fontList;

public:
   virtual void OnDrawItem(wxDC& dc,const wxRect& rect,int item,int flags) const
   {
      if (item == wxNOT_FOUND) return;
      wxCoord w1,h1,w2,h2;
      dc.GetTextExtent(GetString(item),&w1,&h1);
      dc.DrawText(GetString(item),
              rect.x + 3,
              (rect.y + 0) + (rect.height / 2) - (dc.GetCharHeight() / 2)
              );
      dc.SetFont(m_fontList[item]);
      dc.GetTextExtent(GetString(item),&w2,&h2);
      if (w2<250)
      {
         if (rect.x+10+w1>135)
          dc.DrawText(_T("AaBbCcDd 1234"),
                  rect.x+10+w1,
                  (rect.y + 0) + (rect.height / 2) - (dc.GetCharHeight() / 2)
                  );
         else
          dc.DrawText(_T("AaBbCcDd 1234"),
                  135,
                  (rect.y + 0) + (rect.height / 2) - (dc.GetCharHeight() / 2)
                  );
      }
   }

   virtual void OnDrawBackground(wxDC& dc, const wxRect& rect,int item, int flags) const
   {
      // If item is selected or even, or we are painting the
      // combo control itself, use the default rendering.
      if ((flags & (wxODCB_PAINTING_CONTROL | wxODCB_PAINTING_SELECTED)) ||
          (item & 1) == 0)
      {
         wxOwnerDrawnComboBox::OnDrawBackground(dc, rect, item, flags);
         return;
      }
      // Otherwise, draw every other background with different colour.
      wxColour bgCol(245, 245, 255);
      dc.SetBrush(wxBrush(bgCol));
      dc.SetPen(wxPen(bgCol));
      dc.DrawRectangle(rect);
   }

   virtual wxCoord OnMeasureItem(size_t item) const
   {
      return 20;
   }

   virtual wxCoord OnMeasureItemWidth(size_t item) const
   {
       return 400;
   }
};

К сожалению, это поле со списком шрифтов не ведет себя как обычное поле со списком:

  • при переходе через элементы в графическом интерфейсе, как только FontStyleComboBox должен быть сфокусирован, он не выделяется
  • в тот момент, когда он должен быть сфокусирован, при нажатии стрелок вверх/вниз он не скользит по элементам выпадающего списка, а меняет фокус на предыдущий/следующий элемент графического интерфейса (прямо так, как если бы кто-то нажал Shift-Tab/Tab)

Итак... есть идеи, чего здесь может не хватать? Должен ли я добавить некоторую обработку фокуса/потеря фокуса в этом классе?

Это происходит с wxWidgets 3.1/Windows.


person Elmi    schedule 25.11.2020    source источник
comment
на какой версии ОС/wxWidgets вы тестируете?   -  person Igor    schedule 26.11.2020
comment
@Igor, как уже говорилось в вопросе, это wxWidgets 3.1 в Windows.   -  person Elmi    schedule 27.11.2020


Ответы (1)


Решено: это была проблема версии 3.1 для Windows. В версии 3.0/Linux этого никогда не происходило, а начиная с версии 3.1.4 это исправлено и для Windows.

person Elmi    schedule 11.01.2021