Oppure

Loading
07/03/09 10:25
lorenzo
Ho cercato su google ma non ho trovato niente e mi sembra strano.......possibile che non esista un ide per c++ che mi permetta(in windows) di disegnare interfacce grafiche senza usare wxwidgets e robe simili?

per spiegarmi meglio, vorrei un ide come visual basic 6 che mi generi codice di finetre win 32 puro, cioè con WndProc, WinMain etc....

conosco già come creare finestre e simili ma per lavorarci efficacemente non posso perdere tempo a misurare la finestra per sapere dove posizionare un bottone.

Qualcuno conosce qualche programma che fa al caso mio?
aaa
07/03/09 11:11
theprogrammer
Non so se ti ho capito completamente, ma puoi usare Visual Studio ...
aaa
07/03/09 11:19
andrea.b89
In sostanza ti serve un IDE per sviluppare le interfacce grafiche in maniera rapida per dedicarti ad aspetti del programma più importanti della mera GUI. Giusto?

Comunque prova uno dei componenti di Visual Studo 2008, ossia Visual C++ 2008.
Ne esiste la versione gratuita, la Express, liberamente scaricabile dal sito microsoft .
Eccoti il link del download microsoft.com/express/download/.

Spero di esserti stato di aiuto ;)
aaa
07/03/09 11:23
lorenzo
magari mi sbaglio, ma in visual studio se uso le winform non devo usare anche il NET?

io vorrei usare solo il c++ con le api di windows e i messaggi WM_DESTROY, etc...
Nel senso, per creare un bottono con le api si deve usare la funzione CreateWindow.
Io vorrei un ide che mi permetta di disegnare usando le api native del c++, non le form del NET.

Credo che con vs non sia possibile, giusto?

intendo un codice tipo questo, solo che questo l'ho dovuto scrivere a mano io.


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
	wndclass.style = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc = WndProc;
	wndclass.hInstance = hInstance;
	wndclass.cbClsExtra = 0;
	wndclass.cbWndExtra = 0;
	wndclass.hbrBackground = ( HBRUSH )GetStockObject( WHITE_BRUSH );
	wndclass.hCursor = LoadCursor( hInstance , ( const char * )IDC_CURSOR1 );
	wndclass.hIcon = LoadIcon( hInstance , ( const char * )IDI_ICON1 );
	wndclass.lpszMenuName = ( const char * )IDR_MENU1;
	wndclass.lpszClassName = szAppName;

	if( !RegisterClass( &wndclass ) )
	{
		MessageBox( NULL , TEXT( "Errore nell'apertura del programma" ) , szAppName , MB_ICONERROR );
		return 0;
	}

	hwnd = CreateWindow( ( const char * )szAppName, TEXT( "Window" ) , WS_OVERLAPPEDWINDOW ,
		CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , NULL , NULL , hInstance , NULL );

	ShowWindow( hwnd , SW_SHOWMAXIMIZED );
	UpdateWindow( hwnd );

	for( ; ; )
	{
		while( PeekMessage( &msg , NULL , 0 , 0 , PM_REMOVE ) )
		{
			if( msg.message == WM_QUIT )
		        return TRUE;
			
			TranslateMessage( &msg );
		    DispatchMessage( &msg );
		}
	}

	return ( int )msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
....
}
Ultima modifica effettuata da lorenzo 07/03/09 11:26
aaa
07/03/09 11:39
theprogrammer
Se vuoi usare la CreateWindow (ovvero solo le API di Windows) non ha senso chiedere un IDE con cui creare i form, in quanto tu li crei "dinamicamente" (ecco perche' non ne hai trovato!).

Per farlo con il supporto dell'IDE, ti devi appoggiare ad una libreria di classi che "incapsuli" le API e tutto quello che serve per creare le finestre cosi' come le imposti nell'IDE stesso.

Con Visual Studio lo puoi fare se usi il Framework .NET per un'applicazione managed, ma se vuoi creare un'applicazione NATIVA WIN32, puoi invece creare un'applicazione che usa le librerie MFC o le ATL.

Per renderti conto, prova a creare una "applicazione windows MFC" ed ad usare l'editor di risorse ...
aaa
07/03/09 11:58
lorenzo
non è che ami molto le mfc, mentre non ho mai usato le atl, proverò a documentarmi su quelle......
aaa
07/03/09 12:19
andrea.b89
Quanto posto di seguito è un esempio creato con Visual C++ 2008
So che sarà lungo, ma voglio capire se è ciò che ti serve.
Nel caso, quando crei il progetto è sufficiente creare una applicazione Win32

// zil.cpp : definisce il punto di ingresso dell'applicazione.
//

#include "stdafx.h"
#include "zil.h"

#define MAX_LOADSTRING 100

// Variabili globali:
HINSTANCE hInst;								// istanza corrente
TCHAR szTitle[MAX_LOADSTRING];					// Testo della barra del titolo
TCHAR szWindowClass[MAX_LOADSTRING];			// nome della classe di finestre principale

// Dichiarazioni con prototipo delle funzioni incluse in questo modulo di codice:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	UNREFERENCED_PARAMETER(hPrevInstance);
	UNREFERENCED_PARAMETER(lpCmdLine);

 	// TODO: inserire qui il codice.
	MSG msg;
	HACCEL hAccelTable;

	// Inizializzare le stringhe globali
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
	LoadString(hInstance, IDC_ZIL, szWindowClass, MAX_LOADSTRING);
	MyRegisterClass(hInstance);

	// Eseguire l'inizializzazione dall'applicazione:
	if (!InitInstance (hInstance, nCmdShow))
	{
		return FALSE;
	}

	hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ZIL));

	// Ciclo di messaggi principale:
	while (GetMessage(&msg, NULL, 0, 0))
	{
		if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	return (int) msg.wParam;
}



//
//  FUNZIONE: MyRegisterClass()
//
//  SCOPO: registra la classe di finestre.
//
//  COMMENTI:
//
//    Questa funzione e il relativo utilizzo sono necessari solo se si desidera che il codice
//    sia compatibile con i sistemi Win32 precedenti alla funzione 'RegisterClassEx'
//    aggiunta a Windows 95. È importante chiamare questa funzione
//    in modo da ottenere piccole icone in formato corretto associate
//    all'applicazione.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ZIL));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_ZIL);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}

//
//   FUNZIONE: InitInstance(HINSTANCE, int)
//
//   SCOPO: salva l'handle di istanza e crea la finestra principale
//
//   COMMENTI:
//
//        In questa funzione l'handle di istanza viene salvato in una variabile globale e
//        la finestra di programma principale viene creata e visualizzata.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Memorizzare l'handle di istanza nella variabile globale

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNZIONE: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  SCOPO:  elabora i messaggi per la finestra principale.
//
//  WM_COMMAND	- elabora il menu dell'applicazione
//  WM_PAINT	- disegna la finestra principale
//  WM_DESTROY	- inserisce un messaggio di uscita e restituisce un risultato
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// Analizzare le selezioni di menu:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: aggiungere qui il codice per il disegno...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

// Gestore dei messaggi della finestra Informazioni su.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		return (INT_PTR)TRUE;

	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
		{
			EndDialog(hDlg, LOWORD(wParam));
			return (INT_PTR)TRUE;
		}
		break;
	}
	return (INT_PTR)FALSE;
}
aaa
07/03/09 12:22
lorenzo
gli ho dato un'occhiata e anche se qualche istruzione è differente, dovrebbe essere quello che voglio io. Di solito uso vc++6.0 e scrivo da me tutto il codice....

però anche in vs non posso disegnare a mano la finestra
Ultima modifica effettuata da lorenzo 07/03/09 12:26
aaa