welke functie kan ik gebruiken om iets naar een window te schrijven?

Status
Niet open voor verdere reacties.

fsasfsas

Gebruiker
Lid geworden
11 sep 2006
Berichten
429
beste allemaal

Ik ben een eenvoudige (console)applicatie aan het overzetten naar een windows app.
Dat hele gebied is nieuw voor mij en ik moet dan ook veel opzoeken.

Wat ik echter niet kan vinden is het volgende:
Bij de console applicatie worden allerlei waarden tussendoor weggeschreven naar het "scherm" zodat je tijdens het runnen de zaak een beetje kunt volgen.
Hoe kan ik zoiets voor elkaar krijgen bij windows?

Ik heb nu een eenvoudig window gemaakt met een menu en de daarbij horende acties.
Ik wil dus graag het verloop van allerlei dingen kunnen volgen door gewoon in het hoofdscherm regels te schrijven, zoals dat bij een "dos-box" kan met bv printf.

Ik zoek al uren maar ik krijg het niet voor elkaar. Kan iemand me een tip geven hoe dit moet of waar ik moet zoeken (bv een voorbeeld-applicatie)? bv welke functie zou ik dan moeten gebruiken?

Ik kan de tekst weliswaar naar een dialog box krijgen maar ik wil het dus heel graag gewoon in het eerste window wegschrijven. Gewoon onder het menu.

Hopelijk beschrijf ik het duidelijk,

alvast met dank, Anjo
 
beste allemaal

Ik ben een eenvoudige (console)applicatie aan het overzetten naar een windows app.
Dat hele gebied is nieuw voor mij en ik moet dan ook veel opzoeken.

Wat ik echter niet kan vinden is het volgende:
Bij de console applicatie worden allerlei waarden tussendoor weggeschreven naar het "scherm" zodat je tijdens het runnen de zaak een beetje kunt volgen.
Hoe kan ik zoiets voor elkaar krijgen bij windows?

Ik heb nu een eenvoudig window gemaakt met een menu en de daarbij horende acties.
Ik wil dus graag het verloop van allerlei dingen kunnen volgen door gewoon in het hoofdscherm regels te schrijven, zoals dat bij een "dos-box" kan met bv printf.

Ik zoek al uren maar ik krijg het niet voor elkaar. Kan iemand me een tip geven hoe dit moet of waar ik moet zoeken (bv een voorbeeld-applicatie)? bv welke functie zou ik dan moeten gebruiken?

Ik kan de tekst weliswaar naar een dialog box krijgen maar ik wil het dus heel graag gewoon in het eerste window wegschrijven. Gewoon onder het menu.

Hopelijk beschrijf ik het duidelijk,

alvast met dank, Anjo

Het is vrij moeilijk om je te helpen als je niet zegt welke GUI toolkit je gebruikt.
Dingen onder een menu schrijven? Nee dat lijkt me niet logisch, je kan tekst in een texbox of dialog box zetten zoals je zelf zegt. Maar het is meestal de gewoonte dat programmeurs tussentijdse resultaten wegschrijven naar de console (eventueel zelf tussen ifndef __DEBUG__ ... endif ). Als je wilt testen of het klikken op een menu-item resultaat geeft,
schrijf dan gewoon iets naar de console?
 
Dag,

ik gebruik microsoft visual studio express 2008.

Het is een prive-applicatie en de resultaten die ik wil laten zien zijn geen tussentijdse debug-activiteiten maar horen bij het programma zelf. Ik kan me voorstellen dat je mijn wens niet logisch vindt maar het heeft een reden: Ik heb een ietwat beperkte arm- en handfunctie dus liefst zo weinig mogelijk windows, zo weinig mogelijk klikken...

Ik heb hieronder even een schermpje "getekend" om te laten zien wat ik bedoel.
Zodra ik bv op "res" klik, wil ik graag dat er een subprogramma gaat lopen. Dit subprogramma schrijft ondertussen dingen naar het scherm zodat ik kan zien of de boel goed loopt. En met goed lopen bedoel ik niet het debuggen maar de echte run. Bijvoorbeeld de nummers van de dingen die verwerkt worden zodat ik weet waar het programma ergens zit of bv waarschuwingen als de gegeven input (uit een file) niet helemaal klopt.

|-----------------------------------------------------------------------------------------------------------
| Res Onres Verw
|-----------------------------------------------------------------------------------------------------------
| en dan hier dus gewoon in het window de tekst die tijdens de runs door de
| verschillende programma-onderdelen gegenereerd worden.
| met een scrollbar verticaal (want het kan best veel zijn)
|
|
|
|
|
|
|-----------------------------------------------------------------------------------------------------------

Hopelijk is dit duidelijker? Zoals al gezegd, ik ben een leek op het windows-gebied dus ik weet misschien ook niet goed te verwoorden wat ik zoek

groetjes, Anjo
 
en nog even een aanvulling:
het is een C programma, geen C++

groetjes, Anjo
 
Na nog weer een boel nagezocht te hebben (slik) moet ik misschien mijn vraag anders stellen:

het komt er eigenlijk op neer dat ik de tekst die normaal gesproken naar mijn "dos-box" geschreven wordt in een window (liefst het hoofdwindow) wil hebben.
Kan ik op een of andere manier mijn stdout in windows zetten? en zo ja, hoe?

alvast met dank, ANjo
 
Als je gebruik maakt van de win32 api kan je met CreateWindow() een child window maken bijv. een "edit" of evt. een "richedit".
Daar kan je dan tekst zetten met SetWindowText() of toevoegen met een EM_REPLACESEL message.

Kan je een stukje van je code posten zodat wij weten hoe je je hoofdwindow maakt.
 
Ik heb gebruik gemaakt van een tutorial op het net (theForger's Win32 API Programming Tutorial). Ik heb hieronder in de code hier en daar wat weggelaten omdat het anders zulke grote lappen tekst worden. Als ik te veel eruit gelaten heb, dan hoor ik het wel.

Ik heb het nu opgelost door een console te openen en daar mijn teksten in te zetten (die worden gegenereerd in de functie verwerkfile) maar ik zou dit dus graag in het hoofdwindow zelf schrijven. Los van het feit dat ik een console-window lelijker vindt, is het ook minder handig omdat je dan met twee windows zit.

Code:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
				   LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASSEX wc;
	HWND hwnd;
	MSG Msg;

	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.style		 = 0;
	wc.lpfnWndProc	 = WndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra	 = 0;
	wc.hInstance	 = hInstance;
	wc.hIcon		 = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MYMENU);
	wc.lpszClassName = g_szClassName;
	wc.hIconSm		 = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 16, 16, 0);

	if(!RegisterClassEx(&wc))
	{	
		MessageBox(NULL, "Window Registration Failed!", "Error!",
			MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}

	// maak een dos box voor de output
	AllocConsole();
	freopen_s(&stream, "conin$", "r", stdin);
	freopen_s(&stream, "conout$", "w", stdout);
	freopen_s(&stream, "conout$", "w", stderr);
	hStdin = GetConsoleWindow();
	if (hStdin==NULL)
		printf ("null");

	hwnd = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		g_szClassName,
		"A Menu",
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, 500, 60,
		NULL, NULL, hInstance, NULL);

	if(hwnd == NULL)
	{
		MessageBox(NULL, "Window Creation Failed!", "Error!",
			MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
//	SetForegroundWindow (hwnd);
//	SetForegroundWindow (hStdin);

	while(GetMessage(&Msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
	return Msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
{	switch(Message)
	{
  	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case ID_HELP_ABOUT: 
... code weggelaten
		case ID_FILE_EXIT:
			PostMessage(hwnd, WM_CLOSE, 0, 0);
			break;
		case ID_RES_RES:
			{   
				DoFileOpen(hwnd, "res");
				
				if (strlen(filename))
				{
					printf ("gekozen filename is \n-%s-\n\n", filename);
					SetForegroundWindow (hStdin);
					verwerkfile();
					SetForegroundWindow (hwnd);
				}
			}
			break;
		case ID_ONRES:
			{   
				DoFileOpen(hwnd, "onres");
				
				if (strlen(filename))
				{
					printf ("gekozen filename is \n-%s-\n\n", filename);
					SetForegroundWindow (hStdin);
					printf( "hier komt code voor onreservering");
					SetForegroundWindow (hwnd);
				}
			}
			break;
		}
		break;
	case WM_LBUTTONDOWN:
		{
		char szFileName[MAX_PATH];
		HINSTANCE hInstance = GetModuleHandle(NULL);
		GetModuleFileName(hInstance, szFileName, MAX_PATH);
		MessageBox(hwnd, szFileName, "This program is (via muis):", MB_OK | MB_ICONINFORMATION);
		}
		break;
		// de DlgProc staat in de file dlgproc.c
	//	case WM_RBUTTONDOWN:
		//		DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc);
		//		break;
	case WM_CLOSE:
		DestroyWindow(hwnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	
	default:
		return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	return 0;
}

met dank dat je er even naar wilt kijken!

groetjes, Anjo
 
Je kan een childwindow toevoegen. Ik doe dat in dit geval even in WinMain().
Het mag ook ergens anders zoals in de WM_CREATE van de WndProc().

buiten WinMain()
Code:
// ID van de edit
#define IDC_EDIT 41
// globale hendel van de edit.
HWND g_hedit;
//functie om tekst toe te voegen
void
edituit(LPCTSTR sz)
{
 SendMessage(g_hedit,EM_REPLACESEL,0,(LPARAM)sz);
}

en in WinMain():
Code:
//...
	if(hwnd == NULL)
	{
		MessageBox(NULL, "Window Creation Failed!", "Error!",
			MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}

    //maak een childwindow
    g_hedit = CreateWindow("edit", "", WS_VISIBLE|WS_VSCROLL|WS_CHILD
                           |ES_MULTILINE|WS_BORDER,
                           0,0,250,40,hwnd,(HMENU)IDC_EDIT,hInstance,0);

    if(g_hedit == NULL)
    {
        MessageBox(NULL, "Het edit venster kan niet gemaakt worden.", NULL,
			MB_ICONEXCLAMATION | MB_OK);
    }
    //tekst toevoegen met de functie edituit()
    edituit("Een regel met tekst.\r\n");
    edituit("Hallo wereld.");

	ShowWindow(hwnd, nCmdShow);
//...
Ik hoop dat je hiermee iets kan. Er wordt geen gebruik gemaakt van een filehandle dus
printf() enz. kan je hier niet gebruiken om naar de edit te schrijven.
 
Dag

Dit is precies wat ik bedoel! Heel erg bedankt, je hebt me enorm geholpen.

Ik heb nog een regel aan edituit toegevoegd. Het was nog even zoeken maar nu ziet het er naar uit dat de tekst meteen na toevoegen van een regel onderaan de tekst gaat staan, zodat ik steeds de laatst toegevoegde tekst kan lezen zonder zelf te hoeven scrollen:
SendMessage(g_hedit,EM_SCROLL,(WPARAM)SB_PAGEDOWN,0);

nogmaals heel erg bedankt!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan