Prima applicazione windows

di il
12 risposte

Prima applicazione windows

Ho scritto questo semplice codice per iniziare a programmare in ambiente windows... ma non riesco a capire perche non funziona, c'è qualche anima pia che mi può aiutare?
Alla compilazione il programma termina senza errori, ma la finestra non compare. Nel debug sembra che ci sia un errore in un nome non riconosciuto nella funzione DialogBoxParam, però a me sembra scritta bene, sia la funzione che il relativo dialogo.

grazie..

FILE .cpp

#include"resource.h"
#include<Windows.h>


BOOL TreControlli(HWND hDialogo, UINT nMessage,
	WPARAM wParam, LPARAM lParam)
{
	
	// un caso che gestiamo: e` proprio un WM_COMMAND?
	if (nMessage != WM_COMMAND) return FALSE;

	// e` proprio il clic di un bottone?
	UINT codice = HIWORD(wParam);
	if (codice != BN_CLICKED) return FALSE;

	// e` proprio un bottone di interesse?
	int idCliccato = LOWORD(wParam);
	if (idCliccato != IDC_BUTTON_1 &&
		idCliccato != IDC_BUTTON_2) return FALSE;

	// OK, 
	HWND hScritta = GetDlgItem(hDialogo, ID_STATIC_1);
	if (!hScritta) return FALSE;    

									// scritta, e simultaneo "ultimo controllo d'errore":
	return SetWindowText(hScritta, idCliccato == IDC_BUTTON_1 ? "Primo" : "Secondo");
}

BOOL CALLBACK proc_IDD_5(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
	if (nMsg == WM_CLOSE) return EndDialog(hWnd, 0);
	
	if (nMsg ==WM_COMMAND) return TreControlli(hWnd, nMsg, wParam, lParam);

	return false;
}




int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	DialogBoxParam(0, "IDD_5", 0, proc_IDD_5, 0);
	DWORD a = GetLastError();	//verifica eventuale coldice errore -> codice:1814
	return 0;
}

file di risorse .rc

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
#include "winres.h"


#undef APSTUDIO_READONLY_SYMBOLS


#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ITA)
LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN

#ifdef APSTUDIO_INVOKED


1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""winres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif   
// Dialog
//

IDD_5 DIALOGEX 0, 0, 235, 156
STYLE DS_SETFONT | WS_CHILD | WS_CAPTION | WS_SYSMENU
CAPTION "Prova 5"
FONT 10, "Modern No. 20", 700, 0, 0x0
BEGIN
    CTEXT           "STATIC_1",ID_STATIC_1,69,93,68,20,SS_CENTERIMAGE
    PUSHBUTTON      "BUTTON_1",IDC_BUTTON_1,31,47,52,18
    PUSHBUTTON      "BUTTON_2",IDC_BUTTON_2,139,47,52,18
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    "IDD_5", DIALOG
    BEGIN
    END
END
#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// AFX_DIALOG_LAYOUT
//

IDD_5 AFX_DIALOG_LAYOUT
BEGIN
    0
END

#endif    // Italiano (Italia) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

header del file risorse .h

//{{NO_DEPENDENCIES}}
// File di inclusione generato con Microsoft Visual C++.
// Utilizzato da Resource.rc
//
#define IDD_5                           4
#define sandro                          9
#define ID_STATIC_1                     1001
#define IDC_BUTTON_1                    1005
#define IDC_BUTTON_2                    1006

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1007
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

12 Risposte

  • Re: Prima applicazione windows

    Scusa, ma perché C++? Hanno inventato C# e Visual Basic apposta. Usali e vedrai che la tua prima applicazione la fai in cinque minuti
  • Re: Prima applicazione windows

    La chiamata corretta sarebbe

    DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_5), NULL, proc_IDD_5, 0);

    ma otterresti un altro errore diverso dal 1814, ovvero il 1406, che ti indica che non puoi usare la DialogBoxParam senza una finestra di livello "topwindow".

    Per un esempio dai un'occhiata a

    https://docs.microsoft.com/en-us/windows/win32/medfound/winmain-cpp

    ma tieni presente che questo tipo di programmazione è vecchia di anni e, come vedi, è poco "pratica".
    Dovresti utilizzare librerie già pronte per la creazione/gestione di window (anche la MFC sebbene si tratti ancora di roba vecchia) ma ne esistono tante altre. Solamente con gli strumenti nativi API Win32 non vai tanto lontano.

    Il miglior suggerimento per applicazioni Windows è quello di passare a C#.
  • Re: Prima applicazione windows

    Concordo con oregon e weierstrass ,ti consiglierei di leggere qualche libro,sarebbe un buon investimento ,trovi anche qualche libro gratuito su c# ,ad esempio cerca con google "fundamentals computer programming c#"
  • Re: Prima applicazione windows

    Io non ho conoscenze molto elevate di programmazione, sono autodidatta e conosco un po' di c++ imparato sui vari manuali.
    Sto cercando di applicare quello che so alla programmazione sotto windows.... d'altronde conoscere un linguaggio di programmazione ma non applicarlo a che serve? mica posso continuare a fare i test con prompt comandi...
    Sto cercando quindi di applicarmi ambiente windows ma tutti i manuali che ho trovato sono in inglese e quindi... prima di prenderne uno.... e già che ci siamo e anche ben accettato un consiglio su quale prendere... ho pensato di apprendere almeno qualche base su l'unica guida nostrana che ho trovato in rete anche se vecchia... in questo modo quando passo al manuale in inglese almeno qualche base c'è l'ho.

    Tornando al mio problema...questa applicazione che ho fatto non è la prima ma la seconda... l'altra funziona bene. questa l'ho fatta con il solito sistema ma non va.... portroppo non capisco perché...
  • Re: Prima applicazione windows

    >>> tutti i manuali che ho trovato sono in inglese e quindi...

    cerca bene su amazon "c#",se t'interessa c'è anche qualche manuale in italiano
  • Re: Prima applicazione windows

    La prima applicazione quale sarebbe? Mostra il codice.
  • Re: Prima applicazione windows

    Ho usato nel solito modo sia la DialogBoxParam() che CALLBACK... ma nell'altro non funziona
    Questo il file .cpp
    
    #include"resource.h"
    #include<Windows.h>
    #include<stdio.h>
    
    
    
    
    
    class Dialogo
    {
    public:
    	Dialogo();
    	void conta_click(HWND, UINT, WPARAM, LPARAM);
    	void chiudi_finestra(HWND, UINT, WPARAM, LPARAM);
    	void azzera_click(HWND, UINT, WPARAM, LPARAM);
    	
    	void set(int, HWND, UINT, WPARAM, LPARAM);
    	
    	
    	
    private:
    	void (Dialogo::*elenco[3])(HWND, UINT, WPARAM, LPARAM);
    	char conta[10];
    	int contatore;
    
    };
    
    
    BOOL CALLBACK procDialog_1(HWND hwndDlg_1, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	static Dialogo conta;
    
    	
    	
    	int indice= -1;
    
    
    	if (uMsg == WM_CLOSE)indice = 0;		//chiudi finestra intero 16
    	if (uMsg == WM_COMMAND)
    	{
    		WORD wNotifica = HIWORD(wParam);	//estrae la notifica
    		WORD wId = LOWORD(wParam);	//estrae l'ID dello static che ha mandato la notifica
    
    
    		if (wNotifica == BN_CLICKED and wId== STATIC_bottone)indice = 1;	//chiama la funzione conta_click
    		if (wNotifica == STN_CLICKED and wId==STATIC_conta_click)indice = 2;	//chiama la funzione azzera_click
    	}
    	
    	if (indice >=0)
    	{
    		conta.set(indice, hwndDlg_1, uMsg, wParam, lParam);
    		//elenco[indice](hwndDlg_1, uMsg, wParam, lParam);
    		indice = -1;
    		return true;
    	}
    	else return false;
    
    	
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    	
    	DialogBoxParam(0, "dialogo_1", 0, procDialog_1, 0);
    	return 0;
    }
    
    void Dialogo::conta_click(HWND handle , UINT msg, WPARAM w, LPARAM l)
    {
    		contatore++;
    		sprintf_s(conta, 10, "%ld", contatore);
    
    		HWND id_finestra = GetDlgItem(handle, STATIC_conta_click);	//recupera l'indirizzo dello STATIC, handle è l'indirizzo di DIALOGO_1
    		//HWND id_finestra = (HWND)l;	//recupera l'indirizzo dello static che ha mandato il messaggio
    		SendMessage(id_finestra, WM_SETTEXT, 0, (LPARAM)conta);
    		
    
    }
    
    void Dialogo::chiudi_finestra(HWND handle, UINT msg, WPARAM w, LPARAM l)
    {
    	EndDialog(handle, 0);
    
    }
    
    void Dialogo::azzera_click(HWND handle, UINT msg, WPARAM wP, LPARAM lP)
    {
    	contatore = 0;
    	sprintf_s(conta, 10, "%ld", contatore);
    	SendMessage((HWND)lP, WM_SETTEXT, 0,(LPARAM)conta);
    
    	
    }
    
    void Dialogo::set(int indice, HWND handle, UINT msg, WPARAM w, LPARAM l)
    {
    	(this->*elenco[indice])(handle, msg, w, l);
    }
    
    
    Dialogo::Dialogo()
    {
    	elenco[0] = &Dialogo::chiudi_finestra;
    	elenco[1] = &Dialogo::conta_click;
    	elenco[2] = &Dialogo::azzera_click;
    	
    	contatore = 0;
    }
    
    
    questo il file risorse
    // Microsoft Visual C++ generated resource script.
    //
    #include "resource.h"
    
    #define APSTUDIO_READONLY_SYMBOLS
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 2 resource.
    //
    #include "winres.h"
    
    /////////////////////////////////////////////////////////////////////////////
    #undef APSTUDIO_READONLY_SYMBOLS
    
    /////////////////////////////////////////////////////////////////////////////
    // Italiano (Italia) resources
    
    #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ITA)
    LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN
    
    /////////////////////////////////////////////////////////////////////////////
    //
    // Dialog
    //
    
    DIALOGO_1 DIALOGEX 0, 0, 213, 133
    STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "DIALOGO 1"
    FONT 8, "MS Sans serif", 0, 0, 0x0
    BEGIN
        CTEXT           "premi per zero",1,73,67,50,10,SS_NOTIFY | WS_BORDER | NOT WS_GROUP
        DEFPUSHBUTTON   "Premi_per contare",2,65,25,67,24,BS_CENTER | BS_NOTIFY | WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
    END
    
    
    #ifdef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // TEXTINCLUDE
    //
    
    1 TEXTINCLUDE 
    BEGIN
        "resource.h\0"
    END
    
    2 TEXTINCLUDE 
    BEGIN
        "#include ""winres.h""\r\n"
        "\0"
    END
    
    3 TEXTINCLUDE 
    BEGIN
        "\r\n"
        "\0"
    END
    
    #endif    // APSTUDIO_INVOKED
    
    
    /////////////////////////////////////////////////////////////////////////////
    //
    // DESIGNINFO
    //
    
    #ifdef APSTUDIO_INVOKED
    GUIDELINES DESIGNINFO
    BEGIN
        "DIALOGO_1", DIALOG
        BEGIN
            BOTTOMMARGIN, 131
        END
    END
    #endif    // APSTUDIO_INVOKED
    
    
    /////////////////////////////////////////////////////////////////////////////
    //
    // AFX_DIALOG_LAYOUT
    //
    
    DIALOGO_1 AFX_DIALOG_LAYOUT
    BEGIN
        0
    END
    
    #endif    // Italiano (Italia) resources
    /////////////////////////////////////////////////////////////////////////////
    
    
    
    #ifndef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 3 resource.
    //
    
    
    /////////////////////////////////////////////////////////////////////////////
    #endif    // not APSTUDIO_INVOKED
    
    
    questo l'header del file risorse
    //{{NO_DEPENDENCIES}}
    // File di inclusione generato con Microsoft Visual C++.
    // Utilizzato da Resource.rc
    //
    
    #define STATIC_bottone 2
    #define STATIC_conta_click 1
    // Next default values for new objects
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        102
    #define _APS_NEXT_COMMAND_VALUE         40001
    #define _APS_NEXT_CONTROL_VALUE         1001
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif
    
  • Re: Prima applicazione windows

    Il problema l'ho risolto da solo....
    Nel file delle risorse è indicata la proprietà WS_CHILD.... ebbene questa non gli piace.... se metto una delle altre due, per esempio WS_POPUP funziona.

    STYLE DS_SETFONT | WS_CHILD | WS_CAPTION | WS_SYSMENU -> non va, qualdo il WinMain arriva alla chiamata di CreateBoxParam() da errore
    STYLE DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -> funziona
  • Re: Prima applicazione windows

    Funziona ok, ma hai capito il perché? Lo stile WS_CHILD imposta il tuo dialog come finestra figlia di un'altra, che però non c'è. Lo stile WS_POPUP invece permette al dialog di esistere anche da sé, come top-level window. In ogni caso, la DialogBoxParam va chiamata come ti ha scritto oregon.
  • Re: Prima applicazione windows

    Infatti ti avevo detto che l'errore indicava la mancanza di una finestra topwindow.
  • Re: Prima applicazione windows

    Sinceramente non ho indagato piu di tanto.. però mi ero immaginato che il problema fosse qualcosa del genere.... visto il "child".... che non è proprio "son" ma siamo li

    per quanto riguarda la chiamata della DialogBoxParam si... anche nel tutorial che sto seguendo andando avanti utilizzata la forma indicata da oregon.

    Purtroppo, piu che vado avanti mi sto accorgendo che questo tutorial è veramente datato..... mi potete consigliare un buon manuale (con esercizi) in c++ applicato a windows? quelli che ho trovato non riesco a capire se sono ricchi di esercizi.
    in c# li ho trovati anche da solo ma non voglio questo.


    grazie
  • Re: Prima applicazione windows

    Il fatto è che qyesto tipo di programmazione è datato quindi non troverai molto. Scegli una libreria e usala. Ad esempio la Qt

    https://www.qt.io

    P.S. ricorda che qui il crossposting è vietato...
Devi accedere o registrarti per scrivere nel forum
12 risposte