Problem mit WinProg

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Problem mit WinProg

Beitrag von Empire » Di Feb 16, 2010 7:29 pm

Tach
Ich wollte als übung das Prog Minesweeper schreiben.
So weit bin ich gekommen:

Code: Alles auswählen

#include <windows.h>
#include <time.h>

HWND    hWnd;
HWND    Feld[16][16];
HWND    Button[16][16];
HWND    Text;
HWND    Text2;

int     Minen[16][16];

LRESULT CALLBACK WindowProc (HWND hWnd, UINT message,
                             WPARAM wParam, LPARAM lParam);
                             
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpcmdline, int ncmdshow)
{
    WNDCLASSEX windowclass;
    MSG        message;
    
    const char szClassName[] = "MS";
    
    windowclass.cbSize = sizeof (WNDCLASSEX);
    windowclass.style = CS_HREDRAW | CS_VREDRAW;
    windowclass.lpfnWndProc = WindowProc;
    windowclass.cbClsExtra = 0;
    windowclass.cbWndExtra = 0;
    windowclass.hInstance = hInst;
    windowclass.hIcon =LoadIcon (NULL, IDI_APPLICATION);
    windowclass.hIconSm =LoadIcon (NULL, IDI_APPLICATION);
    windowclass.hCursor =LoadCursor (NULL, IDC_ARROW);
    windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;
    windowclass.lpszMenuName = NULL;
    windowclass.lpszClassName = szClassName;
    
    if(!RegisterClassEx (&windowclass))
       return (0);
    
    hWnd = CreateWindowEx(NULL,
                          szClassName,
                          "MS",
                          WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                          100, 100,
                          310, 310,
                          NULL,
                          NULL,
                          hInst,
                          NULL);
                          
    for(int runde; runde>15; runde++)
    {
        int X, Y;
        belegt:
        srand(time(0));
        X = 1+(rand() % (10-1));
        srand(time(0));
        Y = 1+(rand() % (10-1));
        if(Minen[X][Y]==0) 
        {
            Minen[X][Y]=9;
            if(Minen[X+1][Y-1]!=9) Minen[X+1][Y-1]= Minen[X-1][Y-1]+1;
            if(Minen[X+1][Y]!=9)   Minen[X+1][Y]=   Minen[X+1][Y]+1;
            if(Minen[X+1][Y+1]!=9) Minen[X+1][Y+1]= Minen[X+1][Y+1]+1;
            if(Minen[X][Y-1]!=9)   Minen[X][Y+1]=   Minen[X][Y+1]+1;
            if(Minen[X][Y-1]!=0)   Minen[X][Y-1]=   Minen[X][Y-1]+1;
            if(Minen[X-1][Y+1]!=0) Minen[X-1][Y+1]= Minen[X-1][Y+1]+1;
            if(Minen[X-1][Y]!=0)   Minen[X-1][Y]=   Minen[X-1][Y]+1;
            if(Minen[X-1][Y-1]!=0) Minen[X-1][Y-1]= Minen[X-1][Y-1]+1;
        }
        else goto belegt;
    }                      
    
    int ID = 1000;                                          
    int xk, yk;
    for(int x; x<16; x++)
    {
        for(int y; y<16; y++)
        {
            xk=((x-1)*19);
            yk=((y-1)*19);
            if(Minen[x][y]==0)
            {
                Feld[x][y] = CreateWindow("STATIC",
                                          " ",
                                          WS_BORDER | WS_VISIBLE | WS_CHILD | ES_CENTER,
                                          xk,yk,
                                          20, 20,
                                          hWnd,
                                          (HMENU) ID,
                                          hInst,
                                          NULL);
            }
            else if(Minen[x][y]==1)
            {
                Feld[x][y] = CreateWindow("STATIC",
                                          "1",
                                          WS_BORDER | WS_VISIBLE | WS_CHILD | ES_CENTER,
                                          xk,yk,
                                          20, 20,
                                          hWnd,
                                          (HMENU) ID,
                                          hInst,
                                          NULL);
            }
            else if(Minen[x][y]==2)
            {
                Feld[x][y] = CreateWindow("STATIC",
                                          "2",
                                          WS_BORDER | WS_VISIBLE | WS_CHILD | ES_CENTER,
                                          xk,yk,
                                          20, 20,
                                          hWnd,
                                          (HMENU) ID,
                                          hInst,
                                          NULL);
            }
            else if(Minen[x][y]==3)
            {
                Feld[x][y] = CreateWindow("STATIC",
                                          "3",
                                          WS_BORDER | WS_VISIBLE | WS_CHILD | ES_CENTER,
                                          xk,yk,
                                          20, 20,
                                          hWnd,
                                          (HMENU) ID,
                                          hInst,
                                          NULL);
            }
            else if(Minen[x][y]==4)
            {
                Feld[x][y] = CreateWindow("STATIC",
                                          "4",
                                          WS_BORDER | WS_VISIBLE | WS_CHILD | ES_CENTER,
                                          xk,yk,
                                          20, 20,
                                          hWnd,
                                          (HMENU) ID,
                                          hInst,
                                          NULL);
            }
            else if(Minen[x][y]==5)
            {
                Feld[x][y] = CreateWindow("STATIC",
                                          "5",
                                          WS_BORDER | WS_VISIBLE | WS_CHILD | ES_CENTER,
                                          xk,yk,
                                          20, 20,
                                          hWnd,
                                          (HMENU) ID,
                                          hInst,
                                          NULL);
            }
            else if(Minen[x][y]==6)
            {
                Feld[x][y] = CreateWindow("STATIC",
                                          "6",
                                          WS_BORDER | WS_VISIBLE | WS_CHILD | ES_CENTER,
                                          xk,yk,
                                          20, 20,
                                          hWnd,
                                          (HMENU) ID,
                                          hInst,
                                          NULL);
            }
            else if(Minen[x][y]==7)
            {
                Feld[x][y] = CreateWindow("STATIC",
                                          "7",
                                          WS_BORDER | WS_VISIBLE | WS_CHILD | ES_CENTER,
                                          xk,yk,
                                          20, 20,
                                          hWnd,
                                          (HMENU) ID,
                                          hInst,
                                          NULL);
            }
            else if(Minen[x][y]==8)
            {
                Feld[x][y] = CreateWindow("STATIC",
                                          "8",
                                          WS_BORDER | WS_VISIBLE | WS_CHILD | ES_CENTER,
                                          xk,yk,
                                          20, 20,
                                          hWnd,
                                          (HMENU) ID,
                                          hInst,
                                          NULL);
            }
            else if(Minen[x][y]==9)
            {
                Feld[x][y] = CreateWindow("STATIC",
                                          "M",
                                          WS_BORDER | WS_VISIBLE | WS_CHILD | ES_CENTER,
                                          xk,yk,
                                          20, 20,
                                          hWnd,
                                          (HMENU) ID,
                                          hInst,
                                          NULL);
            }
            ID++;
        }
        ID++;
    }
    
    for(int x; x<16; x++)
    {
        for(int y; y<16; y++)
        {
            xk=((x-1)*19);
            yk=((y-1)*19);
            Button[x][y] = CreateWindow("Button",
                                        "",
                                        BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                                        xk, yk,
                                        20, 20,
                                        hWnd,
                                        (HMENU) ID,
                                        hInst,
                                        NULL);
            ID++;
        }
        ID++;
    }
            
    if(hWnd == NULL)
       return (0);
    
    while (GetMessage (&message, NULL, 0, 0))
    {
          TranslateMessage (&message);
          DispatchMessage (&message);
    }
    
    return (int)(message.wParam);
}

LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
         case WM_DESTROY:
              {
                         PostQuitMessage(0);
                         return (0);
              }
         case WM_KEYDOWN:
              {
                         switch(wParam)
                         {
                                case VK_ESCAPE:
                                     {
                                               PostQuitMessage (0);
                                               return (0);
                                     }
                         }
              }
              break;
         case WM_COMMAND:
              {
                         switch(wParam)
                         {
                         }
                         return (0);
              }
    }
    return (DefWindowProc (hWnd, message, wParam, lParam));
} 
So es kommen zwar keine Errors aber wenn ich es ausführe erscheint nur ein Leres Fenster mit der nerfigen Sanduhr!
kann mir jemand helfen??

mfg
Empire

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Problem mit WinProg

Beitrag von cloidnerux » Di Feb 16, 2010 8:40 pm

Hast du auch die Buttons, bzw Labels oder was auch immer angelegt?
Wierso nutzt du die WinAPI, wxWidgets, gtk+ oder QT sind egt noch einfacher für sowas als die WinAPI an sich.
Außerdem soltest du deine Oberfläche in einem resourcen Designer erstellen und über eine Resourcendatei dann die Oberfläche erstellen, nicht direkt im Code, das ist immer umständlich.
Außerdem solltest du ein Teil deines Codes aus der WinMain Kapseln, da es für mich nur sehr schwierig ist, mich in deinen Code einzuarbeiten.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Problem mit WinProg

Beitrag von Empire » Di Feb 16, 2010 8:51 pm

Ich kann seit Samstag WinProgs schreiben und verstehe kein Wort von dem was du mir sagen willst.
Bitte nochmal für welche mit geistigem Kurtzschluss.

Kannst du mir einen resourcen Designer Empfelen??

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Problem mit WinProg

Beitrag von cloidnerux » Di Feb 16, 2010 9:34 pm

Kannst du mir einen resourcen Designer Empfelen??
Nein, denn ich habe es jedesmal aufgegeben mit WinAPI zu arbeiten, wenn ich anfangen wollte.
Ich kann seit Samstag WinProgs schreiben
Das heißt, du Programmierst seit 4 Tagen mit der WinAPI->Direkte Schnittstelle zu Windows und GDI
Das bedeutet aber auch, das du jegliches Steuerelement erst erstellen musst, bevor du es nutzen kannst.
Bibilotheken wie wxWidgets, GTK+ oder QT abstrahieren das für dich und ermöglichen dir einfache Programmierung, da du dich nicht um jeden scheiß kümmern musst.
Außerdem soltest du deine Oberfläche in einem resourcen Designer erstellen und über eine Resourcendatei dann die Oberfläche erstellen, nicht direkt im Code, das ist immer umständlich.
Du kannst entweder alle Steuerlemente direkt im Code generieren und damit den Codeaufwand dafür tragen, oder dir ein Menü mit einem dafür geiegneten Designer erstellen und als *.rc speichern, diese dann mit einem speziellen Tool zu einer Objektdatei compilieren, die du dann einfach hinzu linkst, das wurde auch hier erwähnt. Damit sparst du dir den Code und musst nicht 100 Zeilen code zu verändern, nur weil du etwas hinzuzufügen willst.
Außerdem solltest du ein Teil deines Codes aus der WinMain Kapseln, da es für mich nur sehr schwierig ist, mich in deinen Code einzuarbeiten.
Du Schreibst fast all deinen Code in die WinMain. Das ist nicht Verboten, aber schwer zu lesen. Wenn du diesen Code in Funktionen kapselst, dann hast du besseren Überblick was geschieht und wo Fehler liegen können.

P.S: Ressourcen Editor(Nicht Getestet):http://radasm.cherrytree.at/resed/
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Problem mit WinProg

Beitrag von Xin » Di Feb 16, 2010 11:29 pm

Empire hat geschrieben:Ich kann seit Samstag WinProgs schreiben und verstehe kein Wort von dem was du mir sagen willst.
Bitte nochmal für welche mit geistigem Kurtzschluss.
"Probleme mit WinProg".
Glaub mir, wenn Du die WinAPI direkt programmierst und Probleme hast, dann hast Du alles richtig gemacht.
Es gibt schlimmeres als die WinAPI, aber das muss auf schlechten Stil optimiert sein.

Wenn Du programmieren lernen möchtest, so rate ich Dir von der WinAPI nicht ab, Du kannst da viel lernen. Wertfrei. Gutes wie schlechtes. Wenn Du aber guten Stil lernen möchtest, dann ist die WinAPI ungefähr das letzte, womit Du Dich beschäftigen solltest. Das Gute wirst Du vermutlich nichtmals erkennen.

Schau Dir wxWidgets an. Das ist auch WinAPI, aber portabel und sauberer.
Ansonsten gucke ich morgen mal, ob ich Zeit finde, das zu debuggen.

Da schreibst von einer Sanduhr und das Programm steht. Also wirst Du vermutlich eine Endlosschleife geschrieben haben?
Empire hat geschrieben:Kannst du mir einen resourcen Designer Empfelen??
Wenn Du schon selbst Hand anlegst, dann mach es auch richtig und lass den Resoucenquatsch weg.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Empire
Beiträge: 272
Registriert: Mo Jan 26, 2009 5:36 pm

Re: Problem mit WinProg

Beitrag von Empire » Do Feb 18, 2010 10:58 am

Thx
Ich werde mal eure Vorschläge mal googlen und schauen was mich am meisten anspricht.

Trotdem fände ich interessant zu wissen was jetzteigendlich falsch war

mfg
Empire

Antworten