Custom ListBox не вызывается метод OnPaint Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
xterro
In need of some credit
In need of some credit
Posts: 7
Joined: Fri Jul 19, 2013 1:59 pm

Custom ListBox не вызывается метод OnPaint

Post by xterro » Fri Jul 19, 2013 2:22 pm

Доброго времени суток, пытаюсь сделать свой собственный ListBox, наследую его от wxListBox, подключил событие EVT_PAINT с обработчиком, но почему-то метод OnPaint моего виджета не вызывается.
Обработчики OnSize или OnItemSelected вызываются без проблем. Хочу сделать Что-то типа wxCheckListBox, только вместо "чекрыжиков" будут цветные квадратики. Как правильно делать? Или может у кого уже есть готовый образец, по типу того который мне нужен? :)
По типу как вот здесь:
Без имени.png
Без имени.png (8.29 KiB) Viewed 5193 times
Корд прост, наследуюсь от wxListBox и переопределяю событие рисования:

Code: Select all

#include "wx/wx.h"
//#include "wx/sizer.h"
//#include <wx/listbox.h>



const int ID_LISTBOX = 1;

class wxColorCheckListBox : public wxListBox
{

public:
    wxColorCheckListBox(wxWindow *parent, int id );

    void OnPaint(wxPaintEvent& event);
    void OnSize(wxSizeEvent& event);
    void OnMouseDown(wxMouseEvent& event);
    void OnItemSelected(wxCommandEvent & event);

    DECLARE_EVENT_TABLE()
};


BEGIN_EVENT_TABLE(wxColorCheckListBox, wxListBox)
    EVT_LEFT_DOWN(wxColorCheckListBox::OnMouseDown)
    EVT_LISTBOX(ID_LISTBOX, wxColorCheckListBox::OnItemSelected)
    EVT_PAINT(wxColorCheckListBox::OnPaint)
END_EVENT_TABLE()


wxColorCheckListBox::wxColorCheckListBox(wxWindow *parent, int id )
    :wxListBox(parent, id, wxDefaultPosition, wxDefaultSize, 0, NULL, wxLB_OWNERDRAW, wxDefaultValidator, wxT("color_check_listbox"))
{
    //Connect(ID_LISTBOX, wxEVT_PAINT, wxPaintEventHandler (wxColorCheckListBox::OnPaint));
}


void wxColorCheckListBox::OnMouseDown(wxMouseEvent & event)
{
    std::cout << "mouse down!!!\n";
    Update();
    event.Skip();
}


void wxColorCheckListBox::OnPaint(wxPaintEvent & event)
{
    std::cout << "draw!!!\n";


    wxClientDC dc(this);
    dc.SetBrush(*wxWHITE_BRUSH);
    dc.SetPen (*wxRED_PEN);
    dc.Clear();

   int size = 20;



   for (unsigned int x = 0; x < 3; x++)
   {
      dc.SetFont(*wxNORMAL_FONT);
      dc.SetBrush(wxBrush(wxColor(*wxLIGHT_GREY)));
      dc.SetPen(wxPen(wxColor(*wxBLACK)));

      dc.DrawRectangle (size + 2, x*size, size, size);
      dc.DrawText (wxT("aaaa"), (size + 2)*2, x*size);
   }


}

void wxColorCheckListBox::OnSize(wxSizeEvent& event)
{
    std::cout << "size!!!\n";
    //event.Skip();

}

void wxColorCheckListBox::OnItemSelected(wxCommandEvent & event)
{
    std::cout << "mouse selected!!!\n";
}

/////////////////////////////////////////////////////////////////////////////////
class MyApp: public wxApp
{
    bool OnInit();


public:

};

IMPLEMENT_APP(MyApp)


bool MyApp::OnInit()
{
    wxDialog * dlg = new wxDialog(NULL, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(300,500));
    wxColorCheckListBox * lb = new wxColorCheckListBox(dlg, ID_LISTBOX);

    lb->Append(wxT("Item 1"));
    lb->Append(wxT("Item 2"));
    lb->Append(wxT("Item 3"));

    wxBoxSizer sizer(wxHORIZONTAL);
    sizer.Add(lb, 1, wxEXPAND|wxALL, 5);
    dlg->SetSizer(&sizer);
    dlg->Show();

    return true;
}

xterro
In need of some credit
In need of some credit
Posts: 7
Joined: Fri Jul 19, 2013 1:59 pm

Re: Custom ListBox не вызывается метод OnPaint

Post by xterro » Sat Jul 20, 2013 11:53 am

Тему можно закрывать, вопрос решён. Если кому такой список нужен, забираем в этой ветке: http://forums.wxwidgets.org/viewtopic.p ... 88#p153688

Post Reply