Oppure

Loading
15/09/10 22:48
Saf
Spero che in questo forum qualcuno mi aiuti a capire dove sto sbagliando: sto cercando di fare un semplice programma in c++ con le Api di win32 che quando si preme un bottone disegni un rettangolo colorato (è solo per imparare a usare la funzione 'FillRect()'). Magari più avanti permettero di cambiare colore e via dicendo. Tuttavia ora il programma non visualizza alcunchè.

I possibili errori sono:
1) non riesco a creare il DC (device context) dove voglio disegnare;
2) non riesco a dare il colore al pennello 'hbr';
3) non ho definito correttamente il rettangolo 'Rect';
4) non ho capito come usare FillRect() o uno dei parametri di essa...

Per arrivare a questo punto ho passato giornate intere sul sito MSDN, ma ora sono bloccato.. (il compilatore dice che non ci sono errori..)

Posto il codice affinchè qualcuno possa trovare gli errori.
#include <windows.h>
#include <windowsx.h>


BOOL CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
int ed[3];

/*1  Creiamo il DC (display) dove disegnare*/
HDC hdc = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
/*2  creiamo un pennello e gli diamo come colore iniziale NERO*/
HBRUSH hbr = CreateSolidBrush(RGB(0,0,0));
/*3  creiamo la classe rettangolo*/
RECT Rect;



int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil){
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    
    /*Disegniamo la finestra di dialogo*/
    DialogBoxParam(0,"Dlg",0,WindowProcedure,0);
    
    /*4  Impostiamo le coordinate del rettangolo*/
    Rect.left = 5;
    Rect.top = 5;
    Rect.bottom = 500;
    Rect.right = 176;
    
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0)){
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */
BOOL CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
    switch (message)  {                /* handle the messages */
        case WM_CLOSE:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        case WM_COMMAND:
            if (HIWORD(wParam)==BN_CLICKED&&LOWORD(wParam)==1000){
               /*5  Disegno vero e proprio: col pennello 'hbr' coloriamo il 
                    rettangolo 'Rect' contenuto nel display 'hdc'*/
               FillRect(hdc,&Rect,hbr);
            } 
            break;
    }
    return 0;
}
Ultima modifica effettuata da HeDo 16/09/10 20:02
aaa
16/09/10 13:32
HeDo

tutto ciò che riguarda il disegno su finestra con le gdi va eseguito nell'evento WM_PAINT, tra le chiamate beginpaint ed endpaint.

se lo fai al di fuori rischi che il refresh della finestra sovrarscriva il tuo disegno, risultando quindi invisibile.
aaa