Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455

    [C++] Problema con classe _RECT

    Ciao a tutti,
    sto creando la mia classe per creare rettangoli.

    Il compilatore (DEV C++) non da errori, il programma parte ma la linea non viene disegnata.

    codice:
    #include <windows.h>
    
    class _RECT {
          public:
                 const static COLORREF redColor = RGB(255,0,0);
                 const static COLORREF blueColor = RGB(0,0,255);
                 const static COLORREF greenColor = RGB(0,255,0);
    
                 void Draw(HWND hwnd,int x,int y)
                 {
                   for(int i = 0; i < 100; i++)
                   DrawPixel(hwnd,x,y,blueColor);
                 }
                 void DrawPixel(HWND hwnd,int x,int y,COLORREF color=redColor)
                 {
                      if(hwnd == NULL)
                      {
                          exit(0);
                      }
                      HDC hdc = GetDC(hwnd);
                      SetPixel(hdc,x,y,color);
                      ReleaseDC(hwnd,hdc);
                      
                      return;
                 }
          };
    e poi chiamo la funzione per disegnare il triangolo all'interno dell'handler grafico della finestra del programma.

    codice:
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
               case WM_PAINT:
                    _RECT my_Rect;
                    my_Rect.Draw(hwnd,100,100);
                    break;
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }

  2. #2
    Nel WM_PAINT non devi chiamare GetDC, ma devi usare il DC che ti viene fornito chiamando la BeginPaint. Leggi la documentazione di WM_PAINT e più in generale i sotto-topic di questa pagina, nello specifico come minimo
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455
    Originariamente inviato da MItaly
    Nel WM_PAINT non devi chiamare GetDC, ma devi usare il DC che ti viene fornito chiamando la BeginPaint. Leggi la documentazione di WM_PAINT e più in generale i sotto-topic di questa pagina, nello specifico come minimo
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
    Non penso sia quello il problema...
    il codice funziona se viene inserito direttamente nella classe della finestra...

    provando a fare così non cambia nulla...

    codice:
               case WM_PAINT:
                hdc = BeginPaint(hwnd, &ps); 
                   for(int i = 0; i < 100; i++)
                   SetPixel(hdc,0,0,blueColor);
                EndPaint(hwnd, &ps); 
                    break;

  4. #4
    È sicuramente uno dei problemi, inizia a sistemare quello; più in generale, la regola del "ma a me funziona" è una pessima regola. Si segue la documentazione, ovvero il contratto tra il tuo programma e le WinAPI, perché se in questa versione di Windows sembra funzionare anche se sgarri, nella prossima potrebbe non andare più (e la colpa è tua che ti sei appoggiato a comportamenti non documentati).

    Altri problemi:
    • non stai disegnando un rettangolo, nella tua classe _RECT non fai altro che ridisegnare lo stesso pixel cento volte (tra l'altro in maniera estremamente inefficiente, dato che continui ad acquisire e rilasciare il DC);
    • più in generale, se scrivi una classe/funzione/... che deve disegnare non le fai passare un HWND, ma un HDC, in modo che (1) possa essere riciclata per disegnare su qualunque DC, non solo su quelli di finestra e (2) si eviti di perdere tempo ad acquisire/rilasciare DC ad ogni momento;
    • per disegnare rettangoli comunque c'è già la funzione Rectangle;
    • gli identificativi che iniziano per underscore e sono seguiti da una lettera maiuscola sono riservati per il compilatore in ogni namespace (cose simili valgono per i doppi underscore); poi in genere i nomi tutti maiuscoli si usano per le macro, ma quest'ultima è una questione più stilistica che altro.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455
    Il problema era questo...
    ho dimenticato di aggiungere il punto X di differenza.

    codice:
                   for(int i = 0; i < 100; i++)
                   DrawPixel(hwnd,x+i,y,blueColor);
    disegnavo sempre sullo stesso pixel come hai detto tu.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Oltre a quanto detto da MItaly aggiungo che almeno dovresti scrivere la for correttamente ...

    codice:
           case WM_PAINT:
                hdc = BeginPaint(hwnd, &ps); 
                for(int i = 0; i < 100; i++)
                   SetPixel(hdc, i, i, blueColor);
                EndPaint(hwnd, &ps); 
                break;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.