PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WINAPI Edit Felder ?


Einfachkrank
2003-04-05, 13:25:04
Hi,

wie kann ich denn in einer Windows Anwendung ein Edit Feld erzeugen und es abfragen ? Geht das auch mit Hilfe von CreateWindow() oder CreateWindowEx() ?

MFG Einfachkrank

Demirug
2003-04-05, 13:39:13
Ja, bei lpClassName einfach "edit" angeben.

Abe Ghiran
2003-04-05, 14:43:53
Noch als Ergänzung: Beim "style" Parameter kann man dann noch einige spezielle Sachen für das Edit (für andere Controls gibts genauso typspezifische Einstellungen) übergeben, z.B. legt ES_MULTILINE ein edit mit mehreren Zeilen an, wie die TextArea bei java.
Events empfängst du über die window procedure deines Fensters, in der Regel als WM_COMMAND. Dabei enthält das untere word von wParam (also LOWORD(wParam), dafür gibt es die schicken makros ja) die id deines Controls, so daß du überprüfen kannst, von welchem Gui Element der event kommt. Id ist die, die du beim erzeugen des Controls bei hMenu (9. Parameter) übergeben hast.
Um z.B. den Text abzufragen, kann man dem Edit auch Nachrichten senden (z.b. halt WM_GETTEXT).

Grüße, Jan

Einfachkrank
2003-04-06, 16:08:23
Ah gut, das werd ich mal probieren. Und wie sieht´s mit Labels aus? Geht das auch so? - Das wäre noch die letzte Komponente, dann hätte ich die wichtigsten :)

MFG Einfachkrank

Demirug
2003-04-06, 16:18:22
Originally posted by Einfachkrank
Ah gut, das werd ich mal probieren. Und wie sieht´s mit Labels aus? Geht das auch so? - Das wäre noch die letzte Komponente, dann hätte ich die wichtigsten :)

MFG Einfachkrank

Ja, Der Fenstertyp dafür ist "STATIC".

Einfachkrank
2003-04-06, 18:52:36
Hi,

ich noch mal :) - also die Editfelder seh ich und auch deren Texte, aber wie kann ich deren Inhalt abfragen(z.B. nach einem Knopfdruck oder so) ?

MFG Einfachkrank

Demirug
2003-04-06, 19:01:22
GetWindowText

Einfachkrank
2003-04-06, 20:41:43
Originally posted by Demirug
GetWindowText Kannst du mir vielleicht mal ein kleines Codebeispiel posten, weil ich bekomms nicht auf die Reihe :)
Ich möchte aus einen Textfeld den Text lesen und anschließend eine Datei mit dem Namen öffnen...

Demirug
2003-04-06, 20:51:02
So in etwa



HWND hEdit = CreateWindow (...);

....

TCHAR Text[256];

GetWindowText (hEdit, Text, 256);

....


Da der CreateWindow und der GetWindowText normalerweise ja in unterschiedlichen Funktionen liegen muss man das Fensterhandle irgendwo zwischengespeichert werden.

Einfachkrank
2003-05-11, 13:51:21
*denaltenthreadrauskram* :)

Die Edit Felder die ich mit "EDIT" erzeugt habe, sind irgendwie begrenz auf eine Zeile Text... Ist das normal bei diesem Edit Feld und muss man das vorher umstellen oder sind für die mehrzeiligen Edit Felder eine andere Initialisierung vorgehesen?

TK
2003-05-11, 14:25:26
Originally posted by Einfachkrank
*denaltenthreadrauskram* :)

Die Edit Felder die ich mit "EDIT" erzeugt habe, sind irgendwie begrenz auf eine Zeile Text... Ist das normal bei diesem Edit Feld und muss man das vorher umstellen oder sind für die mehrzeiligen Edit Felder eine andere Initialisierung vorgehesen?

Bei CreateWindow ES_MULTILINE als Style mit angeben, ansonsten wird standardmäßig single line verwendet.

Einfachkrank
2003-05-13, 17:41:06
ES_MULTILINE hat bei mir nicht funktionert. Oder sagen wir es mal so, es hat sich nichts geändert... :(
Kann mir jemand dazu vielleicht etwas Code posten, wie er ein solches Edit Feld erstellt ? (wenn´s geht, vielleicht auch noch mit nem schönem Ramen drum, da das Edit Feld, dass ich bis jetzt kenne, einfach im Hintergrund nur weiß ist und sonst nichts) :)

MFG Einfachkrank

Abe Ghiran
2003-05-13, 23:21:42
Hi!
Also folgendes funktioniert bei mir wunderbar..
Aus meiner Log.h:

// identifiers for various gui elements
static const int ID_BUTTON_SCREENSHOT = 1;
static const int ID_TEXTAREA = 2;
etc....
....
// window handles for the various gui elements
HWND hwndWindow, hwndBClear, hwndBScreenshot, hwndBSave, hwndELog;

Und dann in der window procedure des Log Fensters:

/* handles the given windows message. */
LRESULT CALLBACK Log::handleWindowMessage(HWND hwnd, UINT msg, WPARAM wParam,
LPARAM lParam){
// handle the messages
switch(msg){
case WM_CREATE:{
HINSTANCE hinstance = ((LPCREATESTRUCT)lParam)->hInstance;

// button "take screenshot" anlegen
hwndBScreenshot = CreateWindow(TEXT("button"), "Screenshot",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED, 350, 10, 90, 30, hwnd,
(HMENU)ID_BUTTON_SCREENSHOT,
((LPCREATESTRUCT)lParam)->hInstance, NULL);

// liste anlegen
hwndELog = CreateWindow(TEXT("edit"), NULL, WS_CHILD | WS_VISIBLE |
WS_HSCROLL | WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE |
ES_AUTOHSCROLL | ES_AUTOVSCROLL, 0, 120, 300, 200, hwnd,
(HMENU)ID_TEXTAREA, ((LPCREATESTRUCT)lParam)->hInstance, NULL);

und später noch bei WM_SIZE alle komponenten im fenster passend resizen:

case WM_SIZE:{
int width = LOWORD(lParam);
int height = HIWORD(lParam);

MoveWindow(hwndELog, 0, 0, width, height-20, TRUE);
MoveWindow(hwndBClear, width-140, height-20, 60, 20, TRUE);
MoveWindow(hwndBScreenshot, width-80, height-20, 80, 20, TRUE);
MoveWindow(hwndBSave, width-200, height-20, 60, 20, TRUE);

return DefWindowProc(hwnd, msg, wParam, lParam);
}


Grüße, Jan

Einfachkrank
2003-05-15, 18:02:32
Ahh, jetzt funktionierts -> thx @ Abe Ghiran

Aber wenn wir gerade bei so was sind - Was mache ich denn mit einer Log File oder für was ist so was gut?

Abe Ghiran
2003-05-15, 19:22:43
N'abend...
Also ich benutze das für debug Meldungen bei meiner "Experimental OpenGL Game Engine :)".
Unter java (womit ich vorher immer programmiert habe) hat man ja immer noch ne konsole offen (es sei denn man benutzt javaw) und kann da bequem per System.out.println debug meldungen rausschreiben.
Als ich dann mit c / c++ angefangen habe, dachte ich mir es wäre mal ne gute Idee ein log Fenster zu haben, um eine ähnliche Möglichkeit zu haben debug meldungen auszugeben. Außerdem war das ein schöner kleiner Einstieg in windows Programmierung (ein Fenster, ein paar Buttons).

Grüße, Jan