Neues Fenster in Parent aufrufen?



  • Hallo,

    also ich habe ein Hauptfenster. In diesem soll nach dem klicken eines Buttons ein neues Fenster geöffnet werden, jedoch ist mir nich klar wie ich der WM_COMMAND das neue Fenster aufrufen kann?. Kann mir da einer Helfen?



  • am besten du erstellst das fenster gleich zu beginn mit, und wenn der klick auf den button kommt, lässt dus einfach über ShowWindow () anzeigen



  • aber woher kriege ich das handle zu dem fenster weil das handle ist ja in der einen LRESULT CALLBACK wo das fenster dann angezeigt werden soll nicht bekannt. Woher bekomme ich also das Handle?



  • entwede3r über FindWindow () oder du machst das Handle für das Fenster global



  • hWnd = CreateWindow(...)



  • ich mache es mal anders, ich poste hier mal den code für das fenster was aufgerufen werden soll und das wie ich es aufrufe.

    char ClassName[ ] = "Abrechnungsplaner";
    int neues_Fenster(HINSTANCE Window,HWND Parent)
    {
    
       RECT ScreenCoords;
    	if(!SystemParametersInfo(SPI_GETWORKAREA,NULL,&ScreenCoords,NULL) )
    	{
    		MessageBox(NULL,"Achtung","Ein Fehler",MB_ICONWARNING | MB_OK | MB_DEFBUTTON1);
    		ScreenCoords.right = 1024;
    		ScreenCoords.bottom = 768;
    	}
    
        HWND fenster;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = Window;
        wincl.lpszClassName = ClassName;
        wincl.lpfnWndProc = New_Window_Procedure;      /* This function is called by windows */
        wincl.style = CS_HREDRAW|CS_VREDRAW;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = 0;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default colour as the background of the window */
        wincl.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        fenster = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               ClassName,         /* Classname */
               "Abrechnungsplaner",       /* Title Text */
               WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MINIMIZEBOX, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               HEIGHT,                 /* The programs width */
               WIDTH,                 /* and height in pixels */
               Parent,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               Window,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (fenster, SW_NORMAL);
        UpdateWindow(fenster);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    

    das ist das fenster was aufgerufen werden soll

    und hier das wie ich es aufrufen möchte

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
          switch (message)                  /* handle the messages */
        {
    
           case WM_COMMAND:
            {
                     switch(LOWORD(wParam))
                     {
    
                         case IDM_SCHLIESSEN:
    
                         {
                              DestroyWindow(hwnd);
                              PostQuitMessage(0);
                              break;
                         }
                         case IDM_DEUTSCH:
                         {
    
                             //So und hier möchte ich gerne das neue Fenster aufrufen
    //Diese LRESULT ist aber die Procedure in einem anderem Fenster
    
                              //wie muss ich hier das neue Fenster aufrufen??
                         }
              }
    
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    


  • /So und hier möchte ich gerne das neue Fenster aufrufen
    //Diese LRESULT ist aber die Procedure in einem anderem Fenster
    //wie muss ich hier das neue Fenster aufrufen??

    Wie schon gesagt: Mit hWnd = CreateWindowEx. Wenn Du eine vordefinierte Fensterclasse verwendest (Button oder so), gibst Du die im 2. Parameter an (LPCTSTR lpClassName). Wenn Du eine eigene Fensterklasse verwendest, mußt Du die global erstellen (neue WndClassEx-Struktur anlegen) und mit RegisterClassEx registrieren. Die Zuordnung der LRESULT CALLBACK-Funktion gibst Du in der WndClassEx-Struktur an. Diese Klasse gibst Du dann in CreateWindowEx() als 2. Parameter ein. Man kann eine Prozedur auch mehreren Fenstern zuordnen, macht aber i. d. R. keinen Sinn.



  • nee ich glaube ich wurde falsch verstanden, also nochmal: der code der an 1. stelle steht steht für das fenster was ich gerne aufrufen möchte und die LRESULT die als 2. steht, gehört zu meinem hauptfenster was von anfang gezeigt wird. jetzt soll wenn der button gedrückt wurde, diese fenster was ich euch als erstes gezeigt habe, angezeigft werden, jedoch klappt es nicht wenn ich einfach nur die funktion dieses fenster aufrufe...



  • Natürlich klappt das so nicht. Wenn das Fenster erstellt wird, erhält es die Nachricht WM_CREATE. Diese muß in der CALLBACK bearbeitet werden, indem Du z. B. ShowWindow((hChild, SW_SHOW) angibst (gibt verschiedene Möglichkeiten).
    Im Zweifelsfall kannst ja mal die CALLBACK-Funktion Deines Childs zeigen.



  • sooo ich poste mal das Fenster mit LRESULT welches angezeigt werden soll, bei einem klick
    problem an der Sache die MessageBox welche "Fehler bei der Regestrierung" beinhaltet wird angezeigt, also setzt da shcon der fehler ein.

    #include "Includes.h"
    
    int WINAPI neues_Fenster(HINSTANCE Window,HWND Parent)
    {
        char ClassName[ ] = "Abrechnungsplaner";
    
       RECT ScreenCoords;
    	if(!SystemParametersInfo(SPI_GETWORKAREA,NULL,&ScreenCoords,NULL) )
    	{
    		MessageBox(NULL,"Achtung","Ein Fehler",MB_ICONWARNING | MB_OK | MB_DEFBUTTON1);
    		ScreenCoords.right = 1024;
    		ScreenCoords.bottom = 768;
    	}
    
        HWND fenster;               /* This is the handle for our window */
        MSG messages2;            /* Here messages to the application are saved */
        WNDCLASS WndClass2;        /* Data structure for the windowclass */
    
    	WndClass2.cbClsExtra		= 0;
    	WndClass2.cbWndExtra		= 0;
    	WndClass2.hbrBackground		= (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    	WndClass2.hCursor			= LoadCursor(NULL,IDC_ARROW);
    	WndClass2.hIcon				= LoadIcon(NULL,IDI_APPLICATION);
    	WndClass2.hInstance			= Window;
    	WndClass2.lpfnWndProc		= New_Window_Procedure;
    	WndClass2.lpszClassName		= ClassName;
    	WndClass2.lpszMenuName		= NULL;
    	WndClass2.style				= CS_HREDRAW | CS_VREDRAW;
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClass (&WndClass2))
    	{
    		MessageBox(NULL,"Fehler bei Registrierung!","Fehler!",MB_OK);
            return 1;
    	}
    
        /* The class is registered, let's create the program*/
        fenster = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               ClassName,         /* Classname */
               "Abrechnungsplaner",       /* Title Text */
               WS_CHILDWINDOW|WS_VISIBLE, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               HEIGHT-200,                 /* The programs width */
               WIDTH-100,                 /* and height in pixels */
               Parent,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               Window,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (fenster, SW_NORMAL);
        UpdateWindow(fenster);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages2, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages2);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages2);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
    
        return messages2.wParam;
    }
    
    LRESULT CALLBACK New_Window_Procedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
            {
                PostQuitMessage(0);
            }
    
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    

    so und das soll bei einem klick in einer anderen callback aufgerufen werden und angezeigt werden. jedoch kommt schon der fehler mit der registrierung



  • Du hast einige Member der WndClass falsch angegeben:

    WndClass2.hInstance = Window;
    

    weglassen.
    Und sicherheitshalber

    WndClass2.cbSize = Sizeof(WndClass2)
    

    mit angeben.

    Um den Umgang mit Childs zu lernen, würde ich mal ein Tutorial durcharbeiten:

    http://www.win-api.de/tutorials.php



  • also da sagt er mir das WNDCLASS keinen member hat der cbSize heißt.--.-- Was soll ich da nun machen?



  • Stimmt, sorry. Hab sie mit WndClassEx verwechselt... 😃

    Trotzdem Tutorial reinziehen! 😋



  • hehe ok, danke trotzdem


Log in to reply