Aller Anfang ist schwer (Tastatur frei definieren wie???)



  • Also es gilt IDM_DOWN == Accelerator(VK_SPACE)? Dann mach IDM_DOWN == Accelerator(andere Taste) und fertig.

    Da brauch man doch kein Tutorial, soll nochmal jemand sagen, programmieren wäre kompliziert.

    Bye, TGGC



  • @ TGGC
    Nein mein Problem ist es nicht eine Taste im Program durch eine andere zu ersetzen. Das habe ich schon mehrfach getan.
    Mein Problem ist, dass ich einen callback windowhandler für mein Spielfenster habe.

    LRESULT CALLBACK ultris_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    	{
    	switch(msg)
    		{
    		case WM_COMMAND:		
    			switch( LOWORD( wParam))
    			{
    			case IDM_EXIT:
    				PostMessage( hWnd, WM_CLOSE, 0, 0);
    				return 0;
    			// V02 Sound ============================================================
    			case ID_ULTRIS_SOUND:
    				ultris_sounds.on = !ultris_sounds.on;
    				CheckMenuItem( ultris_menu, ID_ULTRIS_SOUND, // Menue Häckchen setzen
    						ultris_sounds.on ?	MF_CHECKED:MF_UNCHECKED);
    				return 0;
    			// V02 ENDE ==============================================================
    			case IDM_TEST:
    				return 0;
    			// V05 Dialoge=========================
    ............// und so weiter
    

    und Einträge in der resource.h, welche durch definieren der Accelerator entstehen

    Z.B. ID: IDM_EXIT Taste: VK_ESCAPE Typ: VirtualKey

    sieht in der resource.h dann so aus

    aus resource.h

    #define IDM_EXIT                        1001
    

    So diese Informationen habe ich und kenne ich.
    Nun möchte ich , das der Spieler seine Tasten im Game über ein Konfigdialog verändern kann.

    z.B. ID: IDM_EXIT Taste: VK_A Typ: VirtualKey

    wie es in fast jedem Egoshooter auch gang und gebe ist.

    gibt es da eine Funktion womit man die Accelerator Tasten während des Betriebs ändern kann ?? Oder geht das gar nicht?? Oder muß ich komplet anders an das Problem ran gehen 😕 😕
    Habe leider in der MSDN Libary nichts gefunden womit ich das Problem hätte lösen konnen 😡 vielleicht habe ich auch nur an den falschen Stellen gesucht ich weiß es leider nicht 😡 *verzweifel**aargh*

    Ach ja darüber hinaus habe ich irgendwie noch ein anderes Problem:

    void ultris::down()
    	{	
       	int testblockiert = 1;
    
    	int key = VK_SPACE;
    
    	while(HIWORD(GetAsyncKeyState(key)))   //VK_SPACE
    		{			
    		if(testblockiert==1)
    			{
    			testblockiert = onestep(); // leifert bei blockierung 0 zurück
    			display();			
    			}
    		else
    			reset_timer();  // verhindern das der nächste spielstein nach einem block sich ungesehen bewegt (bewegung abhängig von verstichenen zeit)
    		}
    	}
    

    Und zwar wenn ich key = VK_SPACE; durch key = VK_A; ersetze meldet mir der Compiler immer

    Kompilierung läuft...
    Demo.cpp
    c:\mp3 & projekte\spielcoding\utetris\v18\demo.cpp(1641) : error C2065: 'VK_A' : nichtdeklarierter Bezeichner
    Fehler beim Ausführen von cl.exe.
    

    diesen Fehler warum in der MSDN steht das VK_A so richtig sei ??
    aus MSDN

    VK_A 41 a key

    😕

    gruß wastman



  • Die Werte hinter case müssen Konstanten sein, daher kannst du dieses Konstrukt nicht verwenden, wenn sich die Vergleichswerte während der Laufzeit ändern. Benutze if.

    /*
    * VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
    * 0x40 : unassigned
    * VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
    */

    Bye, TGGC



  • Danke mit den Hex werten konnte ich auch die anderen tasten ansprechen 😃

    nun versuche ich eine in einer DAT datei defienierte Taste anzusprechen.

    Beispiel:
    in der config.dat datei steht der Wert 32, // 32 sollte der ascii wert von space sein,wenn ich mich nicht irre, jedenfals schreibt der compiler bei key = VK_SPACE; diesen Wert in key 👍
    dieser wird ausgelesen und in eine Variable tasten[] geschrieben

    spieltasten::spieltasten()
    	{
    	int i;
    	FILE *pf;
    
    	for( i = 0; i < 5; i++)
    		{
    		tasten[i] = 0;
    		}
    
    	pf = fopen( "data/config.dat", "r");
    	if( !pf)
    		return;
    
    	for( i = 0; i < 5; i++)
    		{
    		fscanf( pf, "%d,", &tasten[i]);
    		} 
    	fclose( pf);
    	}
    

    nun versuche ich im windowhandler darauf zu reagieren

    LRESULT CALLBACK ultris_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    	{
    	switch(msg)
    		{
    		case WM_COMMAND:		
    			switch( LOWORD( wParam))
    			{
    			case IDM_EXIT:
    				PostMessage( hWnd, WM_CLOSE, 0, 0);
    				return 0;
    ....
    ....
    		/*	case IDM_DOWN:
    				if(mein_spiel.spiel_laeuft)							
    					mein_spiel.down();					
    				return 0;		       */
    			case IDM_SCHNELLER:
    				mein_spiel.schneller();
    				return 0;
    			case IDM_LANGSAMER:
    				mein_spiel.langsamer();
    				return 0;
    
    			// V10======================================================================
    			case IDM_DREHRECHTS:
    				if(mein_spiel.spiel_laeuft)							
    					mein_spiel.drehen(1);
    				return 0;
    			case IDM_DREHLINKS:
    				if(mein_spiel.spiel_laeuft)							
    					mein_spiel.drehen(-1);
    				return 0;
    			case IDM_RECHTS:
    				if(mein_spiel.spiel_laeuft)							
    					mein_spiel.bewegen(1);   
    				return 0;
    			case IDM_LINKS:
    				if(mein_spiel.spiel_laeuft)							
    					mein_spiel.bewegen(-1);
    				return 0;
    			// V12 Beginn ===========================================================
    			case ID_INFO_HIGHSCORES:
    				DialogBox( ultris_instance, MAKEINTRESOURCE( IDD_HIGHSCORE), ultris_window, highscoredialog);
    				mein_spiel.reset_timer();
    				return 0;
    			}
      			if(wParam == ultris_tasten.tasten[0])    //<<<<<<<<< HIER
    				if(mein_spiel.spiel_laeuft)	
    					mein_spiel.down();					
    
    			break;
    
    	case WM_GETMINMAXINFO:
    		((MINMAXINFO *)lParam)->ptMinTrackSize.x = ((MINMAXINFO *)lParam)->ptMaxTrackSize.x = ultris_bruttobreite;
    		((MINMAXINFO *)lParam)->ptMinTrackSize.y = ((MINMAXINFO *)lParam)->ptMaxTrackSize.y = ultris_bruttohoehe;
    		return 0;
    	case WM_DESTROY:
    		PostQuitMessage( 0);
    		return 0;
    .....
    

    allerdings klappt das nicht so richtig, und ich werde das Gefühl nicht los, das ich noch einen Gedankenfehler in meinen Überlegungen habe.
    In wParam steht bei drücken von SPACE der wert 105572 !? das da nichts bei raus kommt wenn ich in tasten 32 stehen habe ist klar 😞
    Ich komme nur nicht dahinter wie der Wert 105572 in wParam zustande kommt 😕 und wie ich wParam & tasten[0] unter einen Hut bekomme

    vielleicht bin ich auch mit der 32 in der DAT datei auf dem Holzweg, allerdings wenn ich z.B. 0x20 oder VK_SPACE oder a in die DAT datei schreibe bricht das Programm beim auslesen dieser mit einem fehler ab 😞

    kann mir jemand einen Tip geben und mir mein Brett vorm Kopf entfernen 🤡



  • Es gibt einen Unterschied zwischen VK_SPACE und dem zugehörigen Accelerator. Es gäbe da übrigens auch noch den Ansatz, die Accelerator Table zu ändern, dann könntest du den switch so behalten, wie er ist.

    Bye, TGGC



  • Ja Ja
    genau danach suche ich, nach einer Möglichkeit die Tabelle während des Betriebs im Spiel zu ändern.
    @TGGC
    kannst du mir einen Tip geben unter welchen Suchbegriff ich in der MSDN Library Informationen dazu finde???

    wastman



  • Accelerator



  • @TGGC
    Danke hatte es eben auch gerade gefunden hatte mich vorher nur verschreiben 😡 🤡 😡
    ( ⚠ Notiz an mich selbst vor dumme Frage posten eigene Rechtsschreibung überprüfen 💡 👍 )
    So werde jetzt mal sehen was ich damit so alles anstellen kann 😃

    Trotzdem schon mal danke



  • Hi ich bin es mal wieder.
    Ich muß leider zugeben, dass ich es alleine nicht hinbekomme die
    Accelerator Tabelle (mit 2*c *g*) während das Programm läuft zu verändern. oder besser überhaupt aus dem Programm heraus zu verändern.

    In der Hoffnung das irgendjemand einen kleinen bis mittelgroßen Moment Zeit hat mir zu helfen habe ich
    mein Programm so weit es ging zusammengeschnitten, so das nur noch das nötigste + mein Problem über blieb. Werde ich gleich im Anschluß Posten.

    hmm ich muß gerade feststellen das ich in diesem forum keine Bilder posten kann
    macht nix poste ich halt die links 😉

    als erstes mein erstellte config.dat datei (recht unspektakulär)
    http://wastman.mannshausen.com/code/config.jpg
    nur ein paar ascii Werte

    als nächstes die Accelerator Tabelle
    http://wastman.mannshausen.com/code/Accelerator.jpg
    erstellt mit dem Microsoft Visual Studio 6.0 (StudentenVersion)

    dann noch der Tastatur änder dialog
    http://wastman.mannshausen.com/code/Tastewaehlen.jpg
    bisher wird noch der ascii wert für die tasten eingegeben das änder ich irgend wann anders dann mal 🤡 in diesem fall 32 == SPACE

    und noch ein Blick auf das leere Fenster beim starten des Programms
    http://wastman.mannshausen.com/code/Ultris.jpg
    alles recht unspektakulär

    so hier noch der C++ code von dem ganzen

    # include <stdio.h>
    # include <windows.h>
    # include <ddraw.h>
    # include <dsound.h>
    # include "ddutil.h"
    # include "dsutil.h"
    # include "resource.h"
    
    const int ultris_nettobreite = 360	;  // Breite des Inneren des Haupfensters
    const int ultris_nettohoehe  = 520;  // Hoehe des Inneren des Hauptfensters
    int ultris_bruttobreite;             // Breite des gesamten Haupfensters (incl. Rahmen)
    int ultris_bruttohoehe;              // Hoehe des gesamten Haupfensters (incl. Rahmen)
    
    HINSTANCE ultris_instance;           // Instanz der Ultris Applikation
    HWND ultris_window;                  // Das Hauptfenster von Ultris
    HMENU ultris_menu;                   // Das Menu von Ultris
    
    //  eigene Tastenbelegung ermöglichen ==========================================================================
    
    class tastatur
    	{
    	private:
    		int tasten[5];    // Array zum aufnehmen von 5 Ascii werten aus config.dat
    	public:
    		tastatur();		// Konstruktor (einlesen der daten aus der config.dat)
    		~tastatur();	// Dekonstruktor (zurückschreiben der tastaturbelegung in die config.dat)
    		int get_tasten(int i){ return tasten[i];} // lesender zugriff auf die tasten
    		void newtasten(int taste);				  // zurückschreiben der gewählten taste 
    	};									 
    
    tastatur::tastatur()		// Konstruktor
    	{	
    	FILE *pf;				
    	int i;
    
    	for(i=0; i<5; i++)		// Tasten vorinitialiesieren
    		tasten[i]=0;
    
    	pf = fopen( "config.dat", "r");  // config.dat nur lesend öffnen
    	if( !pf)						// wenn Fehler abbruch
    		return;
    
    	for( i = 0; i < 5; i++)			// einlesen der ascii werte aus config.dat
    		{
    		fscanf( pf, "%d,", &tasten[i]);
    		} 
    	fclose( pf);				// config.dat schließen
    	}
    
    tastatur::~tastatur()		// Dekonstruktor
    	{
    	int i;
    	FILE *pf;
    
    	pf = fopen( "config.dat", "w");			// config.dat schreibend öffnen
    	for( i = 0; i < 5; i++)
    		fprintf( pf, "%d,\n", tasten[i]);	// alle ascii werte aus tasten[] in config.dat schreiben
    	fclose( pf);							// config .dat schließen
    	}
    
    void tastatur::newtasten(int taste)
    	{
    	tasten[0] = taste;	  // 0 == erste ascii wert == endetaste
    	}
    
    tastatur ultris_tastatur;	
    
    // Tastenfestlegen handler
    BOOL CALLBACK tastendialog( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    	{
    	int parameter;
    
        switch (uMsg)
    		{
    		case WM_INITDIALOG:
    			SetDlgItemInt( hwndDlg, IDC_ENDTASTE, ultris_tastatur.get_tasten(0), FALSE); // die aktuell gewählte taste anzeigen
    			return TRUE;																 // erstmal nur den ascii wert
    		case WM_COMMAND:
    			if(wParam == IDOK)
    				{
    				parameter = GetDlgItemInt(hwndDlg,IDC_ENDTASTE , NULL, FALSE);  // bei OK wert speichern
    				ultris_tastatur	.newtasten( parameter);							// Wert aus Eingabefeld an newtasten senden
    				EndDialog(hwndDlg, wParam);
    				}				
    			if(wParam == IDCANCEL)
    				EndDialog(hwndDlg, wParam);
    			break;
    		}
    	return FALSE;
    	}										 
    // ========================================================================================00
    
    // ultris_windowhandler
    
    LRESULT CALLBACK ultris_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    	{
    	switch(msg)
    		{
    	case WM_COMMAND:
    		switch( LOWORD( wParam))
    			{
    		case IDM_EXIT:							// <<<<<< Programm Beenden <<<<
                PostMessage( hWnd, WM_CLOSE, 0, 0);
    			return 0;
    		case IDM_TASTENLEGEN:
    			DialogBox(ultris_instance, MAKEINTRESOURCE(IDD_TASTEN), ultris_window, tastendialog);
    			ultris_tastatur.~tastatur();	// zurückschreiben der gewählten ascii werte, ist eigendlich hier nicht nötig da autom wenn Programm endet
    			return 0;
    			}
    		break;
    	case WM_GETMINMAXINFO:
    		((MINMAXINFO *)lParam)->ptMinTrackSize.x = ((MINMAXINFO *)lParam)->ptMaxTrackSize.x = ultris_bruttobreite;
    		((MINMAXINFO *)lParam)->ptMinTrackSize.y = ((MINMAXINFO *)lParam)->ptMaxTrackSize.y = ultris_bruttohoehe;
    		return 0;
    	case WM_DESTROY:
    		PostQuitMessage( 0);
    		return 0;
    		}
    	return DefWindowProc(hWnd, msg, wParam, lParam);
    	}
    
    // WinMain erzeugen eines leeren Fensters mit dem Menuepunkt Ende & Tastatur
    
    int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
    	{
        MSG msg;
        HACCEL acc;			// <<<< Handle für die Accelerator Tabelle <<<<  
        WNDCLASSEX wcx;
    
    	ultris_instance = hInst;
    
        wcx.cbSize        = sizeof( wcx);
        wcx.lpszClassName = TEXT( "Ultris");
        wcx.lpfnWndProc   = ultris_windowhandler;
        wcx.style         = CS_VREDRAW | CS_HREDRAW;
        wcx.hInstance     = hInst;
        wcx.hIcon         = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN));
        wcx.hIconSm       = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN));
        wcx.hCursor       = LoadCursor( NULL, IDC_ARROW);
        wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wcx.lpszMenuName  = MAKEINTRESOURCE( IDR_MENU);
        wcx.cbClsExtra    = 0;
        wcx.cbWndExtra    = 0;
    
        if( !RegisterClassEx( &wcx))
            return 0;
    
        acc = LoadAccelerators( hInst, MAKEINTRESOURCE(IDR_ACCEL));   // <<<<< Laden der Accelerator Tabelle <<<<
    
    	ultris_bruttohoehe = ultris_nettohoehe + 2*GetSystemMetrics( SM_CYSIZEFRAME) 
    		                                   + GetSystemMetrics( SM_CYMENU)
    							               + GetSystemMetrics( SM_CYCAPTION);
    	ultris_bruttobreite = ultris_nettobreite + 2*GetSystemMetrics( SM_CXSIZEFRAME);
    
        ultris_window = CreateWindowEx( 0, TEXT( "Ultris"), TEXT( "Ultris"), WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, 
    		                                           CW_USEDEFAULT, CW_USEDEFAULT,
      	                                               ultris_bruttobreite, ultris_bruttohoehe, NULL, NULL, hInst, NULL);
        if( !ultris_window)
        	return 0;
    
    	ultris_menu = GetMenu( ultris_window);
    
    	MoveWindow( ultris_window, (GetSystemMetrics(SM_CXSCREEN)-ultris_bruttobreite)/2,
    		                       (GetSystemMetrics(SM_CYSCREEN)-ultris_bruttohoehe)/2, 
    							                                        ultris_bruttobreite, ultris_bruttohoehe, TRUE);
    
        ShowWindow( ultris_window, nCmdShow); // das Fenster zeigen
    
        while( TRUE)							// Endlosschleife solang das Programm läuft
    		{
            if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE))    // liegt eine Botschaft vor?
    			{												// es liegt eine vor,
                if( GetMessage( &msg, NULL, 0, 0 ) == 0)		// wenn diese == 0 applikation beenden
                    return 0; // Message ist WM_QUIT
    
                 if( TranslateAccelerator( ultris_window, acc, &msg) == 0) // <<<< bei betätigung eines 
    				{														//     accelerators diesen ausführen <<<<<
                    TranslateMessage( &msg);						// wenn es keiner ist, dafür sorgen, das die Meldung 
                    DispatchMessage( &msg);							// zum richtigen Empfänger(Handler) weiter geleitet wird
    				}
    			}
    		else
    			{
    			// Spiel relevanter code			
    			}
    		}
    	}
    

    Puhh hat alles reingepasst 😉
    das fuktioniert auch alles ganz toll 👍

    ⚠ Nun kommt mein Problem:
    Ich bekomme es nicht hin den obigen code so zu verändern, dass er die acceleartor tabelle ändert und anschließend neu lädt. 😡

    Mein Problem fängt schon damit an , das ich gar nicht weiß wie ich Zugriff auf den ersten Eintrag(im Moment den einzigen[IDM_EXIT] ) in der Tabelle bekomme um dort den Ascii wert von ESC nach z.B. SPACE zu ändern 😕
    und auch aus der MSDN Dokumentation werde ich nicht schlau

    als nächstes müßte die editierte Tabelle geladen werden irgendwo bei void tastatur::newtasten(int taste) mit LoadAccelerator(...); aber noch nicht mal ein erneutes laden der alten bekomme ich hin *grummel*

    Viel mehr müßte eigendlich nicht mehr gemacht werden wenn ich mich nicht irre
    ( 🙄 was aber gut möglich sein kann 🙄 )

    Sag schon mal ganz brav Danke zu allen die sich das bis hier her überhaupt durchgelesen haben und hoffe ihr könnt mir helfen

    P.S. ignoriert bitte Rechtsschreibfehler Deutsch ist nicht unbedingt mein Lieblingsfach 😡

    MFG. wastman





  • @TGGC
    Die DOKU im Netz ist echt nicht schlecht kannte ich vorher noch nicht 🤡
    werde ich jetzt wohl häufiger drauf zurückgreifen :p

    Erstmal danke für deine kleinen Newbie Tips, die mich doch immer wieder angespornt haben 😃
    Denke mal das ich es jetzt hinbekommen habe.
    Auch wenn noch einiges für einen geübten Programmierer sehr improviesiert aussehen mag 😉 Aber kommt Zeit kommt Rat 😃

    ich poste jetzt noch meine Lösung.
    Wenn dir beim Überfliegen irgend ein schwerwiegender Fehler auffallen sollte
    wäre ich für eine kurze Rückinfo dankbar 👍
    wenn nicht um so besser 😃

    # include <stdio.h>
    # include <windows.h>
    # include <ddraw.h>
    # include <dsound.h>
    # include "ddutil.h"
    # include "dsutil.h"
    # include "resource.h"
    
    const int ultris_nettobreite = 360	;  // Breite des Inneren des Haupfensters
    const int ultris_nettohoehe  = 520;  // Hoehe des Inneren des Hauptfensters
    int ultris_bruttobreite;             // Breite des gesamten Haupfensters (incl. Rahmen)
    int ultris_bruttohoehe;              // Hoehe des gesamten Haupfensters (incl. Rahmen)
    
    HINSTANCE ultris_instance;           // Instanz der Ultris Applikation
    HWND ultris_window;                  // Das Hauptfenster von Ultris
    HMENU ultris_menu;                   // Das Menu von Ultris
    HACCEL acc;			// <<<< Handle für die Accelerator Tabelle <<<<  
    
    //  eigene Tastenbelegung ermöglichen ==========================================================================
    
    class tastatur
    	{
    	private:
    		int tasten[5];    // Array zum aufnehmen von 5 Ascii werten aus config.dat	
    	public:
    		tastatur();		// Konstruktor (einlesen der daten aus der config.dat)
    		~tastatur();	// Dekonstruktor (zurückschreiben der tastaturbelegung in die config.dat)
    		int get_tasten(int i) {return tasten[i];} // lesender zugriff auf die tasten
    		void newtasten(int taste, int i);			// zurückschreiben der gewählten taste 		
    	};									 
    
    tastatur::tastatur()		// Konstruktor
    	{	
    	FILE *pf;				
    	int i;
    
    	for(i=0; i<5; i++)		// Tasten vorinitialiesieren
    		tasten[i]=0;
    
    	pf = fopen( "config.dat", "r");  // config.dat nur lesend öffnen
    	if( !pf)						// wenn Fehler abbruch
    		return;
    
    	for( i = 0; i < 5; i++)			// einlesen der ascii werte aus config.dat
    		{
    		fscanf( pf, "%d,", &tasten[i]);
    		} 
    	fclose( pf);				// config.dat schließen
    	}
    
    tastatur::~tastatur()		// Dekonstruktor
    	{
    	int i;
    	FILE *pf;
    
    	pf = fopen( "config.dat", "w");			// config.dat schreibend öffnen
    	for( i = 0; i < 5; i++)
    		fprintf( pf, "%d,\n", tasten[i]);	// alle ascii werte aus tasten[] in config.dat schreiben
    	fclose( pf);							// config .dat schließen
    	}
    
    void tastatur::newtasten(int taste, int i)
    	{
    	tasten[i] = taste;	  
    	}
    
    tastatur ultris_tastatur;	
    
    // Tastenfestlegen handler
    BOOL CALLBACK tastendialog( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
    	{
        LPACCEL lpaccelNew;     // pointer zu der neuen accelerator tabelle 
        HACCEL haccelOld;       // handle to old accelerator table 
        int cAccelerators;      // Anzahl der acceleatoren in der tabelle 
    	int i;
    	char paramtext[4];
    
    	for(i=0; i<4; i++) 
    		paramtext[i]= 0;
    
        switch (uMsg)
    		{
    		case WM_INITDIALOG:		
    			paramtext[0] = ultris_tastatur.get_tasten(0); 		// Den ascii wert der taste holen
    			if (paramtext[0] == 32)
    				{ 
    				paramtext[0] = 'S';	paramtext[1] = 'P';
    				}
    			if (paramtext[0] == 13)
    				{ 
    				paramtext[0] = 'E';	paramtext[1] = 'N'; paramtext[2] = 'T';
    				} 
    
    			SetDlgItemText( hwndDlg, IDC_ENDTASTE, paramtext);  // die aktuell gewählte taste anzeigen
    					for(i=0; i<4; i++)
    						paramtext[i]= 0;
    			paramtext[0] = ultris_tastatur.get_tasten(1); 		// Den ascii wert der taste holen	
    			if (paramtext[0] == 32)
    				{ 
    				paramtext[0] = 'S';	paramtext[1] = 'P';
    				}
    			if (paramtext[0] == 13)
    				{ 
    				paramtext[0] = 'E';	paramtext[1] = 'N'; paramtext[2] = 'T';
    				}
    			SetDlgItemText( hwndDlg, IDC_KONFTASTE, paramtext); // die aktuell gewählte taste anzeigen
    			for(i=0; i<4; i++)
    				paramtext[i]= 0;
    			return TRUE;				
    
    		case WM_COMMAND:
    			if(wParam == IDOK)
    				{
    				GetDlgItemText( hwndDlg, IDC_ENDTASTE, paramtext, 4);	// Eingabefeld auslesen
    				if(paramtext[0] == 'S' && paramtext[1] == 'P')
    					ultris_tastatur.newtasten( 32 ,0);	
    				else if(paramtext[0] == 'E' && paramtext[1] == 'N' && paramtext[2] == 'T')
    					ultris_tastatur.newtasten( 13 ,0);	
    				else
    					ultris_tastatur.newtasten( paramtext[0],0);				// den ascii wert der gewählten Taste speichern				
    
    				GetDlgItemText( hwndDlg, IDC_KONFTASTE, paramtext, 4);  // Eingabefeld auslesen
    				if(paramtext[0] == 'S' && paramtext[1] == 'P')
    					ultris_tastatur.newtasten( 32 ,1);				// den ascii wert der gewählten Taste speichern						
    				else if(paramtext[0] == 'E' && paramtext[1] == 'N' && paramtext[2] == 'T')
    					ultris_tastatur.newtasten( 13 ,1);		
    				else				
    					ultris_tastatur.newtasten( paramtext[0],1);				// den ascii wert der gewählten Taste speichern					
    
    				haccelOld = acc;							// die aktuelle Acceleatortabelle speichern
    
    				// zählen aller Einträge in der aktuellen Acceleator tabelle 
    				// buffer für die tabelle reservieren anschließend die tabelle in den Speicher kopieren
    				cAccelerators = CopyAcceleratorTable(haccelOld, NULL, 0);  // zählen
                    lpaccelNew = (LPACCEL) LocalAlloc(LPTR,cAccelerators * sizeof(ACCEL)); // Speicher reservieren 				
    
    				if (lpaccelNew != NULL) // wenn kein Fehler vorliegt
    					{
                            CopyAcceleratorTable(acc, lpaccelNew, cAccelerators); // Tabelle kopieren
    					}
    
    				for(i=0; i<cAccelerators; i++)
    					lpaccelNew[i].key = ultris_tastatur.get_tasten(i); 
    
    				// Erstellen der neuen accelerator table, und
                    // zerstören der alten
    
                    DestroyAcceleratorTable(haccelOld); 
                    acc = CreateAcceleratorTable(lpaccelNew, cAccelerators); 
    
    				EndDialog(hwndDlg, wParam);
    				return 0;
    				}				
    			if(wParam == IDCANCEL)
    				EndDialog(hwndDlg, wParam);
    				return 0;
    			break;
    		}
    	return FALSE;
    	}										 
    // ========================================================================================00
    
    // ultris_windowhandler
    
    LRESULT CALLBACK ultris_windowhandler( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    	{
    	switch(msg)
    		{
    	case WM_COMMAND:
    		switch( LOWORD( wParam))
    			{
    		case IDM_EXIT:							// <<<<<< Programm Beenden <<<<
                PostMessage( hWnd, WM_CLOSE, 0, 0);
    			return 0;
    		case IDM_TASTENLEGEN:
    			DialogBox(ultris_instance, MAKEINTRESOURCE(IDD_TASTEN), ultris_window, tastendialog);
    			ultris_tastatur.~tastatur();	// zurückschreiben der gewählten ascii werte, ist eigendlich hier nicht nötig da autom wenn Programm endet
    			return 0;
    			}
    		break;
    	case WM_GETMINMAXINFO:
    		((MINMAXINFO *)lParam)->ptMinTrackSize.x = ((MINMAXINFO *)lParam)->ptMaxTrackSize.x = ultris_bruttobreite;
    		((MINMAXINFO *)lParam)->ptMinTrackSize.y = ((MINMAXINFO *)lParam)->ptMaxTrackSize.y = ultris_bruttohoehe;
    		return 0;
    	case WM_DESTROY:
    		PostQuitMessage( 0);
    		return 0;
    		}
    	return DefWindowProc(hWnd, msg, wParam, lParam);
    	}
    
    // WinMain erzeugen eines leeren Fensters mit dem Menuepunkt Ende & Tastatur
    
    int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
    	{
        MSG msg;
    	HACCEL accfest;	
    
        WNDCLASSEX wcx;
    
    	ultris_instance = hInst;
    
    	//Variabeln für benutzerdefienirte Tasten
    	LPACCEL lpaccelNew;     // pointer zu der neuen accelerator tabelle 
        HACCEL haccelOld;       // handle to old accelerator table 
        int cAccelerators;      // Anzahl der acceleatoren in der tabelle 
    	int i;
    
        wcx.cbSize        = sizeof( wcx);
        wcx.lpszClassName = TEXT( "Ultris");
        wcx.lpfnWndProc   = ultris_windowhandler;
        wcx.style         = CS_VREDRAW | CS_HREDRAW;
        wcx.hInstance     = hInst;
        wcx.hIcon         = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN));
        wcx.hIconSm       = LoadIcon( hInst, MAKEINTRESOURCE( IDI_MAIN));
        wcx.hCursor       = LoadCursor( NULL, IDC_ARROW);
        wcx.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wcx.lpszMenuName  = MAKEINTRESOURCE( IDR_MENU);
        wcx.cbClsExtra    = 0;
        wcx.cbWndExtra    = 0;
    
        if( !RegisterClassEx( &wcx))
            return 0;
    
    	acc = LoadAccelerators( hInst, MAKEINTRESOURCE(IDR_ACCEL));   // <<<<< Laden der benutzerAccelerator Tabelle <<<<
    	accfest = LoadAccelerators( hInst, MAKEINTRESOURCE(IDR_ACCELFEST));   // <<<<< Laden der festenAccelerator Tabelle <<<<
    
    	// benutzer defienierte Tasten laden ==================================
    	haccelOld = acc;			// die aktuelle Acceleatortabelle speichern
    
    	// zählen aller Einträge in der aktuellen Acceleator tabelle 
    	// buffer für die tabelle reservieren anschließend die tabelle in den Speicher kopieren
    	cAccelerators = CopyAcceleratorTable(haccelOld, NULL, 0);  // zählen
        lpaccelNew = (LPACCEL) LocalAlloc(LPTR,cAccelerators * sizeof(ACCEL)); // Speicher reservieren 				
    
    	if (lpaccelNew != NULL) // wenn kein Fehler vorliegt
    		{
            CopyAcceleratorTable(acc, lpaccelNew, cAccelerators); // Tabelle kopieren
    		}
    
    	for(i=0; i<cAccelerators; i++)
    		lpaccelNew[i].key = ultris_tastatur.get_tasten(i); 
    
    	// Erstellen der neuen accelerator table, und
        // zerstören der alten
    
        DestroyAcceleratorTable(haccelOld); 
        acc = CreateAcceleratorTable(lpaccelNew, cAccelerators); 
    	// ===========================================================
    
    	ultris_bruttohoehe = ultris_nettohoehe + 2*GetSystemMetrics( SM_CYSIZEFRAME) 
    		                                   + GetSystemMetrics( SM_CYMENU)
    							               + GetSystemMetrics( SM_CYCAPTION);
    	ultris_bruttobreite = ultris_nettobreite + 2*GetSystemMetrics( SM_CXSIZEFRAME);
    
        ultris_window = CreateWindowEx( 0, TEXT( "Ultris"), TEXT( "Ultris"), WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, 
    		                                           CW_USEDEFAULT, CW_USEDEFAULT,
      	                                               ultris_bruttobreite, ultris_bruttohoehe, NULL, NULL, hInst, NULL);
        if( !ultris_window)
        	return 0;
    
    	ultris_menu = GetMenu( ultris_window);
    
    	MoveWindow( ultris_window, (GetSystemMetrics(SM_CXSCREEN)-ultris_bruttobreite)/2,
    		                       (GetSystemMetrics(SM_CYSCREEN)-ultris_bruttohoehe)/2, 
    							                                        ultris_bruttobreite, ultris_bruttohoehe, TRUE);
    
        ShowWindow( ultris_window, nCmdShow); // das Fenster zeigen
    
        while( TRUE)							// Endlosschleife solang das Programm läuft
    		{
            if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE))    // liegt eine Botschaft vor?
    			{												// es liegt eine vor,
                if( GetMessage( &msg, NULL, 0, 0 ) == 0)		// wenn diese == 0 applikation beenden
                    return 0; // Message ist WM_QUIT
    
                 if( TranslateAccelerator( ultris_window, acc, &msg) == 0 && TranslateAccelerator( ultris_window, accfest, &msg) == 0 ) 
    				{												// <<<< bei betätigung eines accelerators diesen ausführen <<<<<
                    TranslateMessage( &msg);						// wenn es keiner ist, dafür sorgen, das die Meldung 
                    DispatchMessage( &msg);							// zum richtigen Empfänger(Handler) weiter geleitet wird
    				}			 
    		} 
    		else
    			{
    			// Spiel relevanter code			
    			}
    		}
    	}
    

    so also noch mal danke

    MFG wastman

    http://wastman.mannshausen.com/ultris.zip



  • Sorry, aber das ist mir zu lang zum Lesen.

    Bye, TGGC


Anmelden zum Antworten