Zeicheneingaben ausgeben wm_char usw.
-
Das Zusammensetzen zum String ist so nicht ganz richtig! Am Leichtesten tust du dir wohl, wenn du einen C++-String nimmst.
Und bei den case-Marken das break; nicht vergessen - außerdem muss man, wenn man Messages abfängt (sofern in der MSDN-Library nicht anders angegeben) o zurückliefern (return 0;)
-
Okay also ich versuch das jetzt mal mit deinen Tipps irgendwie hinzukriegen.
Eine Frage hätte ich aber noch.
Muss ich um die Zeichen auszugeben denn auch WM_KEYDOWN auswerten, oder ist das nicht zwingend notwendig ?
-
Black-Panther schrieb:
Muss ich um die Zeichen auszugeben denn auch WM_KEYDOWN auswerten, oder ist das nicht zwingend notwendig ?
Nein, das bringt dir nichts - es sei denn, du willst z.B. auf Drücken von Backspace oder Del. reagieren
-
okay.
erst mal Danke für deine Hilfe. Hoffe ich komme damit weiter
-
Hallo.
Wollte nur mal eben berichten, dass ich mittlerweile wenigstens 1 Zeichen ausgeben kann. Das heisst natürlich alle Zeichen. Jedoch werden sie bei mir immer alle an der selben Position angezeigt, sprich das alte Zeichen einfach überschrieben.
Werd dann mal versuchen dass noch richtig hinzubekommen.
Danke nochmal für deine Hilfe flenders
-
Wie setzt du denn jetzt deinen String zusammen?
-
Hab da jetzt nochmal im code rumgepfuscht und mittlerweile wird das ganze array mit zeichen ausgegeben, allerdings immer das was ich aktuell gedrückt habe. Mein code ist auch mittlerweile echt wüst geworden, da ich die ganze Zeit irgendwas probiere.
Poste mal eben den code der bei wm_char steht:
// Globales TCHAR Buffer[100]; default: for (i=0; i<100; i++) { Buffer[i] = (TCHAR) wParam; hdc= GetDC (hwnd); SelectObject (hdc,CreateFont (0,0,0,0,0,0,0,0,dwCharSet,0,0, 0,FIXED_PITCH,NULL)); TextOut (hdc,i*cxChar,yCaret, &Buffer[i],1); DeleteObject (SelectObject (hdc, GetStockObject (SYSTEM_FONT))); ReleaseDC (hwnd,hdc); }Sieht jetzt chaotisch aus, ich weiss.
Gedacht hatte ich mir dass so, dass mit einer Schleife jedes Feld von Buffer durchlaufen wird und dann dort jeder Tastendruck gespeichert wird. Genau dieser sollte dann über TextOut ausgegeben wird, da dieses genau das aktuelle Feld ausgibt und zwar an der stelle in x i+ cxChar (also aktueller Buchstabe mal breite des Buchstabens) Aber das scheint wohl falsch zu sein, was ich mir da dachte. Denn wie gesagt wird immer das Ganze Array (in dem Fall 100 Zeichen) auf einmal angezeigt.
-
Du musst aus i eine static Variable machen. Darin speicherst du dann die aktuelle Zeichenposition. Anschließend erhöhst du i um 1. Die for Schleife macht hier aber überhaupt keinen Sinn.
In WM_PAINT gibst du einfach den gesamten String aus (immer an der selben Position)
Also in WM_CHAR nur den String zusammensetzen und InvalidateRect - das Zeichnen ausschließlich in WM_PAINT (es sei denn du verwendest DoubleBuffering
)
-
Ich kriegs einfach net auf die Reihe.
Kannst du mir vielleicht mal nen Beispielcode der wm_char und wm_paint posten.
Ich stehe echt absolut auf dem Schlauch, sorry
-
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static char text[255] = {0}; static char pos = 0; switch (message) { case WM_CHAR: { text[pos++] = wParam; InvalidateRect(hwnd,NULL,FALSE); return 0; } case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd,&ps); TextOut(hdc,10,10,text,lstrlen(text)); EndPaint(hwnd,&ps); return 0; } // [..] } return DefWindowProc (hwnd, message, wParam, lParam); }Der Code ist natürlich nicht vollständig! So musst du z.B. nach sicherstellen, das pos nicht zu groß wird und du damit versuchst in unbekannten Speicher zu schreiben. (Du kannst näturlich z.B. auch auf den C++-String als Daten-Typ zurückgreifen)
Un um die Behandlung von Sondertasten wie Backspace oder Return musst du dich ggf. auch noch kümmern - aber zumindest das Prinzip sollte dir hiermit klar sein.
-
achsoooo

Das meintest du mit gleicher Position..
Hätte nicht gedacht dass, das so richtig ausgegeben wird.Danke