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



  • 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.



  • danke erstmals

    SS_ETCHEDFRAME, wenn ich das verwende ist es leider nicht mehr schwarz
    Und da hab ich ein return 0 vergessen.

    Was gefällt dir am Maximierten fenster nicht? lieber kleiner wählen oder nicht maximieren?

    LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
    	char acdc[3] = "Ac";
    
    	switch (iMsg)
              {
    		  case WM_CREATE :
    			  HWND hAc;
    			  HWND hDc;
    			  HWND hText;
    			  HWND hGrafik;
    
    			  hAc = CreateWindow("Button", "AC", WS_CHILD | WS_VISIBLE |
    									  BS_AUTORADIOBUTTON, 20, 20, 40, 40, hwnd, 
    									  (HMENU) 12, hInstGlobal, NULL);
    
    			  hDc = CreateWindow("Button", "DC", WS_CHILD | WS_VISIBLE |
    									  BS_AUTORADIOBUTTON | BS_RIGHTBUTTON, 60, 20, 40, 40, hwnd, 
    									  (HMENU) 11, hInstGlobal, NULL);
    
    			  hText = CreateWindowEx(WS_EX_STATICEDGE, "STATIC", NULL, WS_CHILD | WS_VISIBLE |
    									   SS_ETCHEDFRAME , 490, 20, 510, 150, hwnd,
    									   (HMENU) 2, hInstGlobal, NULL);
    
    			  hGrafik = CreateWindowEx(WS_EX_STATICEDGE, "STATIC", NULL, WS_CHILD | WS_VISIBLE |
    									   SS_ETCHEDFRAME , 230, 200, 770, 490, hwnd,
    									   (HMENU) 1, hInstGlobal, NULL);
    
    			  return 0;
    
    		  case WM_COMMAND:
    			  if(HIWORD(wParam) == BN_CLICKED)
    			  {
    				  if (LOWORD(wParam == 11))
    				  {
    
    				  }
    				  if (LOWORD(wParam == 12))
    				  {
    					  UpdateWindow(hText);
    				  }
    				  if (LOWORD(wParam == 3))
    				  {
    
    				  }
    
    			  }
    
    			  return 0;
    
    		  case WM_PAINT :
    			  HDC hdc;
    			  PAINTSTRUCT ps;
    
    			  hdc = BeginPaint(hText, &ps);
    			  TextOut(hdc, 20, 25, acdc, 5);
    			  EndPaint(hText, &ps);
    			  return 0 ;
    
    		 case WM_DESTROY :
    			   PostQuitMessage (0) ;
                   return 0 ;
              }
    
         return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
    }
    

    Hab das mal kurz so mgeschrieben,
    ich möcht jetzt gerne den acdc wert ac/dc gerne im Fenster ausgeben (hText)
    Ich denke mal mit Textout(...?)
    Leider bin ich nohnicht mal fähig den String dem char[] zuzuweisen.
    was ist falsch??'
    (Sorry, man merkt das ich schon ein halbes Jahr nicht mehr programmiert habe 🤡 )



  • Kann mir den keiner Helfen??
    Auch das hText auf Invalidateect bringt nix

    und falls mal ein MOD reinschaut bitte nach WinApi verschieben.



  • Dieser Thread wurde von Moderator/in Marc++us aus dem Forum Rund um die Programmierung 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.



  • Also erstmal hat RegisterClassEx nichts direkt mit CreateWindowEx zu tun.
    Außerdem sollte man bei den meisten Messages 0 zurückgeben, wenn man sie behandelt - steht so in der Doku.

    Ansonsten würde ich dir auf jeden Fall DoubleBuffering empfehlen. Entweder du zeichnest direkt ins Hauptfenster, entwickelst ein eigenes Control, subclasst ein bereits bestehendes, oder evtl. kannst du auch einfach einem Static das Bitmap zuweisen, in das du zeichnest (ob es da dann allerdings flackert weiß ich nicht)



  • Sorry, hab jetzt mehr oder weniger nur Bahnhof verstanden.

    Ich versuche mich schritt weisse vorzuarbeiten, da ich schon über ein halbes Jahr nix mehr gemacht habe und einiges vergessen "verdrängt" habe.

    Kannst du mir sagen wieso ich keinen Text in dieses Verd*** hText kriege?
    geht das ganicht? oder wie?



  • 1.) hText ist außerhalb von WM_CREATE ungültig (da auch nicht static)
    2.) Du kannst nicht einfach in WM_PAINT bei BeginPaint ein anderes Fenster-Hanlde angeben. Du könntest es mit einem Static mit SS_BITMAP versuchen, dem du dein Backbuffer-Bitmap zuweist, oder eben das Static subclassen.
    Einfacher wäre es aber wohl, wenn du dir einfach eine neue Fensterklasse registrierst (oder mit superclassing) oder eben den Backbuffer direkt in dein Hauptfenster blittest 🙂



  • Könntest du mir dazu ein Beispiel geben?
    Mir ist nicht ganz klar was du meinst



  • Beispiel zu was genau? ich würd entweden ein neues Control basteln (also eine neue Fensterklasse registrieren) oder direkt ins Hauptfenster zeichnen.


Anmelden zum Antworten