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 konnenvielleicht 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 MSDNVK_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[] geschriebenspieltasten::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 kommtund 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 kannTrotzdem 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 linksals erstes mein erstellte config.dat datei (recht unspektakulär)
http://wastman.mannshausen.com/code/config.jpg
nur ein paar ascii Werteals 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 malin 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ärso 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 tollNun 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 schlauals 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 :pErstmal 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 magAber 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
-
Sorry, aber das ist mir zu lang zum Lesen.
Bye, TGGC