не определяются координаты мыши Topic is solved

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
bastet_kat
Earned a small fee
Earned a small fee
Posts: 15
Joined: Sun Jun 29, 2008 8:27 pm
Contact:

не определяются координаты мыши

Post by bastet_kat »

Доброе время суток.
Cтолкнулась тут с проблемой, когда на форме нет ничего (wxPanel) то координаты мыши определяются замечательно, а когда ставлю панели, то все перестает работать.
А координаты очень надо определить именно на панели. может кто сталкивался с этой проблемой. помогите плз.
Координаты определяю с помощью wxGetMousePosition(&x, &y);
User avatar
T-Rex
Moderator
Moderator
Posts: 1249
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

Code: Select all

class MyPanel : public wxPanel
{
public:
	MyPanel(wxWindow * parent)
		: wxPanel(parent, wxID_ANY)
	{
		Connect(wxEVT_PAINT, wxPaintEventHandler(MyPanel::OnPaint));
		Connect(wxEVT_MOTION, wxMouseEventHandler(MyPanel::OnMouseMove));
	}
	
	void OnMouseMove(wxMouseEvent & event)
	{
		if(event.LeftIsDown()) Refresh();
	}

	void OnPaint(wxPaintEvent & event)
	{
		wxPaintDC dc(this);
		dc.SetBackground(wxBrush(GetBackgroundColour()));
		dc.Clear();
		wxPoint pos = wxGetMousePosition();
		pos = ScreenToClient(pos);
		dc.SetFont(GetFont());
		dc.DrawLabel(wxString::Format(wxT("%i, %i"), pos.x, pos.y), 
			wxRect(dc.GetSize()),
			wxALIGN_CENTER);
	}
};
tetex
In need of some credit
In need of some credit
Posts: 1
Joined: Mon Mar 02, 2009 9:28 pm

Post by tetex »

Добрый день!

Возможно, я упускаю из виду что-то фундаментально простое, но никак не могу понять что здесь не так.

Пример похож на тот, что описан в первом сообщении этой темы. Однако на wxPanel используются две wxStaticText-a. Пытаюсь засечь движения мыши по панели, и координаты отображать в этих двух "лабельках".

Но... ничего почему-то не выходит. Может кто-нибудь указать на "прорехи"?

Это main.cpp:

Code: Select all

#include "main.h"

IMPLEMENT_APP(wxTest)

bool wxTest::OnInit()
{
	MainFrame *frame = new MainFrame(wxT("Window Title"));

	frame->Show(TRUE);
	SetTopWindow(frame);
	return TRUE;
} 

MainFrame::MainFrame(const wxString& title)
:wxFrame(NULL, -1, title)
{
	wxPanel *panel = new wxPanel(this, wxID_ANY);
	wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);

	panel->SetSizer(vbox);
	
	xPos = new wxStaticText(panel, wxID_ANY, wxT("X: _"));
	yPos = new wxStaticText(panel, wxID_ANY, wxT("Y: _"));

	vbox->Add(xPos, wxSizerFlags(0).Align(1));
	vbox->Add(yPos, wxSizerFlags(0).Align(1));

	SetSize(500, 300);

	panel->Connect(wxID_ANY, wxEVT_MOTION, 
		wxMouseEventHandler(MainFrame::onMouseMove));

	Center();
}

void MainFrame::onMouseMove(wxMouseEvent& event)
{
	wxPoint p = wxGetMousePosition();
	p = ScreenToClient(p);
	xPos->SetLabel(wxString::Format(wxT("X: %d"), p.x));
	yPos->SetLabel(wxString::Format(wxT("X: %d"), p.y));
}
main.h:

Code: Select all

#include "wx/wx.h"
#include "wx/event.h"

class wxTest: public wxApp
{
	virtual bool OnInit();
};

class MainFrame: public wxFrame
{
public:
	MainFrame(const wxString& title);
	void onMouseMove(wxMouseEvent& event);
private:
	wxStaticText *xPos, *yPos;
};
User avatar
T-Rex
Moderator
Moderator
Posts: 1249
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Post by T-Rex »

Т.к. ты конектишь обработчик к панели, то внутри него this указывает не на форму, а на wxPanel. Для того чтобы получить доступ к лэйбам, тебе надо event.GetEventObject() закастить через wxDynamicCast к wxWindows, а потом от этого окна взять wxGetTopLevelParent() или как-то так и опять через wxDynamicCast закастить его к классу твоей формы.

Вот поэтому для использования обработчиков событий лучше сабкласиться, а не навешивать чужие функции.
Post Reply