Grafisch aufgezeigtes verhalten eines Kondensators(AC/DC) C++/WinApi/DX9



  • Echtzeit = animation

    also das ich die Kapazität oder wasauchimmer ändere und ich das halbwegsflimmerfrei auf dem Bildschrim sehe



  • hosti schrieb:

    genau,

    bei meinen GDI versuchen hatte ich oftmals ein arges flimmern.
    Kann man das mit einem "Backpuffer" irgendwie verhindern?

    Dazu kann ich nicht viel sagen, da ich deinen Zeichenalgorithmus nicht kenne.
    Aber bestimmt lässt sich da einiges ändern.
    Z.b nicht immer die ganze Zeichnung neu zeichnen, wenn nur ein Teil des Bildes von einem Fenster verdeckt war.Oder du nutzt einen Privat DC.
    Oder du erstellst dir eine Off-Screen-Bitmap ,zeichnest darein, und blittest die dann immer.
    Also schau dir am Besten nochmal deine Zeichenroutine an, wann und wieoft sie aufgerufen wird.Bestimmt lässt sich da noch einiges verbessern.Und sei experimentierfreudig 😉



  • Meine Ausgabe ist ja ähnlich einer kurve.
    Also werde ich wohl immer das ganze Grafikfenster aktualisieren müssen.
    Wodurch das flimmern entstehen würde, anderseits ist es ja keine schnelle bewegung sondern kurze Wertänderungen und anschliessende neue ausgabe.
    ALso werde ich vermutlich noch nicht mal ein flimmern haben,

    Weiss das grad jemand,
    Muss ich die Linien(kurven) mit getpixel und Algo zeichnen oder gibts da neh funktion?





  • 😮 , wow.
    Vielen dank, scheint sehr genau das zu sein was ich suche



  • Wie würdet ihr das eigentlich realisieren??
    Als Dialog anwendung oder ein normales Fenster mit Dialogen(Buttons) vollgestopft?



  • Na wenn du ganz korrekt bist, machst du ein großes Rahmenfenster und realisierst die Eingabe über Steuerleisten.Natürlich beliebig ab und andockbar.
    Die Ausgabe erfolgt dann in frei anordbaren Childfenstern, deren Ansichtsmodi über das Menü beeinflusst werden.

    Nagut, das ist warscheinlich etwas viel für den Anfang.Eigentlich unmenschlich, das über pure WinApi realisieren zu wollen.
    Mach am Besten nur ein Fenster, und lasse den Einstelldialog(modal) dann über ein Menü aufrufen.Und zeichne dann in den Clientbereich des Fensters.
    Lese vorher dessen Größe aus, und passe den Graphen dann entsprechend an.
    Wenn du das dann hast, bist du schon recht weit gekommen.



  • Ich möcht gerne ein Titelmenu,

    auf der linken seite buttons und eingabefelder(Kapazitäten, zeiten, Spannungen...) und paar regler, und dann links daneben Das Grafische ausgabefenster (ca.2/3 vertikal gesehen) irgendwie so hab ich mir das gedacht



  • Dieser Thread wurde von Moderator/in Korbinian aus dem Forum Projekte in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • Nur so als frage, was macht mein Thread hier??
    Ist doch ein von mir gestartete Projekt... 😕



  • hosti schrieb:

    Nur so als frage, was macht mein Thread hier??
    Ist doch ein von mir gestartete Projekt... 😕

    *g* ja, aber es ist dein höchstpersönliches Projekt, und du stellst ja kein Team dafür auf.
    Sei schonmal darauf gefasst, dass der Thread auch noch in C++ oder WinApi geschoben wird. 🤡

    Zu deinem Layout: du möchtest also links am Rand eine Steuerleiste und davon dann links deinen Graphen?
    Und wozu brauchst du dann noch ein Fenster ? 😉



  • Oh ach so, naja ins WInapi gehörts in dem falle ja.

    Ich möchte die Grafische ausgeabe nicht einfach ins Fenster zeichnen sondern ähnlich wie ein texteditor ein "optisch" in die tiefe versetztes pseudo fenster..

    Ich hoffe du verstehst was ich meine



  • Ja, ich verstehe, was du meinst.
    Entweder du erstellst ein Childwindow mit WS_BORDER,
    oder du erstellst ein Controll, indem du als Klasse "Static" übergibst, bei der CreateWindowEx.



  • Ich denke ich werd es mit dem child realisieren,

    schön wäre wenn der ganze rest dann grau wäre wie die buttons oder die menu leiste



  • @MOD
    bitte nach WINapi verschieben. dankeschön

    hGrafik = CreateWindow("Ausgabe", NULL, WS_CHILD | WS_VISIBLE |
    									   WS_DLGFRAME , 230, 20, 760, 650, hwnd,
    									   (HMENU) 2, hInstGlobal, NULL);
    

    Die idee war damit das grafische ausgabe fenster zu erstellen.
    Was muss ich den dort wo ich Ausgabe habe angeben??
    Und wie lasse ich das anzegen?? das child meine ich
    Mit Static bin ich nicht ganz zufrieden da es mir entgegen kommt, ich hätte es gerne versenkt



  • Ne, das haut so nicht hin!

    1. Nimm lieber einheitlich CreateWindowEx.So kommst du nicht durcheinander und du hast mehr Einfluss.

    2. Nimm statt "Anzeige" am Besten als Klassenbezeichner "Static".So brauchst du nicht extra manuell eine Klasse und Nachrichtenprozedur fuer das Childfenster registrieren, denn er ist von Windows schon voreingestellt.
    Mein WinApi Wissen ist ein bissl eingerostet, aber soweit ich mich entsinne, werden dessen Nachrichten an die WndProc vom Parent durchgeleitet.

    3. WS_DLGFRAME gefällt mir gar nicht. Das wiederspricht sich mit dem Ziel, das Fenster als eingebettetes Objekt zu erstellen. Nimm "WS_BORDER"!

    Anzeigen müsste er das von selber, da du ja WS_VISIBLE angegeben hast.

    Edit: Das Static dir entgegenkommt, das kann man ändern.
    Spiel einfach mit den Windowstyles rum, heisst irgendetwas mit ClientEdge oder
    SunkenEdge oder WS_BORDER oder so ähnlich.Auf jeden Fall nicht WS_DLGFRAME oder WS_THICKFRAME.



  • Ja, BORDER ist schon schöner.

    Komisch ist, wenn ich es kompiliere und starte hab ich nur das Parent fenster.
    dan beende ich das prog und starte es nochmals und alles wird korrekt angezeigt..komisch(VC6.0)

    Was genau heisst den static?? Aus der MSdn werde ich nicht befriedigend schlau
    PS: benutzt du eigentlich einen Messenger? 🤡



  • Ne Sorry, habe keinen Messanger und muss mich jetzt auch langsam eigenen Aufgaben widmen 😉 , frag aber ruhig...

    MSDN ist gar nichtmal so verkehrt, eigentlich steht alles drin, die Themen sind bloss schrecklich unlogisch verlinkt. Deswegen immer schön nach Stichworten suchen.

    Hier hast du z.B. noch ein paar Windowstylen speziell für Staticcontrol
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/staticcontrols/staticcontrolreference/staticcontrolstyles.asp
    besonders SS_ETCHEDFRAME sollte was für dich sein.

    Static heisst, dass es so aussieht wie ein Label, also dem Benutzer signalisiert, dass er dort keine Eingaben zu machen hat.Etwa durch einen blinkenden Cursor.

    Dein Problem klingt irgendwie nach Durcheinander im MessageLoop.Oder du erzwingst das Anzeigen mit ShowWindow(hWnd,SW_SHOW);



  • Eigentlich wollt ichs ja hochladen aber mein Webspace spinnt

    #include <windows.h>
    
    LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
    
    HINSTANCE hInstGlobal;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static char szAppName[] = "Name" ;
    
    	 HWND        hwnd ;
         MSG         msg ;
    
    	 hInstGlobal = hInstance;
    
    	 int cx = GetSystemMetrics( SM_CXSCREEN );
    	 int cy = GetSystemMetrics( SM_CYSCREEN );
    
         WNDCLASS  wc ;
         wc.style         = CS_HREDRAW | CS_VREDRAW;
    	 wc.lpfnWndProc   = WndProc;
    	 wc.cbClsExtra    = 0;
    	 wc.cbWndExtra    = 0;
    	 wc.hInstance     = hInstance;
    	 wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION);
    	 wc.hCursor       = LoadCursor (NULL, IDC_ARROW);
    	 wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    	 wc.lpszMenuName  = NULL;
    	 wc.lpszClassName = szAppName;
    	 RegisterClass (&wc);
    
    	 hwnd = CreateWindow (szAppName, "Kondensator", 
    						  WS_OVERLAPPEDWINDOW | WS_MAXIMIZE , 0, 
    						  0, cx, cy,
    						  NULL, NULL, hInstance, NULL) ;	
    
    	 ShowWindow (hwnd, iCmdShow) ;
    	 UpdateWindow (hwnd) ;
    
         while (GetMessage (&msg, NULL, 0, 0))
              {
    		    TranslateMessage (&msg) ;
    		    DispatchMessage (&msg) ;
              }
    	 return msg.wParam ;
    }
    
    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
    	static HBRUSH hBrush;
        switch (iMsg)
              {
    		  case WM_CREATE :
    			  HWND hbutton;
    			  HWND hGrafik;
    
    			  hBrush = (HBRUSH) CreateSolidBrush (RGB ( 0, 0, 0)); 
    
    			  hbutton = CreateWindow("Button", "Exit, später Buttons und so..", WS_CHILD | WS_VISIBLE |
    									  BS_PUSHBUTTON, 20, 20, 200, 650, hwnd, 
    									  (HMENU) 1, hInstGlobal, NULL);
    
    			  hGrafik = CreateWindowEx(WS_EX_STATICEDGE, "STATIC", NULL, WS_CHILD | WS_VISIBLE |
    									   WS_BORDER , 230, 20, 760, 650, hwnd,
    									   (HMENU) 2, hInstGlobal, NULL);
    		  case WM_CTLCOLORSTATIC:
    			  SetBkMode ((HDC) wParam, TRANSPARENT);
    		      return (LONG) hBrush; 
    
    		  case WM_COMMAND:
    			  if(HIWORD(wParam) == BN_CLICKED)
    			  {
    				  if (LOWORD(wParam == 1))
    				  {
    					  SendMessage(GetParent(HWND(lParam)), WM_DESTROY, 0,0);
    				  }
    
    			  }
    
    			  return 0;
    
    		  case WM_PAINT :
    
    			   return 0 ;
    
    		 case WM_DESTROY :
    			   DeleteObject (hBrush); 
    			   PostQuitMessage (0) ;
                   return 0 ;
              }
    
         return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
    

    Was hälts du davon?? und erkennst du vieleicht mein Fenster prob?



  • Naja, also bei mir (VC.net 7.1 @ WinXP) gibt es dein Problem nicht.
    Ich finde aber dieses maximierte Fenster unästhetisch. 😉

    Schau dir mal dein case WM_CREATE an.
    Nach abarbeitung fällt er schnurstracks durch case WM_CTLCOLORSTATIC: .
    Wenn ich mich recht entsinne, sollte man jedes case mit

    return DefWndProc(***);
    

    beenden, weil Windows selber ja auch noch die Nachrichten auswerten muss.
    Gerade bei einem frisch erstellten Fenster ist das ja wichtig.

    Dann rate ich dir, dir gleich anzugewöhnen einheitlich CreateWindowEx zu nehmen, sonst kommst du nachher irgendwann durcheinander mit den RegisterClass und RegisterClassEx.

    Ersetze WS_BORDER bei dem Static mal mit SS_ETCHEDFRAME.


Anmelden zum Antworten