Finestra windows

di il
5 risposte

Finestra windows

Ciao a tutti. Sono nuovo del forum e anche nella programmazione.
Volevo chiedervi se si poteva creare delle finestre di Windows nel programma che sto facendo in C (utilizzando Dev-Cpp) anzichè utlizzare DOS. Ho provato a fare Apri progetto di Dev-Cpp ma appare solo una finestra bianca. Come posso fare?
Grazie

5 Risposte

  • Re: Finestra windows

    Ciao,

    Non è chiaro di cosa stai parlando... per aprire una finestra windows è sufficiente crearla utilizzando le API apposite (CreateWindow, ShowWindow, UpdateWindow). Si tratta di programmazione win32 che è qualcosa di molto diverso dalla programmazione sequenziale DOS o dagli applicativi console.

    Per la creazione di applicazioni dialog-based (basate cioè su delle finestre di dialogo) dovrai ricorrere ad un editor di risorse (msvc l'ha integrato, devc++ no) e di nuovo ricorrere alle API di sistema ed alla programmazione win32 in generale.

    Ciaociao
  • Re: Finestra windows

    Si intendevo aprire il programma anzichè in DOS con una finestra classica di Windows
  • Re: Finestra windows

    Ciao,

    In questo caso (immagino tu non abbia mai preso a mano la programmazione win32) sarà il caso di iniziare a documentarsi e prepararsi ad un passaggio che spesso è volentieri non è proprio indolore.

    Questo link può essere utile per aiutarti a capire come creare una prima semplice finestra: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows.asp

    Ricorda che un applicativo win32 inizia con una WinMain (e non una classica main)... è bene magari cercare di rintracciare qualche tutorial introduttivo.

    Il listato più semplice possibile che apre una finestra è. più o meno il seguente:
    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
    
    LPSTR lpszClassName=\"Nome_classe\";
    LPSTR lpszWindowName=\"Nome_finestra\";
    HWND hWnd=NULL;
    
    INT WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpCmdLine,int nCmdShow){
    WNDCLASS wc;
    MSG msg;
    bool done=false;
    
    	wc.style=CS_VREDRAW|CS_HREDRAW;
    	wc.lpszMenuName=NULL;
    	wc.lpszClassName=lpszClassName;
    	wc.lpfnWndProc=WndProc;
    	wc.hInstance=hInst;
    	wc.hIcon=(HICON)NULL;
    	wc.hCursor=LoadCursor(NULL,IDC_ARROW);
    	wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
    	wc.cbWndExtra=0;
    	wc.cbClsExtra=0;
    	if(!RegisterClass(&wc)) return 0L;
    
    	hWnd=CreateWindow(lpszClassName,lpszWindowName,
    		WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
    		NULL,NULL,hInst,NULL);
    
    	if(!hWnd){UnregisterClass(lpszClassName,hInst);return 0L;}
    
    	ShowWindow(hWnd,SW_NORMAL);
    	UpdateWindow(hWnd);
    
    	while(!done){
    		if(PeekMessage(&msg,0,0,0,PM_NOREMOVE)){
    			if(GetMessage(&msg,0,0,0)){
    				TranslateMessage(&msg);
    				DispatchMessage(&msg);
    			}else{
    				done=true;
    			}
    		}else{
    			//... la finestra non sta processando messaggi...
    		}
    	}
    
    	return (int)msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){
    	switch(uMsg){
    		case WM_CLOSE:
    			PostQuitMessage(0);
    			return 0L;
    		default:
    			break;
    	}
    
    	return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
  • Re: Finestra windows

    NB: E'bene sottolinearti che non è più possibile utilizzare nessuna delle funzioni standard di IO (printf e similari), ed il sistema di gestione dei messaggi è asincrono (tutto andrebbe generalmente processato nella wndproc).

    Il trasferimento, quindi, di un'applicazione console in una win32 non è generalmente un'operazione molto semplice... nella migliore delle ipotesi è necessaria una fase piuttosto corposa di reengineering di tutto il progetto.
  • Re: Finestra windows

    Confermo con chi dice che il passaggio è piuttosto doloroso!!
    comunque prova a guardare questo tutorial:
    http://www.aleax.it/TutWin32
Devi accedere o registrarti per scrivere nel forum
5 risposte