Rote blinkende Punkte



  • Das Grundgerüst bietet doch wohl jede IDE, wenn man nen Win32 Projekt anlegt.



  • Habs fertig, hab meine GDI kennnisse mit einem ähnlichen erworben.
    Es ist zwar nicht das beste u. hat noch ne menge Bugs (sihe beim ändern der Fenstergroße). Ich schreib dir vieleicht mal wieder ein neues mit Kommentaren und mit wenigereren Fehlern.

    Lege mit V C++ 6.0 eine Win32 Anwendung an. --> leeres Projekt --> Ok.
    Projekt, dem Projekt hinzufügen --> Cpp Quellcode Datei --> Name am besten WinMain
    Code einfüpen, compilieren.

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    
    struct POSITION
    {
    	int x, y;
    };
    
    HWND static hWnd;
    HDC	 static hDC;
    
    HBRUSH hRed		= CreateSolidBrush(RGB(255, 0, 0));
    HBRUSH horange	= CreateSolidBrush(RGB(230, 180, 0));
    
    bool color = false;
    POSITION pos[20];
    
    int WINAPI WinMain(HINSTANCE hInstance, 
    				   HINSTANCE hPrevInstance, 
    				   LPSTR lpCmdLine, 
    				   int nShowCmd)
    {
    	MSG msg;
    
    	WNDCLASS WndClass;
    	memset(&WndClass, 0, sizeof(WNDCLASS));
    
    	WndClass.hbrBackground	= (HBRUSH) COLOR_BTNHIGHLIGHT;
    	WndClass.hInstance		= hInstance;
    	WndClass.lpszClassName	= "Fenster";
    	WndClass.lpfnWndProc	= WndProc;
    	WndClass.style			= CS_HREDRAW | CS_VREDRAW;
    
    	RegisterClass(&WndClass);
    
    	hWnd = CreateWindow("Fenster",
    						"Dein Programmname",
    						WS_OVERLAPPEDWINDOW,
    						0,
    						0,
    						640,
    						480,
    						NULL,
    						NULL,
    						hInstance,
    						NULL);
    
    	ShowWindow(hWnd, SW_SHOW);
    	UpdateWindow(hWnd);
    
    	while(GetMessage(&msg, 0, NULL, NULL))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	ReleaseDC(hWnd, hDC);
    	UnregisterClass("Fenster", hInstance);
    
    	return(msg.wParam);
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(Msg)
    	{
    	case WM_CREATE:
    		{
    			hDC = GetDC(hWnd);
    			SetTimer(hWnd, 0, 90, NULL);
    
    			for(int i = 0; i < 20; i ++)
    			{
    				pos[i].x = rand()%640;
    				pos[i].y = rand()%480;
    			}
    			break;
    		}
    	case WM_PAINT:
    		{
    			if(color)
    				SelectObject(hDC, hRed);
    			else
    				SelectObject(hDC, horange);
    
    			for(int i = 0; i < 20; i ++)
    			{
    				Ellipse(hDC, pos[i].x - 10, pos[i].y + 10, pos[i].x + 10, pos[i].y - 10);
    			}
    
    			ValidateRect(hWnd, NULL);
    			break;
    		}
    	case WM_TIMER:
    		if(color)
    			color = false;
    		else
    			color = true;
    		InvalidateRect(hWnd, NULL, 0);
    		break;
    	case WM_DESTROY:
    		KillTimer(hWnd, 0);
    		PostQuitMessage(0);
    		break;
    	default:
    		return(DefWindowProc(hWnd, Msg, wParam, lParam));
    	}
    
    	return(0);
    }
    

    Ich hoffe, es hat dir geholfen.



  • Ich habs erstmal nur mit einem Timer gemacht, Button kannst du ja später machen.
    Jedes Steuerelement (Button, Eingabefelt, Listbox) ist ein Fenster und du kannst sie mit CreateWindow in der WM_CREATE erzeugen.

    #define BUTTON1    1
    
    ...
    case WM_CREATE:
        ...
        CreateWindow("BUTTON",
                     "Drück mich",
                     BS_PUSHBUTTON | WS_VISIBLE | WS_CHILD,
                     10, 10, 80, 20,
                     hWnd,
                     (HMENU) BUTTON1,
                     GetModuleHandle(NULL),
                     NULL);
        ...
        break;
    case WM_COMMAND:
        if(wParam == BUTTON1)
          MessageBox(hWnd, "Du hast mich geklickt", "Meldung", MB_OK);
        break;
    ....
    


  • JCisDaBest schrieb:

    dann schreib mir gleich das ganze programm. danke im voraus!

    Das war irgendwer anderes. Werd mich wohl doch mal anmelden muessen.

    Big Thx an Tc++H habs zwar noch nicht ausprobiert aber werds gleich machen.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • @Tc++H
    ich hab leider nicht den V C++ 6.0 sondern nutze (siehe erster Post) wxDev-CPP.
    dort bekomme ich beim compilern folgende Fehler:

    52 C:\Dev-Cpp\WinMain.cpp [Warning] passing NULL used for non-pointer converting 3 of `BOOL GetMessageA(tagMSG*, HWND__*, UINT, UINT)'

    52 C:\Dev-Cpp\WinMain.cpp [Warning] passing NULL used for non-pointer converting 4 of `BOOL GetMessageA(tagMSG*, HWND__*, UINT, UINT)'

    52 C:\Dev-Cpp\WinMain.cpp cannot find -lwxmsw25

    52 C:\Dev-Cpp\WinMain.cpp ld returned 1 exit status

    kannst du damit was anfangen? oder jemand anderes?

    Falls du dir den wxDev-CPP mal angucken willst hier der Link http://wxdsgn.sourceforge.net/

    Big Thx nochmal



  • Sorry, ich kenne mich nur mit Visual C++ 6.0 aus. Der Compiler ist in vielen Büchern als Autorenversion enthalten, sie besitzt fast den vollen umfang.
    Du kannst ja mal im Compiler Forum nachfragen.



  • Aehm ...

    Tc++H schrieb:

    hDC = GetDC(hWnd);
    

    kannst Du in der Form nur machen, wenn Du vorher:

    WndClass.style = CS_CLASSDC /* <-- !!! */ | CS_HREDRAW | CS_VREDRAW;
    

    machst.

    Ansonsten hol Dir den Device Context in der WM_PAINT Behandlung, dafuer gibt's extra BeginPaint() und EndPaint().
    Dann brauchst Du auch kein ValidateRect().

    case WM_PAINT:
       {
          PAINTSTRUCT ps;
          hDC = BeginPaint( hWnd, &ps );
          if ( color )
             SelectObject(hDC, hRed);
          else
             SelectObject(hDC, horange);
          // ...
          EndPaint( hWnd, &ps );
       }
       break;
    

    EDIT: p.s: wenn Du kein BeginPaint()/EndPaint() verwendest, musst Du Dir ein Handle auf die Update Region besorgen, dann die ClipRegion auf die UpdateRegion setzen, und dann nach dem Zeichnen ValidateRgn() fuer die Update-Region aufrufen (und genau das machen BeginPaint() und EndPaint()).



  • @ Tc++H

    hab noch ne Autoren-Version von V C++ 6.0 bei mir gefunden. Programm funktioniert einwandfrei. Enthält zwar noch nicht alles was ich spaeter darin haben will, ist aber schon ein grosser Schritt nach vorn.

    Big Thx

    @PowerOff

    Davon versteh ich irgendwie garnix. Wie gesagt bin noch ziemlich neu.



  • JCisDaBest schrieb:

    Davon versteh ich irgendwie garnix. Wie gesagt bin noch ziemlich neu.

    War ja auch fuer Tc++H gedacht!



  • Ich lad dir bald ne Version mit Kommentaren hoch, ich brauchte auch ne ganze Weile un das API Zeugs zu verstehen. Du wolltest ja nur ein Gerüst haben.



  • Ich danke dir.
    Wie/wo hast du denn das API Zeug gelernt?





  • "Programmieren lernen für Teens mit C
    von Bernd Brügmann" war mein erstes Buch.
    Später hab ich mir OpenGL tutorials besorgt (3D Programmirerung).
    Da man aber für OpenGL ne ganze menge WinAPI Kenntnisse braucht, um Applications ohne glut zu erzeugen, besorgte ich mit Tutorials. Falls du eine Compilerhilfe von Borland oder Mirosoft besitzt, solltest du sie mal angucken.

    www.winapi.net
    www.c-plus-plus-archiv.de
    www.codeguru.net
    www.robsite.de





  • Danke fuer die vielen Links. Da hab ich ja mal wieder einiges zu lesen.



  • Falls du mal weiter bist, kannst du ja das ganze WinApi Zeugs, was du brauchst, in Klassen kappseln.
    Es wird dir dann auf jeden Fall ne ganze menge Arbeit abnehmen.



  • Bis ich weiter bin wirds denk ich mal noch was dauern. Hab z.Z. leider net so viel Zeit (Schülerpraktikum).



  • Kauf die Petzolds Buch. Alles andere ist rausgeworfenes Geld.



  • Steve Ballmer schrieb:

    Kauf die Petzolds Buch. Alles andere ist rausgeworfenes Geld.

    Bist du Bill Gates?


Anmelden zum Antworten