Mosync: обнаружение указателя / кликов - PullRequest
1 голос
/ 10 марта 2011

Я пытаюсь определить, когда на ярлык нажимают / указывают / нажимают.Я пришел из программирования на Win32 C ++ и Java Swing, и я знаю, что оба используют разные подходы к тому, как вы регистрируетесь для события / ввода.

Я посмотрел учебники, но не могу найти пример обнаружения щелчка.Есть ли константа для клика, поэтому я могу обнаружить ее в keyPressEvent (то есть, например, win32 и WM_LBUTTONDOWN)?Или мне нужно сначала зарегистрироваться на клик, а затем вызвать собственную функцию для обработки клика (например, Java & .addActionListener ())?

Мои попытки обнаружить клик ниже не работают:

#include <MAUtil/Moblet.h>
#include <MAUI/Layout.h>
#include <MAUI/ListBox.h>
#include <MAUI/Label.h>
#include <MAUI/EditBox.h>
#include <MAUI/Screen.h>
#include <MAUtil/Environment.h>
#include <madmath.h>
#include <conprint.h>


using namespace MAUtil;
using namespace MAUI;

class MouseScreen : public Screen, public PointerListener
{
    private:
        Label *testLabel;
    public:
        MouseScreen()
        {
            MAExtent screenDim = maGetScrSize();
            Layout* mainLayout  = new Layout( 0, 0, EXTENT_X(screenDim), EXTENT_Y(screenDim), NULL, 1, 3 );
            ListBox* mainListBox = new ListBox( 0, 0, 100, 200, mainLayout,
                                       ListBox::LBO_VERTICAL, ListBox::LBA_LINEAR,
                                       true );
            mainListBox -> setPaddingLeft( 10 );
            mainListBox -> setPaddingRight( 10 );
            mainListBox -> setPaddingTop( 10 );
            mainListBox -> setPaddingBottom( 10 );
            mainListBox -> setBackgroundColor( 900 );
            mainLayout  -> setBackgroundColor( 300 );

            testLabel = new Label( 10, 300, 50, 20, mainLayout );
            //testLabel -> addPointerListener( this );
            testLabel -> setCaption( "Click me" );

            mainLayout -> add( testLabel );
        }

        void pointerPressEvent( MAPoint2d p )
        {
            printf( "clicked" );  // never occurs

            // OR
            if ( testLabel.contains((MouseScreen*)p) )
            {
                printf( "Label clicked" );
            }
            // Should I call parent function
            // PointerListener :: pointerPressEvent( p );
        }

        void pointerMoveEvent( MAPoint2d p ) {}
        void pointerReleaseEvent( MAPoint2d p ) {}
};

class MouseMoblet : public Moblet
{
    public:
        MouseMoblet()
        {
            instance = new MouseScreen();
            instance -> show();
        }

        ~MouseMoblet()
        {
            delete instance;
        }

        void keyPressEvent(int keyCode, int nativeCode)
        {
            // todo: handle key presses
            printf( "Blah" ); // never occurs when I press the mouse, but other KEYS work
        }

        void keyReleaseEvent(int keyCode, int nativeCode)
        {
            // todo: handle key releases
        }

    private:
        MouseScreen *instance;
};

extern "C" int MAMain()
{
    Moblet::run(new MouseMoblet());
    return 0;
};

1 Ответ

0 голосов
/ 11 марта 2011

Я вижу некоторые вещи, которые вам нужно сделать.Во-первых, вам нужно установить mainLayout в качестве основного виджета для Screen, вызвав setMain (mainLayout).Это заставляет экран знать о mainLayout, чтобы он мог его рисовать.После того, как вы это сделаете, вы сможете увидеть свои виджеты на экране, а также получить события щелчка.

В pointerPressedEvent вы были почти правы, метод содержимого testLabel берет точку, а не экран.Здесь вы должны вызвать testLabel-> contains (px, py), чтобы оценить, нажата ли кнопка testLabel.

Полный пересмотренный код выглядит примерно так:

#include <MAUtil/Moblet.h>
#include <MAUI/Layout.h>
#include <MAUI/ListBox.h>
#include <MAUI/Label.h>
#include <MAUI/EditBox.h>
#include <MAUI/Screen.h>
#include <MAUtil/Environment.h>
#include <madmath.h>
#include <conprint.h>


using namespace MAUtil;
using namespace MAUI;

class MouseScreen : public Screen
{
    private:
        Label *testLabel;
    public:
        MouseScreen()
        {
            MAExtent screenDim = maGetScrSize();
            Layout* mainLayout  = new Layout( 0, 0, EXTENT_X(screenDim), EXTENT_Y(screenDim), NULL, 1, 3 );
            ListBox* mainListBox = new ListBox( 0, 0, 100, 200, mainLayout,
                                       ListBox::LBO_VERTICAL, ListBox::LBA_LINEAR,
                                       true );
            mainListBox -> setPaddingLeft( 10 );
            mainListBox -> setPaddingRight( 10 );
            mainListBox -> setPaddingTop( 10 );
            mainListBox -> setPaddingBottom( 10 );
            mainListBox -> setBackgroundColor( 900 );
            mainLayout  -> setBackgroundColor( 300 );

            testLabel = new Label( 10, 300, 50, 20, mainLayout );
            //testLabel -> addPointerListener( this );
            testLabel -> setCaption( "Click me" );

            mainLayout -> add( testLabel );

            setMain( mainLayout );
        }

        void pointerPressEvent( MAPoint2d p )
        {
            if ( testLabel->contains( p.x, p.y ) )
            {
                printf( "Label clicked" );
            }
        }

        void pointerMoveEvent( MAPoint2d p ) {}
        void pointerReleaseEvent( MAPoint2d p ) {}
};

class MouseMoblet : public Moblet
{
    public:
        MouseMoblet()
        {
            instance = new MouseScreen();
            instance -> show();
        }

        ~MouseMoblet()
        {
            delete instance;
        }

        void keyPressEvent(int keyCode, int nativeCode)
        {
            // todo: handle key presses
            printf( "Blah" ); // never occurs when I press the mouse, but other KEYS work
        }

        void keyReleaseEvent(int keyCode, int nativeCode)
        {
            // todo: handle key releases
        }

    private:
        MouseScreen *instance;
};

extern "C" int MAMain()
{
    Moblet::run(new MouseMoblet());
    return 0;
};

Примечание: Текущая система пользовательского интерфейса MoSync была разработана для телефонов без сенсорного ввода, поэтому она немного хитроумно обрабатывает события указателя, однако это будет улучшено в следующем выпуске.Не зависит от того, хотите ли вы сохранить поведение по умолчанию или нет, в настоящее время реализация Screen по умолчанию ничего не делает.

...