Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

WinAPI: Jak zamknąć okno potomne? [C++]

Ostatnio zmodyfikowano 2014-04-22 09:58
Autor Wiadomość
mikson
Temat założony przez niniejszego użytkownika
WinAPI: Jak zamknąć okno potomne? [C++]
» 2014-04-20 17:31:09
Witam,

Czy okno potomne zamyka się jakoś inaczej niż zwykłe?
W moim programie zwykłe
DestroyWindow( hWnd2 );
 nie działa :/

Pozdrawiam.
P-108434
mikson
Temat założony przez niniejszego użytkownika
» 2014-04-21 11:03:10
Przesyłam kod programu.
C/C++
#include <windows.h>
#include <fstream>

using namespace std;



HINSTANCE hInstance;
HWND hwnd;
HWND hWnd2;

HWND g_hPrzyciskLogIn;
HWND g_hPrzyciskCancel;


/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure( HWND, UINT, WPARAM, LPARAM );

/*  Make the class name into a global variable  */
char szClassName[] = "WindowsApp";


int WINAPI WinMain( HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil )

{
    MSG messages; /* Here messages to the application are saved */
    WNDCLASSEX wincl; /* Data structure for the windowclass */
   
    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
    wincl.style = CS_DBLCLKS; /* 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 = NULL; /* No menu */
    wincl.cbClsExtra = 0; /* No extra bytes after the window class */
    wincl.cbWndExtra = 0; /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND;
   
    /* Register the window class, and if it fails quit the program */
    if( !RegisterClassEx( & wincl ) )
         return 0;
   
    HMENU hMenu = LoadMenu( hThisInstance, MAKEINTRESOURCE( 200 ) );
   
    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx(
    0, /* Extended possibilites for variation */
    szClassName, /* Classname */
    "TEST", /* Title Text */
    WS_MAXIMIZE | WS_MINIMIZEBOX | WS_SYSMENU,
    CW_USEDEFAULT, /* Windows decides the position */
    CW_USEDEFAULT, /* where the window ends up on the screen */
    9999, /* The programs width */
    9999, /* and height in pixels */
    HWND_DESKTOP, /* The window is a child-window to desktop */
    hMenu, /* H menu */
    hThisInstance, /* Program Instance handler */
    NULL /* No Window Creation data */
    );
   
    RECT rcl;
    GetClientRect( hwnd, & rcl );
   
    HWND hTlo = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE,
    0, 0, rcl.right, rcl.bottom, hwnd, NULL, hInstance, NULL );
   
    HWND hInfo = CreateWindowEx( 0, "STATIC", "...\n...\n...", WS_CHILD | WS_VISIBLE,
    rcl.right / 2.6, rcl.bottom / 2, 400, 100, hwnd, NULL, hInstance, NULL );
   
   
    char szWindowClass2[] = "WindowsApp";
   
    hWnd2 = CreateWindow( szWindowClass2, TEXT( "LOGOWANIE" ), WS_POPUP | WS_VISIBLE | WS_CAPTION,
    100, 100, 500, 500, hwnd, NULL, hInstance, NULL );
   
    ShowWindow( hWnd2, SW_SHOW );
   
    HWND hTlo2 = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE,
    0, 0, rcl.right, rcl.bottom, hWnd2, NULL, hInstance, NULL );
   
    HWND hText3 = CreateWindowEx( 0, "STATIC", "Nick:", WS_CHILD | WS_VISIBLE,
    10, 90, 400, 100, hWnd2, NULL, hInstance, NULL );
   
    HWND hNick = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 10, 130, 200, 20,
    hWnd2, NULL, hInstance, NULL );
   
    HWND hText4 = CreateWindowEx( 0, "STATIC", "Hasło:", WS_CHILD | WS_VISIBLE,
    10, 170, 400, 100, hWnd2, NULL, hInstance, NULL );
   
    HWND hPassword = CreateWindowEx( 0, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP, 10, 210, 200, 20,
    hWnd2, NULL, hInstance, NULL );
   
    HWND hText5 = CreateWindowEx( 0, "STATIC", "UWAGA! Wielkość liter jest rozróżniana we wszystkich polach!", WS_CHILD | WS_VISIBLE,
    10, 440, 500, 100, hWnd2, NULL, hInstance, NULL );
   
    HWND g_hCheckboxReamemberMe = CreateWindowEx( 0, "BUTTON", "Zapamiętaj mnie na tym komputerze", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
    10, 250, 300, 50, hWnd2, NULL, hInstance, NULL );
   
    g_hPrzyciskLogIn = CreateWindowEx( 0, "BUTTON", "ZALOGUJ!", WS_CHILD | WS_VISIBLE,
    10, 300, 200, 50, hWnd2, NULL, hInstance, NULL );
   
    g_hPrzyciskCancel = CreateWindowEx( 0, "BUTTON", "Anuluj i zamknij program", WS_CHILD | WS_VISIBLE,
    220, 300, 200, 50, hWnd2, NULL, hInstance, NULL );
   
   
    /* Make the window visible on the screen */
    ShowWindow( hwnd, nFunsterStil );
   
   
    /* Run the message loop. It will run until GetMessage() returns 0 */
    while( GetMessage( & messages, NULL, 0, 0 ) )
    {
        TranslateMessage( & messages );
        DispatchMessage( & messages );
    }
   
    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
    switch( message ) /* handle the messages */
    {
    case WM_DESTROY:
        PostQuitMessage( 0 ); /* send a WM_QUIT to the message queue */
        break;
    case WM_COMMAND:
        if(( HWND ) lParam == g_hPrzyciskLogIn )
        {
            DestroyWindow( hWnd2 ); //CHODZI O TEN MOMENT. Tutaj po naciśnięciu przycisku zaloguj zamyka się cały program, a nie samo okienko hWnd2. Gdy zastosuję "CloseWindow( hWnd2 );" jest lepiej, bo okno hWnd2 się minimalizuje, ale nadal nie zamyka...
        }
        if(( HWND ) lParam == g_hPrzyciskCancel )
        {
            PostQuitMessage( 0 );
        }
        break;
        default: /* for messages that we don't deal with */
        return DefWindowProc( hwnd, message, wParam, lParam );
    }
   
    return 0;
}



P.S. Jest jakiś styl hasła do textboxa, że zamiast znaków pojawiają się gwiazdki?
P-108450
Monika90
» 2014-04-21 12:33:50
Program się kończy, bo w procedurze okna w obsłudze komunikatu WM_DESTROY wywołujesz PostQuitMessage. Użyj innej procedury okna dla okna dialogowego.
P-108451
mikson
Temat założony przez niniejszego użytkownika
» 2014-04-21 13:26:50
Jakiej innej procedury?
Żadna inna procedura do zamknięcia okna mi nie przychodzi do głowy oprócz właśnie DestroyWindow i CloseWindow...
P-108456
Monika90
» 2014-04-21 13:41:05
Innej dla okna głównego i innej dla okna potomnego. Dla okna głównego takiej, która wywołuje PostQuitMessage w obsłudze WM_DESTROY, a dla okna potomnego takiej, która tego nie robi. Co oczywiście oznacza, że musisz zarejestrować dwie klasy okna.
P-108458
mikson
Temat założony przez niniejszego użytkownika
» 2014-04-21 16:25:16
No tak ale właśnie jak brzmi taka procedura która nie wywołuje PostQuitMessage w WM_DESTROY...?
P-108475
mikson
Temat założony przez niniejszego użytkownika
Zamykam.
» 2014-04-22 09:58:36
Problem rozwiązany! Dla okna potomnego użyłem
ShowWindow( hWnd2, SW_HIDE );
 i działa! Dzięki za pomoc :)
P-108495
« 1 »
  Strona 1 z 1