|
JLI Spieleprogrammierung
|
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
|
Verfasst am: 29.06.2008, 13:56 Titel: VK_F5 Code vs. t |
|
|
Huhu ihr allmächtigen Programmierer
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.
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
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
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 |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 30.06.2008, 11:07 Titel: |
|
|
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 |
|
|
Asto JLI'ler
Alter: 37 Anmeldedatum: 30.05.2007 Beiträge: 114 Wohnort: Dortmund Medaillen: Keine
|
Verfasst am: 01.07.2008, 12:06 Titel: |
|
|
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 |
|
|
|
|
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
|