Newsgroup: it.comp.programmare.win32
Titolo: g++ e finestra DOS in background

Salve,
sto provando a sviluppare programmini win32 con g++. 
I programmi funzionano correttamente (sono create le finestre e tutte
le operazioni previste vanno a buon fine), ma quando li lancio, appare
in background una finestra DOS, che si chiude solo quando termina il
programma.
Il problema si presenta sia su win2k che su winXP.
Sto usando g++ 3.2.3 e la libreria gdi32 standard, scaricata assieme a
minGW.
Grazie per qualunque suggerimento.
Allego un esempio... (lasciate perdere lo stile . . .)
#include <windows.h>
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
void Converti(unsigned char in , char * out1, char * out2);
const char g_szClassName[] = "myWindowClass";
const int LSTRINGA = 500000;
char stringa [LSTRINGA];
char NomeFile[20];
long int byteLetti=0;
string Messaggi;
const int largFont = 12; //larghezza del singolo carattere
int hIniziale = 0; 
 
// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
lParam)
{
	HDC hDC; // dichiaro l'handle al drive context
	HPEN hPen, hPenOld; // dichiaro l'handle della penna
	LOGPEN logPen; //dichiaro la struttura che contiene stile e colore
della penna
	POINT punto; // dichiaro il punto per attribuire lo spessore della
penna
	LOGBRUSH logBrush = {BS_SOLID, RGB(160,160,160), 0};
	HBRUSH hBrush;
	LOGFONT logFont = {18, largFont, 0, 0, 500, FALSE, FALSE,FALSE,
ANSI_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
		DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN,"Courier New"};
//	LOGFONT logFont = {20, 10, 0, 0, FW_NORMAL, FALSE,FALSE,
FALSE,DEFAULT_CHARSET,OUT_TT_ONLY_PRECIS,
//		CLIP_LH_ANGLES,DEFAULT_QUALITY,DEFAULT_PITCH|FF_ROMAN ,"Times New
Roman"};
	HFONT hFont; 
 
 
	char cifra1;
	char cifra2;
	unsigned char ch;
	long int k=0, offset=0;
	RECT rect;
 
	ifstream in;
 
 
	switch(msg)
	{
		case WM_CREATE:	
			MessageBox(NULL,NomeFile,"File che sta per essere
aperto",MB_ICONINFORMATION);
			in.open(NomeFile,ios::binary); //devo aprire NomeFile ! ! ! ! !
			if(in.is_open())
/*			{
				in.get(stringa,LSTRINGA);//con i file binari sembra non
funzionare: problema con carattere \00!
				in.close();
			}*/
			{
				while(offset = in.tellg() > -1 ) 
				{
					//in.read(&ch, 1); //leggo 1 byte e lo copio nella variabile ch
(come faccio con unsigned)
					ch = in.get(); 
					//adesso concateno il carattere ch alla stringa:
					stringa[k] = ch; //conversione implicita da unsigned char a char!
! ! ! ! !
					k++;					 
				};
				Messaggi = "Letti ";
				Messaggi += k; 
				Messaggi += " caratteri";
				MessageBox(NULL, Messaggi.c_str(), "Info",MB_OK); // ????????
//				MessageBox(NULL, stringa, "Stringa letta",MB_OK);
				byteLetti=k;
				in.close();
			}
			else
				MessageBox(NULL,"File non trovato","Errore apertura
file",MB_ICONERROR);
		break;
/*		case WM_CLOSE:
			DestroyWindow(hwnd);
		break;
*/		case WM_DESTROY:
			PostQuitMessage(0);
		break;
		//
		case WM_VSCROLL:
			switch((int) LOWORD(wParam))
			{
				case SB_LINEDOWN:
					hIniziale -= 15;
					SendMessage(hwnd, WM_PAINT,(WPARAM) NULL,(LPARAM) NULL);
					UpdateWindow(hwnd);
					//SetScrollInfo(hwnd,SB_VERT,);
				break;
				case SB_LINEUP:
					hIniziale += 15;
					SendMessage(hwnd, WM_PAINT,(WPARAM) NULL,(LPARAM) NULL);
					UpdateWindow(hwnd);
				break;				
			}
		break;
		//
		case WM_SIZE:
			SendMessage(hwnd,WM_PAINT,(WPARAM) NULL,(LPARAM) NULL);
			UpdateWindow(hwnd);
		break;
		//
		case WM_PAINT:
		{
			hDC = GetDC(hwnd);
			hFont = CreateFontIndirect(&logFont);
			SelectObject(hDC,hFont);
 
			GetClientRect(hwnd,&rect);
 
			int nColonne = (rect.right - rect.left - 13) / largFont; //12 è la
larghezza del singolo carattere
 
			if(nColonne > byteLetti)
				nColonne = byteLetti;
 
			long int nRighe = (byteLetti / nColonne);
 
 
			char * Priga1 = new char[LSTRINGA];			
			char * Priga2 = new char[LSTRINGA];
 
			for(long int i=0; i<byteLetti;i++)
			{
				Converti(stringa[i], &cifra1, &cifra2);
				* (Priga1 + i) = cifra1;
				* (Priga2 + i) = cifra2;
			};
 
			char * Pstringa = stringa;
/*			for(long int j = 0; j< nRighe;j++)
			{
				TextOut(hDC,22,10 + (80 * j),Pstringa,nColonne);//byteLetti);
			};
*/			
			for(long int j = 0; j< nRighe;j++)
			{
				SetTextColor(hDC,RGB(0,0,0));
				TextOut(hDC,1,hIniziale + 10 + (70 * j),Pstringa + j *
nColonne,nColonne);//byteLetti);
 
				SetTextColor(hDC,RGB(128,0,0));
				TextOut(hDC,1,hIniziale + 30 + (70 * j),Priga1 +j *
nColonne,nColonne);
				TextOut(hDC,1,hIniziale + 45 + (70 * j),Priga2 +j *
nColonne,nColonne);
			}
 
			delete [] Priga1;
			delete [] Priga2;
/*			
			TextOut(hDC,0,60,"+",1);
			TextOut(hDC,100,60,"+",1);
			TextOut(hDC,200,60,"+",1);
			TextOut(hDC,300,60,"+",1);
			TextOut(hDC,400,60,"+",1);
			TextOut(hDC,500,60,"+",1);
			TextOut(hDC,600,60,"+",1);
			TextOut(hDC,700,60,"+",1);
*/			
		}
		//
		default:
			return DefWindowProc(hwnd, msg, wParam, lParam);
	}
	return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow)
{
	WNDCLASSEX wc;
	HWND hwnd;
	MSG Msg;
	strcpy(NomeFile,"prova.txt"); // inserisco il nome di default per il
file di input
	//
	//Step 1: Registering the Window Class
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.style		 = 0;
	wc.lpfnWndProc	 = WndProc;
	wc.cbClsExtra	 = 0;
	wc.cbWndExtra	 = 0;
	wc.hInstance	 = hInstance;
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW); //IDC_CROSS);
	wc.hbrBackground = (HBRUSH)	(COLOR_WINDOW+1);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = g_szClassName;
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);
	if(!RegisterClassEx(&wc))
	{
		MessageBox(NULL, "Window Registration Failed!", "Error!",
			MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}
 
	if(strlen(lpCmdLine) >0 )
		strcpy(NomeFile,lpCmdLine);
	// Step 2: Creating the Window
	hwnd = CreateWindowEx(
		WS_EX_CLIENTEDGE,
		g_szClassName,
		"Editor esadecimale",
		//WS_POPUP , //| WS_DLGFRAME, 
		WS_OVERLAPPEDWINDOW | WS_VSCROLL,
//		0,0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
//		CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
		50,50,850,650,
		NULL, NULL, hInstance, NULL);
	//*****************************************************************************************
	//*****************************************************************************************
	if(hwnd == NULL)
	{
		MessageBox(NULL, "Window Creation Failed!", "Error!",
			MB_ICONEXCLAMATION | MB_OK);
		return 0;
	}
 
	//********************************************************************************
	// test su uso di parametro in riga comando										//
	//																				//
	//if(strlen(lpCmdLine) >0 )
	//	MessageBox(NULL,lpCmdLine,"Parametro in riga
comando",MB_ICONINFORMATION);	//
	//																				//
	//********************************************************************************
 
 
 
	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	// Step 3: The Message Loop
	while(GetMessage(&Msg, NULL, 0, 0) > 0)
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
	return Msg.wParam;
};
void Converti(unsigned char in , char * out1, char * out2)
{
	float dummyfl =0;
	int dummy = static_cast<int>(in);
	int dummy1 = dummy / 16;
	int dummy2 = dummy - (dummy1 * 16);
	char d1,d2;
 
	switch(dummy1)
	{
	case 15:
		d1 = 'F';
	break;
	case 14:
		d1 = 'E';
	break;
	case 13:
		d1 = 'D';
	break;
	case 12:
		d1= 'C';
	break;
	case 11:
		d1= 'B';
	break;
	case 10:
		d1= 'A';
	break;
	case 9:
		d1= '9';
	break;
	case 8:
		d1 = '8';
	break;
	default:
		d1 = dummy1 + 48;
	};
 
	switch(dummy2)
	{
	case 15:
		d2 = 'F';
	break;
	case 14:
		d2 = 'E';
	break;
	case 13:
		d2 = 'D';
	break;
	case 12:
		d2= 'C';
	break;
	case 11:
		d2= 'B';
	break;
	case 10:
		d2= 'A';
	break;
	default:
		d2 = dummy2 + 48;
	};
	*out1 = d1;
	*out2 = d2;
};

 Grazie per qualunque suggerimento.
ti ho gia' risposto sull'altro ng ...
cmq devi usare lo switch di linking -mwindows
ciao

...

Grazie, funziona perfettamente!
Ciao.