custom event Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
p001
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Aug 28, 2022 9:24 am

custom event

Post by p001 »

Здравствуйте.

Имеем:
1. Мое событие;
2. Таблица событий.

Цель:
Создать свое событие и его использовать. При этом использовать таблицу событий.

Что делал:
1. Читал мануал, ничего не понял, как-то неочевидно;
2. Открыл код по пути wxWidgets\samples\event
Ожидаемо, как-то нагромажде, опять же не смог понять.

Мой код:

Code: Select all

#include <wx/wx.h>
#include <wx/button.h>

wxDEFINE_EVENT (myEvent, wxCommandEvent);

class MyWindow : public wxFrame {
	public:
		wxButton* m_button1;
			const int m_id_button1 = 1;

	public:
		MyWindow (const wxString& aTitle)
                    : wxFrame (0, wxID_ANY, aTitle, wxDefaultPosition, wxSize (150, 150)) {

			m_button1 = new wxButton (this, m_id_button1,
								wxT ("button1"));

			wxBoxSizer* boxSizerV = new wxBoxSizer (wxVERTICAL);
			boxSizerV->Add (m_button1, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);

			this->SetSizer (boxSizerV);

			Centre ();
		}

		DECLARE_EVENT_TABLE()

	private:
		BEGIN_EVENT_TABLE (MyWindow, wxFrame)
			myEvent (m_id_button1, MyWindow::clickButton)
		END_EVENT_TABLE ()

	public:

		void clickButton (wxCommandEvent& event) {

			if (event.GetId() == m_id_button1) {
				std::cout << "it works" << std::endl;
			}
		}
};

class MyApp : public wxApp {
	public:
		virtual bool OnInit () {
			MyWindow* MyWindow1 = new MyWindow (wxT("MyWindow1"));
			MyWindow1->Show (true);

			return true;
		}
};

IMPLEMENT_APP(MyApp)
Вопрос:
1. как создать свое событие и его использовать ?
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7387
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: custom event

Post by ONEEYEMAN »

Доброго времени суток,
Таблица событий должна быть вынесена в файл-исходник.
На каждый DECLARE_EVENT должен быть свой DEFINE_EVEBT.
Попробуйте посмотреть в исходниках библиотеки как создать событие. Так проще всего.

Если что - спрашивайте.

Спасибо.
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 425
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: custom event

Post by cutecode »

p001 wrote: Sat Sep 23, 2023 8:47 pm 1. Читал мануал, ничего не понял
"ничего не понял" - так не бывает, если ты понял хотябы одно предложение в мануале, значит ты хоть что нибудь да понял.
Пиши конкретно что не понятно.

Я начинал изучать с этой книги
https://docs.yandex.ru/docs/view?tm=169 ... 26nosw%3D1
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
p001
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Aug 28, 2022 9:24 am

Re: custom event

Post by p001 »

Прошу прощения за долгий ответ! был в долгой командировке.

Еще раз перечитал мануалы, частично понял но не до конца:
1. К примеру как создать свое событие с помощью "wxDEFINE_EVENT" и без создания класса, понял:

Code: Select all

wxDEFINE_EVENT (myEvent1, wxCommandEvent);
2. Как использовать стандартное событие и указать метод для обработки, тоже, вроде бы понял:

Code: Select all

wxCommandEvent event1 (wxEVT_COMMAND_BUTTON_CLICKED, m_button->GetId() );
event1.SetEventObject (this);
ProcessWindowEvent (event1);
p001
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Aug 28, 2022 9:24 am

Re: custom event

Post by p001 »

cutecode wrote: Mon Oct 09, 2023 11:36 pm Я начинал изучать с этой книги
Да, это первый мой учебник, но он в итоге ушел на 2й и 3й план после интернета, и других переводов )
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7387
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: custom event

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
Eta kniga horosha dlja azov bibluioteki.

Prosto posmotrite na god vypuska i bse pojmete... ;-)

A chto ne ponjatno s sozdaniem sobytija?

Kstati, punkt 2 luchshe ne ispolzovat. Kakoj smysl?
Vse standartnye sobyutija uge generirujutsja. - ih nugno prosto obrabatyvat...
dA I KSTATI - ETO NE UKAZANIE METODA DLJA OBRABOTKI - ETO "VYZOV OBRABOTCHIKA", ESLI HOTIOTE...


V chem zagvozdka?

Spasibo.
p001
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Aug 28, 2022 9:24 am

Re: custom event

Post by p001 »

ONEEYEMAN wrote: Wed Dec 20, 2023 8:17 pm Kstati, punkt 2 luchshe ne ispolzovat. Kakoj smysl?
Vse standartnye sobyutija uge generirujutsja. - ih nugno prosto obrabatyvat...
В моей проге нужно в определенный момент сделать имитацию нажатия на определенную кнопку.
p001
Knows some wx things
Knows some wx things
Posts: 25
Joined: Sun Aug 28, 2022 9:24 am

Re: custom event

Post by p001 »

ONEEYEMAN wrote: Wed Dec 20, 2023 8:17 pm dA I KSTATI - ETO NE UKAZANIE METODA DLJA OBRABOTKI - ETO "VYZOV OBRABOTCHIKA", ESLI HOTIOTE...
т.е. я не создаю событие и его "распространяю", а вызываю обработчик для этого события ?
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 425
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: custom event

Post by cutecode »

Я использую это функцию для симуляции нажатия клавиши
давно ее делал, уже точно ни помню как она работает

Code: Select all

__WXDLLMAIN__LIB__ void post_keys(wxWindow* pWnd, UINT nKey, bool bShift)
{
#ifdef __WXGTK__
        bShift = !bShift;
#endif // __WXGTK__

	pWnd->SetFocus();
	wxUIActionSimulator as;
	int  modifiers = wxMOD_NONE;

	if (bShift)
		modifiers |= wxMOD_SHIFT;

	as.Char(nKey, modifiers);
}
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7387
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: custom event

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
p001 wrote: Fri Dec 22, 2023 7:16 am
ONEEYEMAN wrote: Wed Dec 20, 2023 8:17 pm dA I KSTATI - ETO NE UKAZANIE METODA DLJA OBRABOTKI - ETO "VYZOV OBRABOTCHIKA", ESLI HOTIOTE...
т.е. я не создаю событие и его "распространяю", а вызываю обработчик для этого события ?
Ne sovsem tak,
Sobytie sozdaetsja v pervoj stroke:

Code: Select all

wxCommandEvent event1 (wxEVT_COMMAND_BUTTON_CLICKED, m_button->GetId() );
a zatem ukazyvaetsja kontrol kotoryj eto sobytie posylaet

Code: Select all

event.SetEventObject( this );
i nakonec sobytie otpravljaetsja v "message pump":

Code: Select all

ProcesswindowEvent( event1 );
Obrabotchik sobytija ne vyzyvaetsja - on ukazyvaetsja pri vyzove EVT_XXX() makrosov ili pri vyzove Bind().

A pri vypolnenii programmy po nastuplenii dannogo sobytija, vyzyvaetsja obrabotchik kotoryj byl associirovan i vypolnjaetsja.

Dlja nizkourovnevyh sobytij neobhodimo vyzyvat "event.Skip()", chtoby ne narushit rabotu sistemy (skagem esli suschestvuet obrabotchik nagatija klavishi, vyzov event.Skip() neobhodim, dlja togo chtoby otobrazit simvol na ekrane ili ge vypolnit dejstvja po umolchaniju.

Dlja komandnyh sobytij vyzov event.Skip() ne objazatelen - eto sobytija polzovatelskogo interfejsa i to chto vypolnjaetsja po umolchaniju mofwet ne potrebovatsja. A sobytie v zavisimosti ot algoritma moget potrebovatsja prosto s'est. ;-)

Pishite - poprobuju otvetit i objasnit bolshe.

Spasibo.
Post Reply