# 2 Fenster erstellen c++



## Crash Kid (1. April 2010)

Hallo,

ich programmiere mit der WinAPI unter Windows und möchte ein Programm erstellen, welches 2 Fenster erzeugt. 
Wenn ich auf einen bestimmten Button klicke, soll sich ein Art "Child-Fenster" öffnen, aber eben nicht als Child. Es soll nicht in dem eigentlichen Fenster angezeigt werden,
sondern ein eigenes Fenster sein. In dem Fenster will ich später dann Bilder anzeigen lassen.
Momentan kann ich schon das Fenster erzeugen und anzeigen lassen, aber sobald es da ist, können keine Message-Boxen angezeigt werden.
Wenn ich dann mithilfe von ShowWindow() das Fenster wieder ausblende, kommen alle Message-Boxen wieder. Aber solange es angezeigt wird kommen sie nicht.
Zudem liegt das Fenster immer über meinem Hauptfenster. Wie bringe ich es hinter mein Hauptfenster?

Zum besseren Verständnis der Quellcode:


```
#include <windows.h>

LRESULT CALLBACK MainProc(HWND, UINT, WPARAM, LPARAM);  //Hauptfenster
LRESULT CALLBACK AnzeigeProc(HWND, UINT, WPARAM, LPARAM);

const char szMainname[] = "Programm";
const char szAnzeige[] = "Bild Anzeige";

int iWindowX = 760;  //16:10 Format
int iWindowY = 475;
int iButtonX = 220;
int iButtonY = 35;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    WNDCLASS wc;
    HWND hWnd;
    MSG msg;
    
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = MainProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon         = LoadIcon(NULL, "Icon.ico");
    wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 0));
    wc.lpszClassName = szMainname;
    wc.lpszMenuName  = NULL;
    
    RegisterClass(&wc);
    
    wc.hbrBackground = CreateSolidBrush(RGB(0, 0, 0));
    wc.hIcon         = NULL;
    wc.lpfnWndProc   = AnzeigeProc;
    wc.lpszClassName = szAnzeige;
    
    RegisterClass(&wc);
    
    hWnd = CreateWindow(szMainname,
                        szMainname,
                        WS_OVERLAPPED | WS_SYSMENU,
                        GetSystemMetrics(SM_CXSCREEN) / 2 - iWindowX / 2,
                        GetSystemMetrics(SM_CYSCREEN) / 2 - iWindowY / 2,
                        iWindowX,
                        iWindowY,
                        NULL,
                        NULL,
                        hInstance,
                        NULL);
                        
    ShowWindow(hWnd, iCmdShow);
    UpdateWindow(hWnd);
    
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return msg.wParam;
}

LRESULT CALLBACK MainProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static RECT rect;
    
    //Anzeige Fenster...
    static HWND hhAnzeige;
    
    //Buttons...
    static HWND hbBild_EIN;
    static HWND hbBild_AUS;
    static HWND hbMSG;
    
    switch(message)
    {
        case WM_CREATE:
        {
            //Anzeige Fenster...
            hhAnzeige = CreateWindow(szAnzeige,
                                     szAnzeige,
                                     WS_OVERLAPPED,
                                     0,
                                     0,
                                     0,
                                     0,
                                     hWnd,
                                     NULL,
                                     ((LPCREATESTRUCT) lParam)->hInstance,
                                     NULL);
            
            //Buttons...
            hbBild_EIN = CreateWindow("button",
                                      "EIN",
                                      WS_CHILD | WS_VISIBLE,
                                      0,
                                      0,
                                      0,
                                      0,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam)->hInstance,
                                      NULL);
                                      
            hbBild_AUS = CreateWindow("button",
                                      "AUS",
                                      WS_CHILD | WS_VISIBLE,
                                      0,
                                      0,
                                      0,
                                      0,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam)->hInstance,
                                      NULL);
                                      
            hbMSG = CreateWindow("button",
                                 "Message",
                                 WS_CHILD | WS_VISIBLE,
                                 0,
                                 0,
                                 0,
                                 0,
                                 hWnd,
                                 NULL,
                                 ((LPCREATESTRUCT) lParam)->hInstance,
                                 NULL);
            
            return 0;
        }
        
        case WM_SIZE:
        {    
            rect.right  = LOWORD(lParam);
            rect.bottom = HIWORD(lParam);
            
            MoveWindow(hbBild_EIN, rect.right / 2 - 60, rect.bottom / 2 - 50, 120, iButtonY, TRUE);
            MoveWindow(hbBild_AUS, rect.right / 2 - 60, rect.bottom / 2, 120, iButtonY, TRUE);
            MoveWindow(hbMSG, rect.right / 2 - 60, rect.bottom / 2 + 50, 120, iButtonY, TRUE);
            MoveWindow(hhAnzeige, 10, 10, 100, 50, TRUE);
            
            ShowWindow(hhAnzeige, SW_HIDE);
            
            return 0;
        }
        
        case WM_COMMAND:
        {
            if(lParam == (LPARAM)hbBild_EIN)
            {
                if(HIWORD(wParam) == BN_CLICKED)
                {
                    ShowWindow(hhAnzeige, SW_SHOW);
                }
            }
            
            if(lParam == (LPARAM)hbBild_AUS)
            {
                if(HIWORD(wParam) == BN_CLICKED)
                {
                    ShowWindow(hhAnzeige, SW_HIDE);
                }
            }
            
            if(lParam == (LPARAM)hbMSG)
            {
                if(HIWORD(wParam) == BN_CLICKED)
                {
                    MessageBox(NULL, "Irgendein Text.", "test", MB_ICONERROR | MB_OK | MB_DEFBUTTON1);
                }
            }
            
            return 0;
        }
        
        case WM_DESTROY:
        {
            PostQuitMessage(0);
            
            return 0;
        }
    }
    
    return DefWindowProc(hWnd, message, wParam, lParam);
}

LRESULT CALLBACK AnzeigeProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static RECT rect;
    SIZE size;
    HDC hDC;
    PAINTSTRUCT ps;
    
    switch(message)
    {
        case WM_SIZE:
        {
            rect.right  = LOWORD(lParam);
            rect.bottom = HIWORD(lParam);
            
            return 0;
        }
        
        case WM_PAINT:
        {
            
            
            return 0;
        }
    }
    
    return DefWindowProc(hWnd, message, wParam, lParam);
}
```

Danke schon mal für jede Hilfe.

P.S.: Bei google habe ich nichts gefunden oder falsch gesucht. Ebenfalls hier im Forum.


----------



## badday (2. April 2010)

Ich denke du suchst soetwas wie SetFocus() ?
Ich weiß nicht, ob die Funktion noch so heißt, ich habe mich vor langer Zeit mal mit der Win32-API (noch mit C, nicht C++) auseinandergesetzt.
Wenn es diese noch gibt, sollte SetFocus (hWnd); funktionieren.

Aber wie gesagt, das ganze ist bei mir schon einige Zeit her.


Gruß,

badday


----------



## Crash Kid (2. April 2010)

Hey,

danke für die Antwort. Die Funktion gibt es, und es wird auch der Fokus auf das entsprechende Fenster gesetzt. Aber das 2.Fenster bleibt leider trotzdem im Vordergrund.

Aber trotzdem dank...

gruß


----------



## badday (2. April 2010)

Was mir noch einfallen würde, wäre, dass du das Fenster als "Child" erstellen könntest, also mit dem Flag WS_CHILD. Allerdings bin ich mir nicht sicher, ob das weiterhilft.

Gruß,

badday


----------



## Crash Kid (2. April 2010)

Mit dem Flag WS_CHILD würde das Fenster in meinem Hauptfenster gezeichnet/geöffnet. Aber genau das will ich ja nicht. Ich würde gern ein eigenständiges Fenster dafür machen, welches eben nicht in meinem Hauptfenster drin ist.

gruß


----------



## Crash Kid (3. April 2010)

Hallo,

also ich habe jetzt das Problem mit dem Fokus gelöst. Damit das 2. Fenster hinter dem Hauptfenster bleibt, darf man in der CreateWindow()-Funktion als HWND-Parameter hWnd übergeben sondern muss NULL reinschreiben.
Der geänderte Code:


```
//Anzeige Fenster...
            hhAnzeige = CreateWindow(szAnzeige,
                                     szAnzeige,
                                     WS_OVERLAPPED,
                                     0,
                                     0,
                                     0,
                                     0,
                                     NULL,    //<- Hier stand hWnd drin, war falsch ; Es muss NULL rein
                                     NULL,
                                     ((LPCREATESTRUCT) lParam)->hInstance,
                                     NULL);
```

Aber das die MessageBox nicht angezeigt wird bleibt trotzdem noch :-(
Wenn jemand dazu noch eine Lösung hat, wäre ich ihm sehr dankbar...

Bis dann


----------

