c++ Editfelder

KAY

Mitglied
Hallo. Ich würde gern in einem Programm Editfelder verwenden (also die Eingabefelder). Dazu habe ich die untenstehende Funktion geschrieben, die leider nicht funktioniert :( der Debugger meint es liegt am letzten Parameter für die Funktion (NULL). aber was soll denn da hin?

Code:
int Eingabe()
{	
    char *buffer = NULL;
    hEdit = CreateWindowEx(WS_EX_CLIENTEDGE,"edit",buffer,
				   WS_CHILD | WS_VISIBLE | WS_VSCROLL | 
				   ES_MULTILINE | ES_AUTOVSCROLL,
				   0, 0, 0, 0,	
				   hWnd,NULL,
				   ((LPCREATESTRUCT) lParam) -> hInstance,
				   NULL);
	
    return 0;
}
 
woher hast du denn den code kopiert?
du hast als x,y ,w, h überall 0 gewählt.... bei x und y ist das nicht so schlimm, aber bei w und h, das ist die größe des fensters und das beträgt 0 pixel, also irgendwie nicht sichtbar....
und das mit dem "((LPCREATESTRUCT) lParam) -> hInstance" gefällt mir auch nicht so, mein programm stürtzt ab... ich würde die instenz von der WinMain funktion global speichern und dann hier verwenden..
 
ich hab das aus nem tutorial. da war das aber in der windowproc beim case WM_CREATE. ich bräuchte das aber als eine seperate funktion und deshalb hab ich das mal da extrahiert...

ich hab das "((LPCREATESTRUCT) lParam) -> hInstance" jetzt mit einer globalen HINSTANCE hInstance ersetzt und w und h mal auf 100 bzw 50 gesetzt.

leider geht es immer noch nicht, es gibt zwar keinen fehler mehr, aber es passiert nix mehr :(
 
es sollte bei case WM_INITDIALOG aufgerufen werden..
wozu brauchst du es denn als funktion? vieleicht kann ich dir da ja weiter helfen...

#edit:
als was ist bei dir das "hWnd" deklariert? einfach nur HWND hWnd;?
das wird nicht klappen, denn hwnd ist das handle des fensters wo das edit feld eingefügt werden soll...
 
Zuletzt bearbeitet:
ich brauche das als funktion weil das so gedacht ist: in einem rpg-editor kann man ein feld mit der funktion "Textausgabe" oder so belegen. dann kommt halt dieses editfenster und man gibt den text ein, der dann im spiel an genau dieser stelle ausgegeben werden soll.

wie meinst du das mit dem hwnd ? hab ich nich verstanden.
 
nunja, irgendwo(rauf) musst du ja dein fenster(oder editbox) auch einfügen...
du hattest gesagt du hast es aus der funktion windowsproc...
Code:
LRESULT CALLBACK MainProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

da siehst du doch hwnd, oder nicht?
wie ist nun deine deklaration? und wie verwendest du es?

Code:
bool CreateEditField(HWND hwnd, char *szDefaultValue, int x, int y, int w, int h)
{
	HWND hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", szDefaultValue,
				   WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE |
				   ES_AUTOVSCROLL, x, y, w, h, hwnd, NULL, NULL, NULL);

	if(hEdit != NULL)
		return true;

	return false;	
}

das wäre eine praktische funktion, wofür ich aber keine verwendung finden würde ;)
man kann diese funktion eigentlich überall aufrufen, nur musst du auf das HWND achten... kannst es ja mal so versuchen:

Code:
CreateEditField(FindWindow(NULL, "Dein FensterName"), "Das steht am anfang in dem Edit Feld drinne", 0, 0, 100, 100);
 
ich poste mal den ganzen code. ich habe deine version etwas verändert (weil die position etc sowieso immer gleich bleiben soll).

Die feld-erstellung wird aufgerufen aber dann wird das prog sofort beendet und man sieht nix. der debugger meint es is alles gut (...exe has exited with code 0 (0x0).) aber wieso seh ich das fenster nicht?


Code:
#include <windows.h>

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

/*** main + fenster erstellen ***/
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	HWND       hWnd;
	MSG        msg;
	WNDCLASS   wc;

	const char szAppName[] = "Editcontrol Tutorial";

	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(LTGRAY_BRUSH);
	wc.lpszMenuName		= NULL;
	wc.lpszClassName	= szAppName;

	RegisterClass(&wc);

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

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

	while(GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

/*** edit feld erstellen ***/
bool CreateEditField(HWND hwnd)
{	
   HWND hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "nix ;) ",
   WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE |
   ES_AUTOVSCROLL, 200,200,100,100, hwnd, NULL, NULL, NULL);
	
			if(hEdit != NULL)
			{
				return true;
			}

			else
			{
				return false;
			}
}



/*** callback ***/
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	

   	switch(message)
	{
	 case WM_KEYDOWN:
			switch(wParam)
			{
			case VK_F1:
				CreateEditField(FindWindow(NULL, "FensterName"));
			break;
			}

	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		}
	}


	return DefWindowProc(hWnd, message, wParam, lParam);
}
 
jep... du hast einmal break vergessen, egal was für eine F-taste du drückst, er wird das programm beenden weil er zu "PostQuitMessage" überspringt.... ich hab jez mal szAppName global deklariert, wegen "FindWindow", falls du nämlich deine EditBox auserhalb der WndProc funktion verwenden willst, rufst du die CreateEditField funktion so auf:
Code:
CreateEditField(FindWindow(NULL, szAppName));

hier nochmal den ganzen code, copy + paste ;)
Code:
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
const char szAppName[] = "Editcontrol Tutorial";

/*** main + fenster erstellen ***/
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
	HWND       hWnd;
	MSG        msg;
	WNDCLASS   wc;

	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(LTGRAY_BRUSH);
	wc.lpszMenuName		= NULL;
	wc.lpszClassName	= szAppName;

	RegisterClass(&wc);

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

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

	while(GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return msg.wParam;
}

/*** edit feld erstellen ***/
bool CreateEditField(HWND hwnd)
{	
   HWND hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "Edit", "nix ;) ",
   WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE |
   ES_AUTOVSCROLL, 200, 200,100,100, hwnd, NULL, NULL, NULL);
	
			if(hEdit != NULL)
			{
				return true;
			}

			else
			{
				return false;
			}
}



/*** callback ***/
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	

   	switch(message)
	{
	 case WM_KEYDOWN:
			switch(wParam)
			{
			case VK_F1:
				CreateEditField(hWnd);
				break;
			}
		break;

	case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		}
		break;
	
	}


	return DefWindowProc(hWnd, message, wParam, lParam);
}
 
ok.. danke danke danke... break vergessen... nenene.. das passiert wenn man dann betriebsblind wird und den fehler ganz woanders sucht

danke :)
 
Zurück