[C/C++] ungewöhnliches verhalten

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von tobZel, 31. Juli 2007 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 31. Juli 2007
    ungewöhnliches verhalten

    huhu, ich hab mal wieder angefangen mit c++ zu proggen:
    Diese wnd proc soll dafür sorgen das ein fenster erstellt wird mit verschiedenen feldern. Wenn man drauf klickt soll es sich rosa färben und andersherum. Also die erkennung welches feld man angeklickt hat funktioniert. Das färben aber leider nur in der ersten reihe. Und manche sind einfach so pink oO
    naja hier mal der code:
    Code:
    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
     static int cxClient, cyClient;
     static int *iFieldState;
     static int iFieldSize;
     static int cxFieldCount;
     static int cyFieldCount;
     int i;
     int a;
     int x;
     int y;
     HDC hdc;
     PAINTSTRUCT ps;
     HBRUSH pinkbrush;
    
     switch (message)
     {
     case WM_DESTROY:
     PostQuitMessage(0);
     delete [] iFieldState; 
     break;
     case WM_CREATE:
     //Feldervariablen intialisieren
    
     iFieldSize = 20;
     cxFieldCount = 10;
     cyFieldCount = 30;
     iFieldState = new int[cxFieldCount*cyFieldCount];
     ZeroMemory(iFieldState, cxFieldCount*cyFieldCount);
     break;
     case WM_SIZE:
     cxClient = LOWORD(lParam);
     cyClient = HIWORD(lParam);
     break;
     case WM_LBUTTONDOWN:
     x = LOWORD(lParam);
     y = HIWORD(lParam);
     x /= iFieldSize;
     y /= iFieldSize;
     if(x >= cxFieldCount || y >= cyFieldCount)
     break;
     iFieldState[y*cyFieldCount+x] = !iFieldState[y*cyFieldCount+x];
     break;
     case WM_PAINT:
     hdc = BeginPaint(hwnd, &ps);
     pinkbrush = CreateSolidBrush(RGB(255,0,255));
     iFieldState[1]=1;
     //Hier werden manche punke gegebenfalls gefärbt
     SelectObject(hdc, pinkbrush);
     SelectObject(hdc, GetStockObject(NULL_PEN));
     for(i=0;i<(cyFieldCount);i++)
     {
     for(a=0;a<cxFieldCount;a++)
     {
     if(iFieldState[i*cyFieldCount+a]>0)
     Rectangle(hdc, a*iFieldSize, i*iFieldSize, (a+1)*iFieldSize+1, (i+1)*iFieldSize+1);
     }
     }
     DeleteObject(pinkbrush);
    
     SelectObject(hdc, GetStockObject(BLACK_PEN));
     //hier werden die Felder gezeichnet
     for(i=0;i<(cyFieldCount+1);i++)
     {
     MoveToEx(hdc, 0, (i*iFieldSize), NULL);
     LineTo(hdc, (cxFieldCount*iFieldSize), (i*iFieldSize));
     }
     for(a=0;a<(cxFieldCount+1);a++)
     {
     MoveToEx(hdc, (a*iFieldSize), 0, NULL);
     LineTo(hdc, (a*iFieldSize), (cyFieldCount*iFieldSize));
     } 
     EndPaint(hwnd, &ps);
     break;
     }
     return DefWindowProc(hwnd, message,wParam, lParam);
    }

    mfg tobZel
     
  2. 31. Juli 2007
    AW: ungewöhnliches verhalten

    Könntest du mal den ganzen Code uppen? Dann schau ich mir das mal genauer an ^^ Weil so seh ich atm nix.

    mfg r90
     
  3. 31. Juli 2007
    AW: ungewöhnliches verhalten

    hm ich bezweifle das du sonst was sehen kannst. In der wndproc ist ja das gesamte verhalten. sonst hab ich nur noch die winmain, die das fenster erstellt, aber das funkt ja. Kannst trotzdem mal gucken: Warsztat - Tworzenie gier, polski serwis o programowaniu gier

    Ich hab jetzt mit paar test bissle geguckt.
    Code:
    for(i=0;i<(cyFieldCount);i++)
     {
     for(a=0;a<cxFieldCount;a++)
     {
     if(iFieldState[i*cyFieldCount+a]>0)
     Rectangle(hdc, a*iFieldSize, i*iFieldSize, (a+1)*iFieldSize+1, (i+1)*iFieldSize+1);
     }
     }
    Da stimmt was nicht.
    Und hier:
    Code:
    iFieldState[y*cyFieldCount+x] = !iFieldState[y*cyFieldCount+x];
    Ich probier noch weiter rum falls jemand was sieht:
    ----> POSTEN und bewertung absahnen oO

    mfg tobZel
     
  4. 31. Juli 2007
    AW: ungewöhnliches verhalten

    1. Du solltest nach dem Click ein InvalidateRect machen damit das Fenster neugezeichnet wird.
    2. Es gehen alle Felder, aber erst nachm 2. Click regt sich was
    3. Bei WM_DESTROY das "delete [] iFieldState;" raus, denn das erzeugt ne SPeicherverletzung aufm Heap.
     
  5. 31. Juli 2007
    AW: ungewöhnliches verhalten

    ich probiers gleich mal aus.
    zu 3. Wo soll ich es sonst hin tun? Ich muss den allozierten speicher doch wieder freigeben

    edit: funktioniert, aber in der 10 reihe(mit null angefangen) sind die felder 4-7(auch von null angefangen) von anfang an pink . Hast dus mal kompiliert? Wenn ja ist das bei dir auchso? Speicherreste könnens ja nicht sein, da ich ja ZeroMemory in WM_CREATE aufrufe.

    edit2: Ich habs ich muss bei ZeroMemory das ding mal 4nehmen, ein int ist 4bytes groß

    mfg tobZel
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.