Hilfe bei Studienarbeit



  • Hallo Michael,

    ihr müßt doch irgendein GUI-Framework verwenden, denn ansonsten dauert alleine die Einarbeitung in eine bestimmte Library Tage oder sogar Wochen.

    Oder wie stellt sich dein Professor sonst die Umsetzung vor (direkt mit der WinAPI???)?

    Welche Entwicklungsumgebung bzw. welchen Compiler verwendest du denn?



  • Th69 schrieb:

    Hallo Michael,

    ihr müßt doch irgendein GUI-Framework verwenden, denn ansonsten dauert alleine die Einarbeitung in eine bestimmte Library Tage oder sogar Wochen.

    Oder wie stellt sich dein Professor sonst die Umsetzung vor (direkt mit der WinAPI???)?

    Welche Entwicklungsumgebung bzw. welchen Compiler verwendest du denn?

    Hallo Th69,

    wir verwenden den Compiler lcc-win32. Die *.rc- bzw. die *.h-Datei habe ich mit Wordpad bearbeitet. Ich vermute das soll so sein, so dass wir wirklich die Basics verstehen - ob das nun sinnvoll ist oder nicht, kann ich nicht entscheiden.

    Zum Weg (Tools) der Umsetzung kann ich nicht viel sagen. Ich kann mal die *.c-Datei posten, die ein Studienkollege in seinem Projekt gebastelt hat:

    /*@@ Wedit generated application. Written Wed Nov 12 09:25:05 2008
     @@header: f:\strassenplanungres.h
     @@resources: f:\strassenplanung.rc
     Do not edit outside the indicated areas */
    /*<---------------------------------------------------------------------->*/
    /*<---------------------------------------------------------------------->*/
    #include <windows.h>
    #include <windowsx.h>
    #include <commctrl.h>
    #include <string.h>
    #include "strassenplanungres.h"
    #include "Prototypen.h"
    
    /*<---------------------------------------------------------------------->*/
    HINSTANCE hInst;		// Instance handle
    HWND hwndMain;		//Main window handle
    
    LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
    /* --- The following code comes from D:\Programme\LCC\lib\wizard\statbar.tpl. */
    
    // Global Variables for the status bar control.
    
    HWND  hWndStatusbar;
    
    /*------------------------------------------------------------------------
     Procedure:     UpdateStatusBar ID:1
     Purpose:       Updates the statusbar control with the appropiate
                    text
     Input:         lpszStatusString: Charactar string that will be shown
                    partNumber: index of the status bar part number.
                    displayFlags: Decoration flags
     Output:        none
     Errors:        none
    
    ------------------------------------------------------------------------*/
    void UpdateStatusBar(LPSTR lpszStatusString, WORD partNumber, WORD displayFlags)
    {
        SendMessage(hWndStatusbar,
                    SB_SETTEXT,
                    partNumber | displayFlags,
                    (LPARAM)lpszStatusString);
    }
    
    /*------------------------------------------------------------------------
     Procedure:     MsgMenuSelect ID:1
     Purpose:       Shows in the status bar a descriptive explaation of
                    the purpose of each menu item.The message
                    WM_MENUSELECT is sent when the user starts browsing
                    the menu for each menu item where the mouse passes.
     Input:         Standard windows.
     Output:        The string from the resources string table is shown
     Errors:        If the string is not found nothing will be shown.
    ------------------------------------------------------------------------*/
    LRESULT MsgMenuSelect(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
    {
        static char szBuffer[256];
        UINT   nStringID = 0;
        UINT   fuFlags = GET_WM_MENUSELECT_FLAGS(wparam, lparam) & 0xffff;
        UINT   uCmd    = GET_WM_MENUSELECT_CMD(wparam, lparam);
        HMENU  hMenu   = GET_WM_MENUSELECT_HMENU(wparam, lparam);
    
        szBuffer[0] = 0;                            // First reset the buffer
        if (fuFlags == 0xffff && hMenu == NULL)     // Menu has been closed
            nStringID = 0;
    
        else if (fuFlags & MFT_SEPARATOR)           // Ignore separators
            nStringID = 0;
    
        else if (fuFlags & MF_POPUP)                // Popup menu
        {
            if (fuFlags & MF_SYSMENU)               // System menu
                nStringID = IDS_SYSMENU;
            else
                // Get string ID for popup menu from idPopup array.
                nStringID = 0;
        }  // for MF_POPUP
        else                                        // Must be a command item
            nStringID = uCmd;                       // String ID == Command ID
    
        // Load the string if we have an ID
        if (0 != nStringID)
            LoadString(hInst, nStringID, szBuffer, sizeof(szBuffer));
        // Finally... send the string to the status bar
        UpdateStatusBar(szBuffer, 0, 0);
        return 0;
    }
    
    /*------------------------------------------------------------------------
     Procedure:     InitializeStatusBar ID:1
     Purpose:       Initialize the status bar
     Input:         hwndParent: the parent window
                    nrOfParts: The status bar can contain more than one
                    part. What is difficult, is to figure out how this
                    should be drawn. So, for the time being only one is
                    being used...
     Output:        The status bar is created
     Errors:
    ------------------------------------------------------------------------*/
    void InitializeStatusBar(HWND hwndParent,int nrOfParts)
    {
        const int cSpaceInBetween = 8;
        int   ptArray[40];   // Array defining the number of parts/sections
        RECT  rect;
        HDC   hDC;
    
       /* * Fill in the ptArray...  */
    
        hDC = GetDC(hwndParent);
        GetClientRect(hwndParent, &rect);
    
        ptArray[nrOfParts-1] = rect.right;
        //---TODO--- Add code to calculate the size of each part of the status
        // bar here.
    
        ReleaseDC(hwndParent, hDC);
        SendMessage(hWndStatusbar,
                    SB_SETPARTS,
                    nrOfParts,
                    (LPARAM)(LPINT)ptArray);
    
        UpdateStatusBar("Ready", 0, 0);
        //---TODO--- Add code to update all fields of the status bar here.
        // As an example, look at the calls commented out below.
    
    //    UpdateStatusBar("Cursor Pos:", 1, SBT_POPOUT);
    //    UpdateStatusBar("Time:", 3, SBT_POPOUT);
    }
    
    /*------------------------------------------------------------------------
     Procedure:     CreateSBar ID:1
     Purpose:       Calls CreateStatusWindow to create the status bar
     Input:         hwndParent: the parent window
                    initial text: the initial contents of the status bar
     Output:
     Errors:
    ------------------------------------------------------------------------*/
    static BOOL CreateSBar(HWND hwndParent,char *initialText,int nrOfParts)
    {
        hWndStatusbar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER|SBARS_SIZEGRIP,
                                           initialText,
                                           hwndParent,
                                           IDM_STATUSBAR);
        if(hWndStatusbar)
        {
            InitializeStatusBar(hwndParent,nrOfParts);
            return TRUE;
        }
    
        return FALSE;
    }
    
    /*<---------------------------------------------------------------------->*/
    /*@@0->@@*/
    static BOOL InitApplication(void)
    {
    	WNDCLASS wc;
    
    	memset(&wc,0,sizeof(WNDCLASS));
    	wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS ;
    	wc.lpfnWndProc = (WNDPROC)MainWndProc;
    	wc.hInstance = hInst;
    	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    	wc.lpszClassName = "strassenplanungWndClass";
    	wc.lpszMenuName = MAKEINTRESOURCE(IDMAINMENU);
    	wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    	wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    	if (!RegisterClass(&wc))
    		return 0;
    /*@@0<-@@*/
    	// ---TODO--- Call module specific initialization routines here
    
    	return 1;
    }
    
    /*<---------------------------------------------------------------------->*/
    /*@@1->@@*/
    HWND CreatestrassenplanungWndClassWnd(void)
    {
    	return CreateWindow("strassenplanungWndClass","strassenplanung",
    		WS_MINIMIZEBOX|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME,
    		CW_USEDEFAULT,0,CW_USEDEFAULT,0,
    		NULL,
    		NULL,
    		hInst,
    		NULL);
    }
    /*@@1<-@@*/
    /*<---------------------------------------------------------------------->*/
    /* --- The following code comes from D:\Programme\LCC\lib\wizard\defOnCmd.tpl. */
    void MainWndProc_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
    {
    	switch(id) {
    		// ---TODO--- Add new menu commands here
    		/*@@NEWCOMMANDS@@*/
    		case IDM_EXIT:
    		PostMessage(hwnd,WM_CLOSE,0,0);
    		break;
    
    		case strassenplanung:
    
    					linie_zeichnen(hwnd);
    
    		break;
    	}
    }
    
    /*<---------------------------------------------------------------------->*/
    /*@@2->@@*/
    LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    	switch (msg) {
    /*@@3->@@*/
    	case WM_SIZE:
    		SendMessage(hWndStatusbar,msg,wParam,lParam);
    		InitializeStatusBar(hWndStatusbar,1);
    		break;
    	case WM_MENUSELECT:
    		return MsgMenuSelect(hwnd,msg,wParam,lParam);
    	case WM_COMMAND:
    		HANDLE_WM_COMMAND(hwnd,wParam,lParam,MainWndProc_OnCommand);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hwnd,msg,wParam,lParam);
    	}
    /*@@3<-@@*/
    	return 0;
    }
    /*@@2<-@@*/
    
    /*<---------------------------------------------------------------------->*/
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
    {
    	MSG msg;
    	HANDLE hAccelTable;
    
    	hInst = hInstance;
    	if (!InitApplication())
    		return 0;
    	hAccelTable = LoadAccelerators(hInst,MAKEINTRESOURCE(IDACCEL));
    	if ((hwndMain = CreatestrassenplanungWndClassWnd()) == (HWND)0)
    		return 0;
    	CreateSBar(hwndMain,"Ready",1);
    	ShowWindow(hwndMain,SW_SHOW);
    	while (GetMessage(&msg,NULL,0,0)) {
    		if (!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)) {
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    	return msg.wParam;
    }
    

    Ich hoffe daraus gehen die Informationen hervor.

    Danke für eure Mühe
    Michael



  • Hallo

    Und verstehst gar nihts vom code? Na dann viel Spaß.

    chrische



  • Darfst du dir die Sprache denn aussuchen? Falls ja nimm einfach BlitzBasic.
    http://de.wikipedia.org/wiki/Blitz_Basic
    Damit brauchst du ca. 50 Zeilen für das Spiel.



  • @chrische5: Das habe ich nie gesagt. Für mich ist jedoch die Programmierung unter Windows neu. In meinem ersten Projekt habe ich in der Konsole Berechnungen zur Binominalverteilung durchgeführt.
    Ich habe mich jetzt damit abgefunden mich am Mo. mit Büchern einzudecken und dann anzugreifen.
    Leider sind meiner Erfahrung nach in vielen Foren Leute vertreten, die weniger an der Lösung des Problems sondern ehr an der Erörterung irgendwelcher Missstände interessiert sind - das geht jetzt ausdrücklich NICHT nur an dich.

    @Fusel.Faktor: Leider muss es C sein. Jedoch hört sich BlitzBasic laut der Wiki-Beschreibung interessant an. Danke für den Tipp.

    Grüße
    Michael


  • Administrator

    @Michael aus Stuttgart,
    Ich hoffe du hast trotz allem mal SFML angeschaut? Es hat eine C Schnittstelle dabei, welche sehr einfach gehalten ist. Hier nochmals den Link:
    http://www.sfml-dev.org/

    Damit solltest du in der Lage sein die graphische Ausgabe schnell und einfach hinzubekommen, ohne dich in die doch relative mühsame WinAPI einzuarbeiten. Oder die Alternative ist noch SDL, sie ist aber ein wenig älter und langsamer als SFML. Allerdings ist die SDL komplett in C geschrieben und vielleicht daher besser für ein C Programm geeignet, aber da wäre ich überfragt, da ich mit der SDL noch nie gearbeitet habe.

    Wenn du konkrete Fragen zur Spieleprogrammierung hast, dann wären diese Foren noch Anlauforte:
    http://www.c-plusplus.net/forum/viewforum-var-f-is-7.html
    http://www.spieleprogrammierer.de/phpBB2/

    Vielleicht gibt es da über die Forensuche noch ein paar gute Büchertipps zur Spieleprogrammierung in C zu finden.

    Grüssli



  • Michael aus Stuttgart schrieb:

    Leider sind meiner Erfahrung nach in vielen Foren Leute vertreten, die weniger an der Lösung des Problems sondern ehr an der Erörterung irgendwelcher Missstände interessiert sind - das geht jetzt ausdrücklich NICHT nur an dich.

    Hör mal, Kollege. DU bist an einer Lösung interessiert, nicht die Leute im Forum. Wenn Du Hilfe brauchst, dann frag ganz konkret. Die Leute sind hilfsbereit, aber ich sehe bisher keine Frage auf die man Antworten könnte ohne Dir vorher das Programmieren beibringen zu müssen. Einige Hinweise kamen ja bereits.

    Eine Studienarbeit sollte in eigenständiger Arbeit durchgeführt. Falls Du andere Fragen hast als "Ich muss für meine Studienarbeit ein Spiel programmieren. Wie mache ich das?", dann immer her damit.



  • Hallo

    Wenn du eine ganze Latte Code hinknallst ohne zu diesem eine konkrete Frage zu stellen oder eine Anmerkung zu machen, sieht es für mich so aus, als wenn du wie ein Schwein ins Uhrwerk schaust. Was ich bei WinAPI-Code sehr gut verstehen könnte. Das war gar nicht beleidigend gemeint, aber was erwartest du? Ein paar Tipps hast du bekommen, aber das wärst du mit google schneller dran gewesen.

    chrische



  • Dravere schrieb:

    @Michael aus Stuttgart,
    Ich hoffe du hast trotz allem mal SFML angeschaut? Es hat eine C Schnittstelle dabei, welche sehr einfach gehalten ist. Hier nochmals den Link:
    http://www.sfml-dev.org/

    Damit solltest du in der Lage sein die graphische Ausgabe schnell und einfach hinzubekommen, ohne dich in die doch relative mühsame WinAPI einzuarbeiten. Oder die Alternative ist noch SDL, sie ist aber ein wenig älter und langsamer als SFML. Allerdings ist die SDL komplett in C geschrieben und vielleicht daher besser für ein C Programm geeignet, aber da wäre ich überfragt, da ich mit der SDL noch nie gearbeitet habe.

    Wenn du konkrete Fragen zur Spieleprogrammierung hast, dann wären diese Foren noch Anlauforte:
    http://www.c-plusplus.net/forum/viewforum-var-f-is-7.html
    http://www.spieleprogrammierer.de/phpBB2/

    Vielleicht gibt es da über die Forensuche noch ein paar gute Büchertipps zur Spieleprogrammierung in C zu finden.

    Grüssli

    Danke für deine Hilfe. Morgen gehts damit los 🙂

    Grüße
    Michael



  • Naja ok ein kleines WinAPI//C -> GUI hast ja jetzt.. jetzt kannst ein bald ja schon mal eine Pixel (Ball) malen an irgend einer X/Y koordinate im fenster^^ Da rein zeichen Stichwort: WM_PAINT SetPixel


Anmelden zum Antworten