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

Wywołanie nowego okna kliknięciem przycisku [WinApi C++]

Ostatnio zmodyfikowano 2017-12-27 16:32
Autor Wiadomość
Saguer
Temat założony przez niniejszego użytkownika
Wywołanie nowego okna kliknięciem przycisku [WinApi C++]
» 2017-12-27 13:11:19
Cześć,

jestem w trakcie nauki korzystania z WinApi i mam problem z wywołaniem okna poprzez kliknięcie przycisku, program nie kompiluje mi się (wywala bład, że hwnd2 nie jest zadeklarowane). Ktoś jest w stanie mi pomóc, doradzić co zmienić w kodzie?

Tutaj kod:


C/C++
#include <windows.h>


LPSTR NazwaKlasy = "Klasa1";
LPSTR Klasa = "Coś";
MSG Komunikat;

//C:\Users\Juzek\AppData\Local\Temp\ccn1KJ5G.o okno1.cpp:(.rdata$.refptr._Z12WndProcChildP6HWND__jyx[.refptr._Z12WndProcChildP6HWND__jyx]+0x0): undefined reference to `WndProcChild(HWND__*, unsigned int, unsigned long long, long long)'


HWND hPrzycisk1;
HWND hPrzycisk2;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
LRESULT CALLBACK WndProcChild( HWND hwnd2, UINT msg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
   
    // WYPEŁNIANIE STRUKTURY
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    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 )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    WNDCLASSEX wc2;
   
    wc2.cbSize = sizeof( WNDCLASSEX );
    wc2.style = 0;
    wc2.lpfnWndProc = WndProcChild;
    wc2.cbClsExtra = 0;
    wc2.cbWndExtra = 0;
    wc2.hInstance = hInstance;
    wc2.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc2.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc2.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc2.lpszMenuName = NULL;
    wc2.lpszClassName = Klasa;
    wc2.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    // REJESTROWANIE KLASY OKNA
    RegisterClassEx( & wc );
    RegisterClassEx( & wc2 );
   
   
    // TWORZENIE OKNA
    HWND hwnd;
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Gra w statki", WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, NULL, NULL, hInstance, NULL );
    HWND hwnd2;
    hwnd2 = CreateWindowEx( WS_EX_CLIENTEDGE, Klasa, "Gra w statki", WS_CHILD | WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 640, 480, hwnd, NULL, hInstance, NULL );
    // tworzenie przycisku
    hPrzycisk1 = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Graj", WS_CHILD | WS_VISIBLE, 235, 150, 150, 60, hwnd, NULL, hInstance, NULL ); //ws_child - okno potomne do głownego , miejce, wielkosc
    hPrzycisk2 = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Wyjście z gry", WS_CHILD | WS_VISIBLE, 235, 250, 150, 60, hwnd, NULL, hInstance, NULL );
   
   
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );
   
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}


// OBSŁUGA ZDARZEŃ
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_COMMAND:
        if(( HWND ) lParam == hPrzycisk1 )
        {
            ShowWindow( hwnd2, SW_SHOW );
            UpdateWindow( hwnd2 );
        }
        if(( HWND ) lParam == hPrzycisk2 )
        {
            DestroyWindow( hwnd );
            break;
        }
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}
LRESULT CALLBACK WndProcChild( HWND hwnd2, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_CLOSE:
        DestroyWindow( hwnd2 );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
        default:
        return DefWindowProc( hwnd2, msg, wParam, lParam );
    }
   
    return 0;
}
P-168143
Luq
» 2017-12-27 16:21:12
hwnd2 nie jest zmienną globalną. W WndProc ta zmienna nie jest widoczna.
P-168149
Saguer
Temat założony przez niniejszego użytkownika
» 2017-12-27 16:32:34
Luq, nie jestem chyba w stanie zrobić z hwnd2 zmiennej globalnej (wybacz mi, jeśli się mylę). Zatem w jaki sposób podejść do tego kodu aby za pomocą przycisku wyświetlało mi się okno?
1
EDIT -> Zmieniłem na globalną, dzięki za zwrócenie uwagi, teraz wszystko działa!
P-168150
« 1 »
  Strona 1 z 1