Newsgroup: it.comp.lang.c++
Titolo: Come iniziare

Vorrei cominciare a scrivere qualcosa in visual c++, ma mi serve uno spunto
per partire. Potete postare un programma che apre una finestra, scrive un
messaggio e ha a disposizione un pulsante per uscire.
Grazie
   Ciao
     Carlo

messaggio e ha a disposizione un pulsante per uscire.
Per esempio, cominciamo con la versione nelle Win32 API nude...:
#include <windows.h>
// dichiarazione forward della window procedure
LRESULT CALLBACK WindowProc(HWND hWnd, 
    UINT wMsg, WPARAM wParam, LONG lParam);
// la handle del bottone (poco elegante tenerla globale,
// ma comodo per un programmino giocattolo)
HWND hbutton;
// l'entry point di qualsiasi programma Windows:
int WINAPI WinMain(HANDLE hInstance, HANDLE, LPSTR, int nShow)
{
    // 1. defiamo la classe della finestra principale
    WNDCLASS wndClass;
    ZeroMemory(&wndClass, sizeof(wndClass));
    wndClass.hInstance = hInstance;
    wndClass.lpfnWndProc = WindowProc;
    wndClass.hbrBackground = GetStockObject(WHITE_BRUSH);
    wndClass.lpszClassName = "Esempio";
    if(!RegisterClass(&wndClass))
        return FALSE;
 
    // 2. facciamo la finestra principale
    HWND mywin = CreateWindow("Esempio", "Finestra d'esempio", 
        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,  // gli stili
        CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
        0, 0, hInstance, 0); 
    if(!mywin) return FALSE;
 
    // 3. le aggiungiamo il bottone
    hbutton = CreateWindow("BUTTON","Clickami!",
        WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // gli stili
        10, 10, 100, 50,
        mywin, 0, hInstance,0);
 
    // 4. mostriamo la finestra
    ShowWindow(mywin,nShow);
    UpdateWindow(mywin);
 
    // infine: il loop degli eventi
    MSG msg;
    while(GetMessage(&msg,NULL,0,0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
// 4. la window procedure
LRESULT CALLBACK WindowProc(HWND hWnd, UINT wMsg, WPARAM wParam, LONG lParam)
{
    switch(wMsg)
    {
    case WM_PAINT: {
            HDC         hDC;
            PAINTSTRUCT ps;
            if(hDC = BeginPaint(hWnd, &ps)) {
                // solo il messaggio -- il bottone si dipinge da se'
                TextOut(hDC, 10, 60, "Messaggio", 9);
                EndPaint(hWnd, &ps);
            }
        }
        break;
    case WM_DESTROY: {
            PostQuitMessage(0);
        }
        break;
    case WM_COMMAND: {
            if((HWND)lParam == hbutton) {
                WORD wNotifyCode = HIWORD(wParam);
                if(wNotifyCode == BN_CLICKED)
                    PostMessage(hWnd, WM_DESTROY, 0, 0);
            }
        }
    default:
        return DefWindowProc(hWnd, wMsg, wParam, lParam);
    }
    return FALSE;
}
Naturalmente, non e' molto comune avere un bottone su di
una finestra che non sia un dialogo, ma, e' quello che hai
chiesto, e' possibile, e quindi, ecco qua.
Ecco ora una versione MFC di un giocattolo analogo:
#include <afxwin.h>
// l'oggetto-applicazione
class MyApp: public CWinApp {
    BOOL InitInstance();
};
MyApp theApp;
// l'oggetto-finestra principale
class MyWin: public CFrameWnd {
    // gestione messaggi
    DECLARE_MESSAGE_MAP( )
    afx_msg void OnPaint();
    afx_msg void Cliccato();
public:
    static const int buttonId;
    CButton but;
};
// ID del bottone
const int MyWin::buttonId = 333;
// mappa dei messaggi
BEGIN_MESSAGE_MAP(MyWin, CFrameWnd)
    ON_WM_PAINT()
    ON_BN_CLICKED(MyWin::buttonId, Cliccato)
END_MESSAGE_MAP()
// l'entry point dell'applicazione
BOOL MyApp::InitInstance()
{
    // creiamo la finestra e il bottone
    MyWin* pW = new MyWin();
    m_pMainWnd = pW;
    pW->Create( 0, "Esempio in MFC");
    pW->but.Create("Cliccami!", BS_DEFPUSHBUTTON|WS_VISIBLE,
        CRect(10,10,100,50), pW, 333);
    // li mostriamo
    pW->UpdateWindow();
    pW->ShowWindow(SW_SHOW);
    // (il loop degli eventi e' implicito)
    return TRUE;
}
void MyWin::OnPaint()
{
    CPaintDC paint(this);
    paint.TextOut(10, 50, "Messaggio");
}
void MyWin::Cliccato()
{
    PostMessage(WM_CLOSE);
}
Come si vede, l'impostazione qui e' piuttosto analoga -- infatti
sto usando la MFC com'era una volta (solo il release 1.0, ci
dice Davide Marcato), un "sottile strato" sopra le API di Windows
che offre piccoli ma importanti "valori aggiunti" come le mappe
dei messaggi (e dei comandi di notifica), piccole funzionalita'
"precotte" e/o di default, "incapsulamento" come il CPaintDC,
ma in sostanza fa ragionare secondo le stesse linee della API
Windows.
Potremmo continuare con la versione ATL, ma, anche se non hai
minimamente precisato, dubito che fosse quello che intendevi
(comunque, a parte le sovrastrutture COM, non sarebbe poi tanto
diversa, a sua volta, da questi due programmi...:-).
Alex


grazie per la risposta celere.
La versione che ho e' la 5.0
Faccio qualche prova e poi ti faccio sapere.
Ciao
  Carlo