Kontrollfenster zur Anwendung hinzufügen



  • Hallo allesamt!

    Ich habe ein Problem mit meiner Applikation. Und zwar möchte ich zu meinem Programm ein zusätzliches Fenster aufmachen, über das ich mit ein paar Buttons und Slidern ein paar Variablen ändern kann.

    Das Programm wurde bisher ohne jeglichen MFC-Kram geschrieben, deshalb gehe ich davon aus, dass ich diesen Wizard zum Fenster-Erstellen über 'Add Resource' nicht benutzen kann, oder?

    Mein Programm ist eine dll, die von OpenGL-Programmen aufgerufen wird und anschließend zusätzlich zur Front-Sicht auch zwei weitere Fenster aufmacht, auf denen man Blick nach Links und Rechts auf die Szene hat.

    Ich habe leider keine Ahnung wie ich anfangen soll, oder wo ich mir weitere Infos dazu holen kann und hoffe deshalb dass ihr mir helfen könnt.

    ciao und vielen Dank
    derkerl



  • derkerl schrieb:

    [...]
    Ich habe leider keine Ahnung wie ich anfangen soll, oder wo ich mir weitere Infos dazu holen kann und hoffe deshalb dass ihr mir helfen könnt.
    [...]

    CreateWindow(Ex) ?! 💡



  • Hallo.

    OK habe mich da jetzt halbwegs selbst durchgearbeitet und zumindest schonmal ein leeres Fenster zusätzlich zu den anderen geschaffen.

    Ich habe diese ganzen hWnd usw. für dieses Fenster neu erstellt und alle mit dem Zusatz CW für Control Window versehen, um diese unterschiedlich behandeln zu können.

    Jetzt isses so, dass ich ein paar Buttons in das Fenster reinpacken möchte, aber laut Tutorial mache ich dies in der LRESULT CALLBACK. Diese bekommt aber nur die normale hWnd und hinstance usw. und nicht die für das neue Fenster.

    Kann ich einfach ein neues LRESULT CALLBACK aufmachen, die nur die Sachen des neuen Fensters behandelt?
    Ich habs zumindest gerade versucht, und VC++ meckert zwar nicht aber es wird auch nichts zusätzliches angezeigt?

    Weiß jemand, wie ich das ganze angehen soll?

    Vielen Dank



  • Du musst eine neue WindowClass erstellen. Da kannst Du dann auch eine neue Callback Funktion angeben, in der Du die benötigten Controls erstellen kannst.



  • Die window-Class habe ich neu erstellt. Die Methode hier wird von der Main aufgerufen.

    void CreateControlWindow()
    {
    	HWND		hWndCW;
    	WNDCLASS	wcCW;
    	HINSTANCE hInstance = GetModuleHandle(NULL);
    
    	wcCW.style			 = CS_HREDRAW | CS_VREDRAW;
    	wcCW.lpfnWndProc	   = WndProcCW;
    	wcCW.cbClsExtra		= 0;
    	wcCW.cbWndExtra		= 0;
    	wcCW.hInstance		 = hInstance;
    	wcCW.hCursor		   = LoadCursor(NULL, IDC_ARROW);
    	wcCW.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
    	wcCW.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wcCW.lpszClassName	= szAppName;
    	wcCW.lpszMenuName	= NULL;
    
    	RegisterClass(&wcCW);
    
    	hWndCW = CreateWindow(szAppName,
    						"OGLWrapper Control Window",
    						WS_OVERLAPPEDWINDOW,
    						CW_USEDEFAULT,		// X-Position auf dem Monitor
    						CW_USEDEFAULT,		// Y-Position auf dem Monitor
    						500,	// Fensterbreite
    						200,	// Fensterhöhe
    						NULL,
    						NULL,
    						hInstance,
    						NULL);
    
    	ShowWindow(hWndCW, 1);
    	UpdateWindow(hWndCW);
    }
    

    Dazu habe ich folgende CALLBACK

    LRESULT CALLBACK WndProcCW(HWND hWndCW, UINT messageCW, WPARAM wParamCW, LPARAM lParamCW)
    {
    	static HWND hButton;
    	switch (messageCW)
    	{
    	case WM_CREATE:
          {
             hButton = CreateWindow(  "button",
                                      "button",
                                      WS_CHILD | WS_VISIBLE,
                                      0, 0, 0, 0,
                                      hWndCW,
                                      NULL,
                                      ((LPCREATESTRUCT) lParamCW) -> hInstance,
                                      NULL);
             return 0;
          }
       case WM_SIZE:
          {
             return 0;
          }
       case WM_COMMAND:
          {
             return 0;
          }
       case WM_DESTROY:
          {
             PostQuitMessage(0);
             return 0;
          }
       }
       return DefWindowProc(hWndCW, messageCW, wParamCW, lParamCW);
    }
    

    Ich bin mir bei der hinstance nicht so sicher, weil die auch vom anderen Fenster benutzt wird.



  • das ist schon richtig so. Siehe hierzu link



  • Ok, hab die Lösung selbst gefunden. Habe nur vergessen, etwas in die case-Anweisungen WM_SIZE und WM_COMMAND zu schreiben.



  • Bedenke nur: Ein Aufruf von PostQuitMessage beendet in jedem Fall dein Programm, egal wo (lies: in welcher WndProc) es aufgerufen wird.



  • Hallo alle nochmal.

    Ich möchte als nächstes einen Slider in mein Fenster einbauen, nur find ich kaum Infos dazu, wie man einen Slider einbaut, bzw. aus dem was ich gefunden habe, werde ich nicht schlau. (trackbar controls auf msdn)

    Kann ich einen Slider nicht einfach so einbauen, wie ich das mit den Buttons gemacht habe?

    danke



  • Was genau verstehst du denn unter einem Slider? Du kannst eine Scrollleiste verwenden, ist genauso einfach wie ein normaler Button.



  • Mit Slider meine ich einen ganz normalen "Regler", auch Trackbar genannt. Damit wollt ich einen float-Wert regulieren.

    Sinn des ganzen soll eine Regelung für mein Visualisierungs-Tool sein, damit ich dort die RGB-Werte jeweils erhöhen oder verringern kann. Der RGB-Wert soll dann mit dem float-Wert reguliert werden können.



  • Im Petzold steht ein Programm, bei dem mit SCROLLBARS die Farbwerte eingestellt werden. Vielleicht mal durchwühlen.



  • Also ich glaube du meinst eine Trackbar oder eine Scrollbar.

    Also zu Trackbar-Controls findest du ➡ hier Informationen, zu Scrollbar-Controls ➡ hier.


Anmelden zum Antworten