JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=c2cd74fb8f91788892733c5c1ee745fcMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

VK_F5 Code vs. t

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Asto
JLI'ler


Alter: 37
Anmeldedatum: 30.05.2007
Beiträge: 114
Wohnort: Dortmund
Medaillen: Keine

BeitragVerfasst am: 29.06.2008, 13:56    Titel: VK_F5 Code vs. t Antworten mit Zitat

Huhu ihr allmächtigen Programmierer Wink
Ich kann mich momentan leider aus Zeitgründen nicht richtig der Spieleprogrammierung widmen und bin auch erst wieder vor einiger Zeit angefangen mich der Programmierung mit C / Cpp zu widmen.

Diese Frage hat auch eher nichts mit einem Spiel zu tun, aber ich nutze die WinApi und hoffe die Frage wird hier dennoch gedulded. Smile

Und zwar suchte ein bekannter ein kleines Programm, in dem er ein paar Dinge wie das Datum, Betreff, Titel und den Text eingibt und das dann als Datei speichert. Das ganze sollte etwas auf Geschwindigkeit optimiert sein, so das er alles eingibt, ne Taste drückt und er kann nochmal von vorne Beginnen, so das er in kürzester Zeit viele Texte auf die Platte bekommt Wink

Soweit so gut, da habe ich mir gedacht ich wollte mich doch schon länger wieder mit C und Co beschäftigen, da erstelle ich ihm es doch einfach ^^

Jut, endlich zum Problem:

Ich frage den wParam der Message ab, die meine Message-Schleife erhält. ist msg.wParam == VK_F5, somit wird F5 gedrückt, soll er speichern.
Tuts auch prima. Nur habe ich das Problem, das VK_F5 den Wert 0x74 hat, sprich 116. Das Zeichen t hat aber auch den Wert 116, somit löse ich beim drücken von t und F5 jeweils den Speichervorgang aus. Ist natürlich absolut unerwünscht ^^ Mein Workarund ist nun, das ich anstatt F5 Shift+F5 drücken lasse zum speichern. Aber das is immer ne Verrenkung ^^

Wie kann ich zwischen F5 und dem t unterscheiden?

Anbei der Code (momentan mit dem Workaround):
Code:
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <fstream>
#include <sstream>

using namespace std;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

static HWND hEditDatum, hEditBereich, hEditTitel, hEditText;   
   
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {

    HWND     hWnd;
    MSG      msg;
    WNDCLASS wc;

    const char szAppName[] = "Textmaker V0.4";

    wc.style          = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc    = WndProc;
    wc.cbClsExtra     = 0;
    wc.cbWndExtra     = 0;
    wc.hInstance      = hInstance;
    wc.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.lpszMenuName   = NULL;
    wc.lpszClassName  = szAppName;

    RegisterClass(&wc);

    hWnd = CreateWindow( szAppName,
                         szAppName,
                         WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT,
                         CW_USEDEFAULT,
                         640,
                         480,
                         NULL,
                         NULL,
                         hInstance,
                         NULL );

    ShowWindow(hWnd, iCmdShow);
    UpdateWindow(hWnd);


Hier ist die angesprochene Msg-Queue mit dem Problem:
Code:
    while(GetMessage(&msg, NULL, 0, 0)) {
   
      if(msg.wParam == VK_F5 && GetKeyState(VK_SHIFT) < 0)    // WORKAROUND!
        {
         char Datum[Edit_GetTextLength(hEditDatum) + 1];
         char Bereich[Edit_GetTextLength(hEditBereich) + 1];
         char Titel[Edit_GetTextLength(hEditTitel) + 1];
         char Text[Edit_GetTextLength(hEditText) + 1];

         Edit_GetText(hEditDatum, Datum, Edit_GetTextLength(hEditDatum) + 1);
         Edit_GetText(hEditBereich, Bereich, Edit_GetTextLength(hEditBereich) + 1);
         Edit_GetText(hEditTitel, Titel, Edit_GetTextLength(hEditTitel) + 1);
         Edit_GetText(hEditText, Text, Edit_GetTextLength(hEditText) + 1);

         string real_filename = "";
         real_filename += Datum;
         real_filename += "_";
         real_filename += Titel;
         string filetype = ".txt";
         string filename = real_filename;

         if(real_filename == "_")         
            continue;
         
         fstream tmp_outfile((filename + filetype).c_str(), ios::in);
         fstream outfile;
         
         int i = 2;
         string index;
         while(tmp_outfile) {
            tmp_outfile.close();
            filename = real_filename;
            filename += char('_');
            stringstream sstr;
            sstr << i;
            sstr >> index;
            filename += index;
            
            tmp_outfile.open((filename + filetype).c_str(), ios::in);
            i++;
         }
         
         tmp_outfile.close();
            
         outfile.open((filename + filetype).c_str(), ios::out);
         outfile << "Datum:\t\t" << Datum << "\n" << "Bereich:\t" << Bereich << "\n" << "Titel:\t\t" << Titel << "\n\n" << Text << endl;
         
         outfile.close();
         
         free(Datum);
         free(Bereich);
         free(Titel);
         free(Text);
 
         Edit_SetText(hEditDatum, "");
         Edit_SetText(hEditBereich, "");
         Edit_SetText(hEditTitel, "");
         Edit_SetText(hEditText, "");
         
         /*stringstream moo;
         moo << msg.wParam;
         string qoo;
         moo >> qoo;
         
         Edit_SetText(hEditText, qoo.c_str());*/
         
         SetFocus(hEditDatum);

      }
      else if(!IsDialogMessage(hWnd, &msg)) {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
      }
      
    }


Code:


    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
   static RECT rect;
   
    switch(message) {
      case WM_SIZE: {
         rect.left    = 0;
         rect.top     = 0;
         rect.right   = LOWORD(lParam);
         rect.bottom  = HIWORD(lParam);
         
         return 0;
      }
      
      case WM_PAINT: {
         PAINTSTRUCT ps;
         HDC         hDC;
      
         const char Copy[] = "© Florian Brinker 2008";
         const char Datum[] = "Datum:";
         const char Bereich[] = "Bereich:";
         const char Titel[] = "Titel:";
      
         const char Info[] = "Speichern und Felder leeren mit Shift + F5";    // WORKAROUND!   
         //const char Info[] = "Speichern und Felder leeren mit F5";
      
         hDC = BeginPaint(hWnd, &ps);
         
         TextOut(hDC, 10, 15, Datum, sizeof(Datum) - 1);
         TextOut(hDC, 10, 45, Bereich, sizeof(Bereich) - 1);
         TextOut(hDC, 10, 75, Titel, sizeof(Titel) - 1);
         
         TextOut(hDC, 10, rect.bottom - 20, Info, sizeof(Info) - 1);
         
         TextOut(hDC, rect.right - 150, rect.bottom - 20, Copy, sizeof(Copy) - 1);
         
      
         EndPaint(hWnd, &ps);      
         return 0;
      }
   
      case WM_CREATE: {
         hEditDatum = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_TABSTOP | WS_CHILD | WS_VISIBLE, 100, 10, 520, 25, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL);
         hEditBereich = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_TABSTOP | WS_CHILD | WS_VISIBLE, 100, 40, 520, 25, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL);
         hEditTitel = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_TABSTOP | WS_CHILD | WS_VISIBLE, 100, 70, 520, 25, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL);

            hEditText = CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "", WS_TABSTOP | WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN, 10, 105, 610, 320, hWnd, NULL, ((LPCREATESTRUCT) lParam) -> hInstance, NULL);
   
         SetFocus(hEditDatum);   
            return 0;
        }
      
      case WM_CLOSE: {
            DestroyWindow(hWnd);
            return 0;
        }
      
      case WM_DESTROY: {
            PostQuitMessage(0);         
            return 0;
        }
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}


Ich finde das komisch, das man dem F5 und dem t den gleichen Wert gibt von seiten Microsoft... hmm hmm oder ich bin zu doof es richtig zu implementieren Wink

lg Asto alias Flo
_________________
"A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 30.06.2008, 11:07    Titel: Antworten mit Zitat

Leider kenn ich dagegen auch kein Allheilmittel, aber wenn es dir auch reicht, erst beim Loslassen der F5-Taste den Speichervorgang zu aktivieren, dann kannst ja prüfen lassen ob vor dem Ereigniss WM_KEYUP + VK_F5 ein Ereignis namens WM_CHAR vorrausgegangen ist, Dann wars wahrscheinlich ein "t".
Ich bin damit nicht so ganz vertraut, doch haben die Funktonstasten nicht was mit SYSKEY zu tun ? Oder unterliegen noch einer zusätzlichen WM-Nachricht ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Asto
JLI'ler


Alter: 37
Anmeldedatum: 30.05.2007
Beiträge: 114
Wohnort: Dortmund
Medaillen: Keine

BeitragVerfasst am: 01.07.2008, 12:06    Titel: Antworten mit Zitat

Eine interessante Idee. Habe noch garnicht daran gedacht. Werde ich mal ausprobieren
_________________
"A programmer started to cuss, Because getting to sleep was a fuss, As he lay there in bed, Looping 'round in his head, was: while(!asleep()) sheep++;", Unbekannt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum