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

[WinAPI] undefined reference to `WndProc(HWND__*, unsigned int, unsigned int, long)@16'

Ostatnio zmodyfikowano 2013-09-24 21:39
Autor Wiadomość
aspoka
Temat założony przez niniejszego użytkownika
[WinAPI] undefined reference to `WndProc(HWND__*, unsigned int, unsigned int, long)@16'
» 2013-09-17 10:28:41
Witam.
Gdy kompiluje program to wyświetla się błąd.
Treść programu:
C/C++
#include <windows.h>

HWND Ramka, Pole_tekstowe, Pole_opcji_1, Pole_opcji_2, Lista_rozwijana,
Pole_wyboru_1, Pole_wyboru_2, Przycisk;

LPSTR NazwaKlasy = "KlasaOkna";
MSG Komunikat;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
   
    WNDCLASSEX ko;
    ko.cbSize = sizeof( WNDCLASSEX );
    ko.lpfnWndProc = WndProc;
    ko.hInstance = hInstance;
    ko.hCursor = LoadCursor( NULL, IDC_ARROW );
    ko.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    ko.lpszClassName = "WindowClass";
    ko.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    ko.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    if( !RegisterClassEx( & ko ) )
         return 0;
   
    HWND hwnd;
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, "Nazwa Klasy", "Tytuł okna",
    WS_VISIBLE | WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    375,
    330,
    NULL, NULL, hInstance, NULL );
   
    Ramka = CreateWindowEx( 0, "BUTTON", "Ramka",
    WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, 10, 335, 270,
    hwnd, NULL, hInstance, NULL );
   
    Pole_tekstowe = CreateWindowEx( WS_EX_CLIENTEDGE, "COMBOBOX", NULL,
    WS_CHILD | WS_VISIBLE | WS_BORDER, 20, 30, 150, 30,
    hwnd, NULL, hInstance, NULL );
    Lista_rozwijana = CreateWindowEx( WS_EX_CLIENTEDGE, "COMBOBOX", NULL,
    WS_CHILD | WS_VISIBLE | WS_BORDER | CBS_DROPDOWN, 20, 80, 150, 200,
    hwnd, NULL, hInstance, NULL );
   
    SendMessage( Lista_rozwijana, CB_ADDSTRING, 0,( LPARAM ) "Opcja1" );
    SendMessage( Lista_rozwijana, CB_ADDSTRING, 0,( LPARAM ) "Opcja2" );
    SendMessage( Lista_rozwijana, CB_ADDSTRING, 0,( LPARAM ) "Opcja3" );
   
    Pole_wyboru_1 = CreateWindowEx( 0, "BUTTON", "Pole wyboru 1",
    WS_CHILD | WS_VISIBLE | BS_CHECKBOX,
    210, 30, 125, 30, hwnd, NULL, hInstance, NULL );
   
    Pole_wyboru_2 = CreateWindowEx( 0, "BUTTON", "Pole wyboru 2",
    WS_CHILD | WS_VISIBLE | BS_CHECKBOX,
    210, 80, 125, 30, hwnd, NULL, hInstance, NULL );
   
    Pole_opcji_1 = CreateWindowEx( 0, "BUTTON", "Pole opcji 1",
    WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
    210, 130, 125, 30, hwnd, NULL, hInstance, NULL );
   
    Pole_opcji_2 = CreateWindowEx( 0, "BUTTON", "Pole opcji 2",
    WS_CHILD | WS_VISIBLE | BS_RADIOBUTTON,
    210, 180, 125, 30, hwnd, NULL, hInstance, NULL );
   
    Przycisk = CreateWindowEx( 0, "BUTTON", "Przycisk",
    WS_CHILD | WS_VISIBLE, 127, 230, 70, 30,
    hwnd, NULL, hInstance, NULL );
   
    ShowWindow( hwnd, nCmdShow );
    UpdateWindow( hwnd );
   
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
       
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
       
    }
    return Komunikat.wParam;
   
}

LRESULT CALLBACK WinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )

{
   
    switch( msg )
    {
       
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        defaylt:
        return DefWindowProc( hwnd, msg, wParam, lParam );
       
    case WM_COMMAND:
        if(( HWND ) lParam == Przycisk )
        MessageBox( hwnd, "Nacisnięto pszycisk!", "Komunikat",
             MB_ICONINFORMATION );
       
        break;
       
    }
   
   
    return 0;
   
}
Treść błędu:
6 20 C:\Users\Mateusz\Documents\Nauka_do_gry.cpp [Warning] deprecated conversion from string constant to 'LPSTR {aka char*}' [-Wwrite-strings]
   [Linker error] C:\Users\Mateusz\AppData\Local\Temp\ccsCwpGG.o:Nauka_do_gry.cpp:(.text+0x10): undefined reference to `WndProc(HWND__*, unsigned int, unsigned int, long)@16'
  C:\Users\Mateusz\Documents\collect2.exe [Error] ld returned 1 exit status
Z góry dzięki.
P-92245
unimator
» 2013-09-17 12:29:42
Nie masz definicji (ciała) funkcji WndProc. Zapewne, jest to tylko Twój błąd w nazewnictwie funkcji, bo na dole jest jakaś funkcja o nazwie WinProc i pewnie to ona miała być definicją WndProc.

+ w switchu masz literówkę (defaylt?)
P-92246
DejaVu
» 2013-09-17 12:37:18
Zła nazwa funkcji dla definicji funkcji.
C/C++
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );

LRESULT CALLBACK WinProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    //...
}
P-92247
aspoka
Temat założony przez niniejszego użytkownika
» 2013-09-17 15:32:32
Ok. poprawiłem te błędy i kompilacja się udaje, ale program pojawia się w zwykłej konsoli.
P-92257
Monika90
» 2013-09-17 16:23:58
Jak się tworzy okno, to trzeba podać nazwę klasy okna, taką samą jak przy rejestracji klasy.

A jak chcesz wyłączyć okno konsoli to musisz dodać odpowiednią opcję dla linkera, w mingw -mwindows, a w msvc /subsystem:windows
P-92259
aspoka
Temat założony przez niniejszego użytkownika
» 2013-09-17 16:59:15
Ale co i gdzie mam poprawić.
P-92260
SeaMonster131
» 2013-09-17 17:33:32
P-92262
pekfos
» 2013-09-17 17:34:30
Podajesz złą klasę okna w drugim argumencie CreateWindowEx().
P-92263
« 1 » 2
  Strona 1 z 2 Następna strona