c++ touchscreen ansteuern


momosxp

Member
Joined
Apr 8, 2008
Messages
327
Location
Germany
Hätte vll jemand ein Fertiges Codebeispiel für die Touchpad steuerung?
z.B. dass ein 10x10 pixel Block an die stelle gezeichnet wird, wo man mit dem Touchstift aufkommt.
Danke schonmal im Vorraus.
 
Wenn ich das richtig verstanden habe, simuliert der Touchscreen eine Maus

Dann könntest du versuchen
Code:
SDL_ShowCursor(SDL_ENABLE);
einzufügen //Es wird der MausCursor angezeigt
Code:
SDL_WarpMouse(X, Y);
//Mit dem kannst du die Maus auf bestimmte koords schieben

und wie du die Maus einlest muss ich noch ein altes Programm suchen, wo ich dass gemacht hab, dann kann ich das Posten

mfg
Beltar

Ich hab was im SDL Modul meiner Schule gefunden
Code:
int getMouseMotionEvent(int * x, int * y)
{
    int ret = FALSE;
    if (event.type == SDL_MOUSEMOTION)
    {  
        *x = event.motion.x;
        *y = event.motion.y;
        ret = TRUE;
    }
    return ret;    
}

int getMouseButtonEvent(int * x, int * y)
{
    int ret = FALSE;
    if (event.type == SDL_MOUSEBUTTONDOWN)
    {
        *x = event.button.x;
        *y = event.button.y;

        switch ( event.button.button)
        {
               case  1 :   ret = MOUSE_LEFT;   break;
               case  2 :   ret = MOUSE_MIDDLE; break;
               case  3 :   ret = MOUSE_RIGHT;  break;
               default :   ret = -1;           break;
        }       
    }               
    return ret;
}

Die erste Funktion hab ich auf dem ersten Blick noch nicht durchschaut
Aber die Zweite sollte dir die Koords und den Tastenclick liefern, wenn einer gedrückt wurde
 
hm, danke. Bin aber noch c++ anfänger. Könntest du das komplett in ein Projekt einfügen, dass man kompilieren kann, sodass es dann auf dem gp2x läuft?
 
momosxp said:
hm, danke. Bin aber noch c++ anfänger. Könntest du das komplett in ein Projekt einfügen, dass man kompilieren kann, sodass es dann auf dem gp2x läuft?

Ich gebe keine Garantie, dass es funktioniert :)
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <SDL.h>


#define MOUSE_LEFT           1
#define MOUSE_MIDDLE         2
#define MOUSE_RIGHT          3

/* GP2X button mapping */
enum MAP_KEY
{
	VK_UP         , // 0
	VK_UP_LEFT    , // 1
	VK_LEFT       , // 2
	VK_DOWN_LEFT  , // 3
	VK_DOWN       , // 4
	VK_DOWN_RIGHT , // 5
	VK_RIGHT      , // 6
	VK_UP_RIGHT   , // 7
	VK_START      , // 8
	VK_SELECT     , // 9
	VK_FL         , // 10
	VK_FR         , // 11
	VK_FA         , // 12
	VK_FB         , // 13
	VK_FX         , // 14
	VK_FY         , // 15
	VK_VOL_UP     , // 16
	VK_VOL_DOWN   , // 17
	VK_TAT          // 18
};
SDL_Event event;
/* The screen surface, joystick device */
SDL_Surface *screen = NULL;
SDL_Joystick *joy = NULL;


int getMouseButtonEvent(int * x, int * y); //#!Unser Prototyp; damit unsere Main unsere Funktion kennt

void Terminate(void)
{
	SDL_Quit();
#ifdef GP2X
	chdir("/usr/gp2x");
	execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
#endif
}

int main (int argc, char *argv[])
{
	int done;

	/* Initialize SDL */
	if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) {
		fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ());
		exit (1);
	}
	atexit (Terminate);

	SDL_ShowCursor(SDL_ENABLE);
	

	/* Set 320x240 16-bits video mode */
	screen = SDL_SetVideoMode (320, 240, 16, SDL_SWSURFACE);
	if (screen == NULL) {
		fprintf (stderr, "Couldn't set 320x240x16 video mode: %s\n", SDL_GetError ());
		exit (2);
	}

	/* Check and open joystick device */
	if (SDL_NumJoysticks() > 0) {
		joy = SDL_JoystickOpen(0);
		if(!joy) {
			fprintf (stderr, "Couldn't open joystick 0: %s\n", SDL_GetError ());
		}
	}

#ifdef GP2X
	/* Only use GP2X code here */
#endif

#ifdef WIN32
	/* Only use Windows code here */
#endif
    int button,x=50,y=50;
	done = 0;
	while (!done)
	{
		
       
		/* Check for events */
		while (SDL_PollEvent (&event))
		{
            button = getMouseButtonEvent( &x, &y); //#! & Übergibt die Addresse (ZEIGER)
               
			switch (event.type)
			{
				case SDL_KEYDOWN:
					/* if press Ctrl + C, terminate program */
					if ( (event.key.keysym.sym == SDLK_c) && (event.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) )
						done = 1;
					break;
				case SDL_KEYUP:
					break;
				case SDL_JOYBUTTONDOWN:
					/* if press Start button, terminate program */
					if ( event.jbutton.button == VK_START )
						done = 1;
					break;
				case SDL_JOYBUTTONUP:
					break;
				case SDL_QUIT:
					done = 1;
					break;
				default:
					break;
			}
		}

		/* Processing */
	}

	return 0;
}


int getMouseButtonEvent(int * x, int * y)  //#!Funktion  Rückgabewert Name( * = Zeiger, y); Zeiger = Zeigt auf einen Speicherbereich d.h. Die Variable kann in der Funktion verändert werden
{
    int ret = 0;
    if (event.type == SDL_MOUSEBUTTONDOWN)
    {
        *x = event.button.x;
        *y = event.button.y;

        switch ( event.button.button)
        {
               case  1 :   ret = MOUSE_LEFT; SDL_WarpMouse(*x, *y+10);  break;
               
               case  2 :   ret = MOUSE_MIDDLE; break;
               case  3 :   ret = MOUSE_RIGHT;  break;
               default :   ret = -1;           break;
        }       
    }               
    return ret;
}
 
momosxp said:
Danke! Funktioniert super!

Funktioniert der Touchscreen wirklich? Wenn Ja cool :lol: (HAb keinen F200 zum testen^^)

Achja Zum Testen am PC hab ich eingestellt, dass er die Maus 10 Pixel nach unten verschiebt

mfg
Beltar
 
jo er verschiebt sich nach unten um 10px. aber auf dem gp2x ist mir das nich aufgefallen


aber wie kann ich eigentlich im main teil die koordinaten auslesen??
also ich möchte im main teil folgendes machen

image = IMG_Load("test.png");
SDL_Rect rcDest = { mousex, mousey, 0, 0 };
SDL_BlitSurface(image, NULL, screen, &rcDest);
SDL_Flip(screen);

also das Bild mit der mouse verschieben lassen. Aber wie komm ich an die koordinaten, die ja erst weiter unten in einer anderen funktion ermittelt werden?
 
Code:
int getMouseButtonEvent(int * x, int * y)

Der * bei der funktion heißt, dass es ein Zeiger ist.
Das bedeutet, das du, wenn du es aufrufst eine Addresse übergeben musst (&mouseX, &mouseY);
Genau in diesen beiden Variablen stehen die Koordinaten drin;

Du könntest auch sowie ich, das gleich in der funktion machen: (SDL_WarpMouse(*x, *y);)

mfg
beltar
 
Code:
int mouseX;
int mouseY;
getMouseButtonEvent(&mouseX,&mouseY);
image = IMG_Load("test.png");
SDL_Rect rcDest = {mouseX,mouseY, 0, 0 };
SDL_BlitSurface(image, NULL, screen, &rcDest);
 SDL_Flip(screen);

Hier bekomme ich irgendwie riesige Werte für mousex und mousey heraus..

edit: habs raus. Und zwar genau so, wie es da schon steht.. nur erkennt er am anfang zu hohe werte. Hab für mousex und mousey einfach 0 als anfangswert gesetzt und das ganze in die while schleife gepackt.

Gibts eigentlich auch ein Ersatz für cout, den man bei dem GP2x verwenden kann um strings auszugeben??

Danke nochmal für die Hilfe
 
Hallo,

nur eine Vermutung, aber printf sollte als "ersatz" für cout gehen.

Gruß
Rene
 
printf geht leider auch nicht.. das ist nur im Hintergrund in der Konsole sichtbar. Auf dem GP2X also gar nicht.
 
Nö. Für text auf dem Bildschirm musst Du Dir selbst was schreiben, das die Pixel setzt.
 
http://archive.gp2x.de/cgi-bin/cfiles.cgi?0,0,0,0,19,2580

Ich hab jetzt mal die SDL Libaries von meiner Schule hochgeladen
Anleitung steht dabei.

Da ist auch eine Funktion textSdl(); drin

hoffe du kannst sie einbinden
Beltar
 
also ich hab die cpp zum projekt hinzugefügt und in die main.cpp #include "SDLUtilities.h" oben reingeschrieben.
so sieht mein Linker aus: "-lSDL -lSDL_image -lpng -lSDLmain -lmingw32 -lSDL_ttf -lSDL_mixer"

Aber sobald ich es kompilieren will bekomme ich folgende Fehler:



edit: hab den Fehler reduziert. Nun bekomme ich bei exe "wrong file format" und bei "gpe cannot find -lmingw32 "
 
momosxp said:
also ich hab die cpp zum projekt hinzugefügt und in die main.cpp #include "SDLUtilities.h" oben reingeschrieben.
so sieht mein Linker aus: "-lSDL -lSDL_image -lpng -lSDLmain -lmingw32 -lSDL_ttf -lSDL_mixer"

Aber sobald ich es kompilieren will bekomme ich folgende Fehler:



edit: hab den Fehler reduziert. Nun bekomme ich bei exe "wrong file format" und bei "gpe cannot find -lmingw32 "


multiple definition of getMousebuttonevent (int*,int*) !!!!!

Diese funktion wird in der header auch definiert! lösch sie aus der main

2.) such in der Utilities.cpp nach event und setz ein extern davor
(extern SdlEvent event;) so in etwa

mfg
Beltar
 
wie schon gesagt: hab den Fehler reduziert. Nun bekomme ich bei exe "wrong file format" und bei "gpe cannot find -lmingw32 "
 
Hi,

ich hab das Beispiel auch mal kompiliert und das funktionierte auch,
nur leider tut sich dann auf meinem F200 nix, sprich: der Mauszeiger
bleibt einfach in der linken oberen Ecke.

Ich habe das selbe Problem mit dem neuen Touchscreen-Beispiel
(siehe http://archive.gp2x.de/cgi-bin/cfiles.cgi?0,0,0,0,46,2533).
Kompilieren O.K. und dann nischte.

Könnte das an der open2x-toolchain liegen? Ich hatte die extra
nochmal neu installiert, nachdem die ersten Versuche erfolglos
blieben. Hat leider bislang alles nichts geholfen.
Ich vermute ja irgendwie, dass ich 'ne falsche/alte SDL lib habe.
Ach ja: ich benutze zum Kompilieren das Script 'compile2.sh',
welches dem neuen Touchscreen-Beispiel beiliegt.

Bin echt schon so halb am verzweifeln :( . Hab mir den F200 erst vor
kurzem zugelegt und der Touchscreen war mit eines der Ausschlag
gebenden Kriterien.

Beste Grüße und vielen Dank für die hoffentlich zahlreich eintrudelnden
Antworten!

Andreas

(Ist meine erste Nachricht hier - wenn ich diesbzgl. also was falsch mache,
bitte gleich einen netten Hinweis an mich. Danke.)
 
momosxp said:
wie schon gesagt: hab den Fehler reduziert. Nun bekomme ich bei exe "wrong file format" und bei "gpe cannot find -lmingw32 "

Hast du schon probiert ein neues Projekt zu erstellen, und geschaut ob das geht?

Du könntest auch versuchen die datei direct einzubinden
Projektoptionen->Parameter->Linker feld
Da schreibst du den Pfad von der libmingw32.a (oder so ähnlich) hinein. Für Win liegt die datei im Dev->lib-> ordner

mfg
Beltar

@MojoMan

Gehen andere Touchscreenprogramme (Welche schon kompiliert heruntergeladen wurden)?
Sonst kann ich dir leider auch nicht helfen
 
Hi Beltar,

andere Touchscreen-Programme funktionieren und auch die
vorkompilierte Version des neuen Touchscreen-Beispiels
(ich meine das aus dem Archiv).

Das geht nur nicht, wenn ich es selber kompiliere.
Deshalb meine Vermutung, dass irgendwas mit der SDL-Lib
nicht stimmt. Vielleicht hab ich da was falsch gemacht beim
Installieren der Toolchain. Ich hab die Libs von folgender Seite
genommen:

http://www.open2x.org/open2x/toolchains/open2x-libpack-20071903-gcc-4.1.1-glibc-2.3.6.tar.bz2.zip

Das hab ich von wiki.gp2x.org -> Installing the Open2x toolchain

19.03.2007 scheint mir aber auch so'n bisserl alt zu sein ...

Edit: habe jetzt auch nochmal die Prerelease-Version ausprobiert
(http://www.open2x.org/open2x/toolchains/open2x-prerelease-libpack-20070307-gcc-4.1.1-glibc-2.3.6.zip),
das hat aber leider auch nichts gebracht
Edit2: Mach mich jetzt über das SVN-Repository (gibt's da auch 'nen deutschen Ausdruck?)
her und werde mal versuchen, die letzte Version der Libs selber zu kompilieren ...

MfG

Andreas
 
Back
Top