Обработка событий мыши над wxStaticBitmap Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Tapok
Earned a small fee
Earned a small fee
Posts: 22
Joined: Sun Aug 12, 2012 3:41 pm

Обработка событий мыши над wxStaticBitmap

Post by Tapok »

Всем доброго времени суток.
Пытаюсь перехватить движение/нажатие мыши над/по wxStaticBitmap

Первый вариант:

Code: Select all

BEGIN_EVENT_TABLE(GISALTFrame,wxFrame)
    //(*EventTable(GISALTFrame)
    //*)
    EVT_MOTION (GISALTFrame::OnMouseMove)
    EVT_LEFT_DOWN (GISALTFrame::OnLeftDown)
END_EVENT_TABLE()
второй:

Code: Select all

Connect(ID_STATICBITMAP1,wxEVT_LEFT_DOWN,(wxObjectEventFunction)&GISALTFrame::OnLeftDown);
Connect(ID_STATICBITMAP1,wxEVT_MOTION,(wxObjectEventFunction)&GISALTFrame::OnMouseMove);
функция срабатывающая по событию

Code: Select all

void GISALTFrame::OnMouseMove(wxMouseEvent& event)
{
    StaticText1->SetLabel(_T("MouseMove"));
}
В первом варианте событие перехватывается только над чистой частью окна (над контролами не работает)
Во втором не работает вообще...
Что же я делаю не так?
win7x64, codeblocks 12.11, MinGW 5.1.4, wxWidgets 2.8.12
Tapok
Earned a small fee
Earned a small fee
Posts: 22
Joined: Sun Aug 12, 2012 3:41 pm

Re: Обработка событий мыши над wxStaticBitmap

Post by Tapok »

как я писал, через connect тоже не получается

З.Ы. эм... я что только что удалил чужое сообщение О_О
win7x64, codeblocks 12.11, MinGW 5.1.4, wxWidgets 2.8.12
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Обработка событий мыши над wxStaticBitmap

Post by Mojo »

Code: Select all

Connect( wxEVT_MOTION, wxMouseEventHandler( GISALTFrame::OnMouseMove ), NULL, this );
в OnMouseMove(wxMouseEvent& event) нужно добавить event.Skip();
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Обработка событий мыши над wxStaticBitmap

Post by Mojo »

Tapok wrote:
З.Ы. эм... я что только что удалил чужое сообщение О_О
Да эт я удалил, я сразу не заметил, что в примере и connect есть.....

С лефтДаун должно быть тоже самое:

Code: Select all

Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( GISALTFrame::OnLeftDown ), NULL, this );
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Tapok
Earned a small fee
Earned a small fee
Posts: 22
Joined: Sun Aug 12, 2012 3:41 pm

Re: Обработка событий мыши над wxStaticBitmap

Post by Tapok »

не пашет :(
все прекрасна работает но не дальше основного окна (над контролами ровным счетом 0 )
win7x64, codeblocks 12.11, MinGW 5.1.4, wxWidgets 2.8.12
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Обработка событий мыши над wxStaticBitmap

Post by Mojo »

ыыыы опять не заметил... что есть идентификатор ID_STATICBITMAP1 если используется идентификатор, то коннект должен быть такой:

Code: Select all

Connect( ID_STATICBITMAP1, wxEVT_MOTION, wxMouseEventHandler( GISALTFrame::OnMouseMove ) );

Code: Select all

Connect( ID_STATICBITMAP1, wxEVT_LEFT_DOWN, wxMouseEventHandler( GISALTFrame::OnLeftDown ) );
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Обработка событий мыши над wxStaticBitmap

Post by Mojo »

Tapok wrote:не пашет :(
все прекрасна работает но не дальше основного окна (над контролами ровным счетом 0 )
Ну дык над контроллами и не должен пахать, он ток над битмапом будет пахать, его же привязываешь в коннекте
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Tapok
Earned a small fee
Earned a small fee
Posts: 22
Joined: Sun Aug 12, 2012 3:41 pm

Re: Обработка событий мыши над wxStaticBitmap

Post by Tapok »

так вобще не робит

зы

Code: Select all

const long GISALTFrame::ID_STATICBITMAP1 = wxNewId();
Ну дык над контроллами и не должен пахать, он ток над битмапом будет пахать, его же привязываешь в коннекте
над бит мапом не робит
win7x64, codeblocks 12.11, MinGW 5.1.4, wxWidgets 2.8.12
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Обработка событий мыши над wxStaticBitmap

Post by Mojo »

Мы не поймем друг друга )) что значит контроллы и основное окно? Контроллы находятся в основном окне? Или окно отдельно а контроллы отдельно? Если контроллы отдельно то где они находятся? кто родитель контроллов? Битмап? или панель? или....
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Обработка событий мыши над wxStaticBitmap

Post by Mojo »

Tapok wrote:так вобще не робит

зы

Code: Select all

const long GISALTFrame::ID_STATICBITMAP1 = wxNewId();
Ну дык над контроллами и не должен пахать, он ток над битмапом будет пахать, его же привязываешь в коннекте
над бит мапом не робит
А битмап где? в панелее или во фрейме?
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Tapok
Earned a small fee
Earned a small fee
Posts: 22
Joined: Sun Aug 12, 2012 3:41 pm

Re: Обработка событий мыши над wxStaticBitmap

Post by Tapok »

Под контролами я понимаю кнопки и битмап на основном окне

кстати Connect( wxID_ANY, тоже не подошло
А битмап где? в панелее или во фрейме?
если ты про wxPanel то нет, я его не размещал, просто кинул на формочку статик битмап
win7x64, codeblocks 12.11, MinGW 5.1.4, wxWidgets 2.8.12
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Обработка событий мыши над wxStaticBitmap

Post by Mojo »

Tapok wrote:Под контролами я понимаю кнопки и битмап на основном окне

кстати Connect( wxID_ANY, тоже не подошло
А битмап где? в панелее или во фрейме?
если ты про wxPanel то нет, я его не размещал, просто кинул на формочку статик битмап
Дак кнопки размещены на битмапе? :shock: :shock:
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Tapok
Earned a small fee
Earned a small fee
Posts: 22
Joined: Sun Aug 12, 2012 3:41 pm

Re: Обработка событий мыши над wxStaticBitmap

Post by Tapok »

Нет :) рядышком

Code: Select all

#include "GISALTMain.h"
#include <wx/msgdlg.h>

//(*InternalHeaders(GISALTFrame)
#include <wx/settings.h>
#include <wx/intl.h>
#include <wx/string.h>
//*)

#include <wx/dcmemory.h>
#include <wx/dcbuffer.h>

#include "wx/image.h"

wxArrayString IMG_PATHS;
wxString TXT_PATH;
wxString OUT_PATH;

void OnLeftDown2(/*wxMouseEvent& event*/)
{
    //StaticText1->SetLabel(_T("LeftDown"));
    MessageBoxA(0,"","",0);
}

//helper functions
enum wxbuildinfoformat {
    short_f, long_f };

wxString wxbuildinfo(wxbuildinfoformat format)
{
    wxString wxbuild(wxVERSION_STRING);

    if (format == long_f )
    {
#if defined(__WXMSW__)
        wxbuild << _T("-Windows");
#elif defined(__UNIX__)
        wxbuild << _T("-Linux");
#endif

#if wxUSE_UNICODE
        wxbuild << _T("-Unicode build");
#else
        wxbuild << _T("-ANSI build");
#endif // wxUSE_UNICODE
    }

    return wxbuild;
}

//(*IdInit(GISALTFrame)
const long GISALTFrame::ID_BUTTON6 = wxNewId();
const long GISALTFrame::ID_BUTTON7 = wxNewId();
const long GISALTFrame::ID_STATICTEXT1 = wxNewId();
const long GISALTFrame::ID_TOGGLEBUTTON1 = wxNewId();
const long GISALTFrame::ID_TOGGLEBUTTON2 = wxNewId();
const long GISALTFrame::ID_TOGGLEBUTTON3 = wxNewId();
const long GISALTFrame::ID_TOGGLEBUTTON4 = wxNewId();
const long GISALTFrame::ID_TOGGLEBUTTON5 = wxNewId();
const long GISALTFrame::ID_TOGGLEBUTTON6 = wxNewId();
const long GISALTFrame::ID_BUTTON5 = wxNewId();
const long GISALTFrame::ID_STATICBITMAP1 = wxNewId();
const long GISALTFrame::ID_STATICTEXT8 = wxNewId();
//*)

BEGIN_EVENT_TABLE(GISALTFrame,wxFrame)
    //(*EventTable(GISALTFrame)
    //*)
END_EVENT_TABLE()

GISALTFrame::GISALTFrame(wxWindow* parent,wxWindowID id)
{
    //(*Initialize(GISALTFrame)
    wxBoxSizer* BoxSizer4;
    wxBoxSizer* BoxSizer6;
    wxBoxSizer* BoxSizer2;
    wxBoxSizer* BoxSizer1;
    wxBoxSizer* BoxSizer3;

    Create(parent, wxID_ANY, _("GIS"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, _T("wxID_ANY"));
    BoxSizer1 = new wxBoxSizer(wxVERTICAL);
    BoxSizer2 = new wxBoxSizer(wxHORIZONTAL);
    Button6 = new wxButton(this, ID_BUTTON6, _("Label"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON6"));
    BoxSizer2->Add(Button6, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    Button7 = new wxButton(this, ID_BUTTON7, _("Label"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON7"));
    BoxSizer2->Add(Button7, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("Label"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1"));
    BoxSizer2->Add(StaticText1, 0, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    BoxSizer1->Add(BoxSizer2, 0, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
    BoxSizer6 = new wxBoxSizer(wxHORIZONTAL);
    ToggleButton1 = new wxToggleButton(this, ID_TOGGLEBUTTON1, _("Карта 1"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TOGGLEBUTTON1"));
    BoxSizer6->Add(ToggleButton1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    ToggleButton2 = new wxToggleButton(this, ID_TOGGLEBUTTON2, _("Карта 2"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TOGGLEBUTTON2"));
    BoxSizer6->Add(ToggleButton2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    ToggleButton3 = new wxToggleButton(this, ID_TOGGLEBUTTON3, _("Сдвиг и поворот"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TOGGLEBUTTON3"));
    BoxSizer6->Add(ToggleButton3, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    ToggleButton4 = new wxToggleButton(this, ID_TOGGLEBUTTON4, _("Аффинное"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TOGGLEBUTTON4"));
    BoxSizer6->Add(ToggleButton4, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    ToggleButton5 = new wxToggleButton(this, ID_TOGGLEBUTTON5, _("Проективное"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TOGGLEBUTTON5"));
    BoxSizer6->Add(ToggleButton5, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    ToggleButton6 = new wxToggleButton(this, ID_TOGGLEBUTTON6, _("Квадратичное"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_TOGGLEBUTTON6"));
    BoxSizer6->Add(ToggleButton6, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    Button5 = new wxButton(this, ID_BUTTON5, _("Вычислить"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON5"));
    BoxSizer6->Add(Button5, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    BoxSizer1->Add(BoxSizer6, 0, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
    BoxSizer4 = new wxBoxSizer(wxHORIZONTAL);
    StaticBitmap1 = new wxStaticBitmap(this, ID_STATICBITMAP1, wxNullBitmap, wxDefaultPosition, wxSize(760,243), 0, _T("ID_STATICBITMAP1"));
    StaticBitmap1->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRADIENTINACTIVECAPTION));
    BoxSizer4->Add(StaticBitmap1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    BoxSizer1->Add(BoxSizer4, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    BoxSizer3 = new wxBoxSizer(wxHORIZONTAL);
    StaticText8 = new wxStaticText(this, ID_STATICTEXT8, _("Label"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT8"));
    BoxSizer3->Add(StaticText8, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
    BoxSizer1->Add(BoxSizer3, 0, wxALL|wxALIGN_LEFT|wxALIGN_BOTTOM, 5);
    SetSizer(BoxSizer1);
    BoxSizer1->Fit(this);
    BoxSizer1->SetSizeHints(this);

    Connect(ID_BUTTON6,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&GISALTFrame::OnButton6Click);
    //Connect(ID_STATICBITMAP1,wxEVT_KEY_UP,(wxObjectEventFunction)&GISALTFrame::OnKeyUp);
    //Connect(ID_STATICBITMAP1,wxEVT_LEFT_DOWN,(wxObjectEventFunction)&GISALTFrame::OnLeftDown);
    //Connect(ID_STATICBITMAP1,wxEVT_MOTION,(wxObjectEventFunction)&GISALTFrame::OnMouseMove);
    //*)
    //Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( OnLeftDown2 ), NULL, this );
    //Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( GISALTFrame::OnLeftDown ), NULL, this );
    Connect( wxID_ANY, wxEVT_LEFT_DOWN, wxMouseEventHandler( GISALTFrame::OnLeftDown ) );
}

GISALTFrame::~GISALTFrame()
{
    //(*Destroy(GISALTFrame)
    //*)
}

void GISALTFrame::OnQuit(wxCommandEvent& event)
{
    Close();
}

void GISALTFrame::OnAbout(wxCommandEvent& event)
{
    wxString msg = wxbuildinfo(long_f);
    wxMessageBox(msg, _("Welcome to..."));
}

void GISALTFrame::OnButton6Click(wxCommandEvent& event)
{
    wxImage image;
    if (image.LoadFile(_T("C:\\asd.png")))
    {

        wxMemoryDC memDC;
        wxBufferedPaintDC sssd(this);
        wxBitmap bitmap(image.GetWidth(), image.GetHeight());
        memDC.SelectObject(bitmap);
        memDC.SetBackground(*wxWHITE_BRUSH);
        memDC.Clear();
        memDC.DrawBitmap(image, 0, 0, false);

        StaticBitmap1->SetBitmap(bitmap);

        memDC.SelectObject(wxNullBitmap);
        //bitmap.SaveFile(tmp_path,wxBITMAP_TYPE_JPEG);
    }
    image.Destroy();

}

void GISALTFrame::OnMouseMove(wxMouseEvent& event)
{
    StaticText1->SetLabel(_T("MouseMove"));
}

void GISALTFrame::OnKeyUp(wxKeyEvent& event)
{
    StaticText1->SetLabel(_T("KeyUp"));
}

void GISALTFrame::OnLeftDown(wxMouseEvent& event)
{
    StaticText1->SetLabel(_T("LeftDown"));
}


Attachments
Безымянный.PNG
Безымянный.PNG (5.18 KiB) Viewed 9424 times
Last edited by Tapok on Wed Nov 28, 2012 6:06 pm, edited 2 times in total.
win7x64, codeblocks 12.11, MinGW 5.1.4, wxWidgets 2.8.12
Mojo
Super wx Problem Solver
Super wx Problem Solver
Posts: 401
Joined: Wed Sep 21, 2005 8:17 am
Location: Rostov-on-Don, Southern Russia

Re: Обработка событий мыши над wxStaticBitmap

Post by Mojo »

Tapok wrote:Нет :) рядышком
Ну тогда все правильно, над контроллами и не должно пахать, битмап то привязан, а вот почему над битмапом не пашет, это нужно подумать....

Документация пишет, что : ....... It is meant for display of the small icons in the dialog boxes and is not meant to be a general purpose image display control. In particular, under Windows 9x the size of bitmap is limited to 64*64 pixels and thus you should use your own control if you want to display larger images portably.

http://docs.wxwidgets.org/2.8/wx_wxstaticbitmap.html

т.е. небольшая иконка и только в диалогах и с ограниченным размером. Статикбитмап не предназначен для общих задач работы с картинками. Как я понимаю, нужно использовать wxImage
Win XP HE SP3, Vista
Xubuntu 12.04 LTS
wxWidgets-2.9.5
wxWidgets-3.0.0
Tapok
Earned a small fee
Earned a small fee
Posts: 22
Joined: Sun Aug 12, 2012 3:41 pm

Re: Обработка событий мыши над wxStaticBitmap

Post by Tapok »

Вобщем изначально задача состоит в отрисовки изображения/ЧастиИзображения если не влезает в область окна, и передвижения этого изображения (Мышкой естественно). Может есть идеи чем заменить Статик битмап, к примеру просто "пробелами" сделать чистый участок окна и уже в него рисовать?

ЗЫ разве wxImage рисует в окнах? помоему за это отвечает *DC
Last edited by Tapok on Wed Nov 28, 2012 5:45 pm, edited 1 time in total.
win7x64, codeblocks 12.11, MinGW 5.1.4, wxWidgets 2.8.12
Post Reply