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

[WinAPI] Reakcja na kliknięcie przycisku

Ostatnio zmodyfikowano 2013-08-01 17:16
Autor Wiadomość
aspoka
Temat założony przez niniejszego użytkownika
[WinAPI] Reakcja na kliknięcie przycisku
» 2013-07-29 17:37:45
Witam, mam problem z obiektami kontrolnymi a dokładnie z przyciskiem. Napisałem program który wyświetla okno z: ramką, polem tekstowym, listą rozwijaną, polem wyboru, polem opcji i przyciskiem. Gdy przycisnę przycisk program ma wyświetlić komunikat "Naciśnięto przycisk!" ale tego nie robi.
Oto mój kod źródłowy:
C/C++
#include <windows.h>


LRESULT CALLBACK WndProc( HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam )
{
   
    HWND Ramka, Pole_tekstowe, Pole_opcji_1, Pole_opcji_2, Lista_rozwijana, Pole_wyboru_1, Pole_wyboru_2, Przycisk;
   
    switch( Message )
    {
       
       
    case WM_CLOSE:
        {
           
            DestroyWindow( hwnd );
            break;
           
        }
       
       
    case WM_DESTROY:
        {
           
            PostQuitMessage( 0 );
            break;
           
        }
       
       
        default:
        return DefWindowProc( hwnd, Message, wParam, lParam );
       
    case WM_COMMAND:
        if(( HWND ) lParam == Przycisk )
             MessageBox( hwnd, "Nacisnięto przycisk!", "Komunikat", MB_ICONINFORMATION );
       
        break;
       
    }
    return 0;
}


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) {
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;
   
   
    memset( & wc, 0, sizeof( wc ) );
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.lpfnWndProc = WndProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszClassName = "WindowClass";
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    if( !RegisterClassEx( & wc ) )
    {
       
        MessageBox( NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK );
       
        return 0;
       
    }
   
   
    HWND Ramka, Pole_tekstowe, Pole_opcji_1, Pole_opcji_2, Lista_rozwijana, Pole_wyboru_1, Pole_wyboru_2,
    Przycisk;
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, "WindowClass", "Moje Okno", 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 );
   
    if( hwnd == NULL )
    {
       
        MessageBox( NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK );
        return 0;
       
    }
   
    while( GetMessage( & Msg, NULL, 0, 0 ) > 0 )
    {
       
        TranslateMessage( & Msg );
        DispatchMessage( & Msg );
    }
   
    return Msg.wParam;
}

Bardzo proszę o pomoc.
P-89009
abdi
» 2013-07-29 18:01:34
Edit: Pomyłka przycisk odczytujesz z argumentu(czyli to masz dobrze) i nie możesz go deklarować lokalnie, w procedurze okna. 
P-89017
aspoka
Temat założony przez niniejszego użytkownika
» 2013-07-30 15:39:06
Nie rozumiem. O.o
P-89050
abdi
» 2013-07-30 15:52:00
C/C++
LRESULT CALLBACK WndProc( HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam )
{
   
    HWND Ramka, Pole_tekstowe, Pole_opcji_1, Pole_opcji_2, Lista_rozwijana, Pole_wyboru_1, Pole_wyboru_2, Przycisk;

Gdy przyciśniesz przycisk generowany jest komunikat który jest wysyłany do procedury okna.
Pola wParam i lParam posiadają informację o zdarzeniu które wystąpiło.

Message to typ zdarzenia czyli np WM_COMMAND - naciśnięcie przycisku.

C/C++
switch( Message )

case WM_COMMAND
: MessageBox( hwnd, "Nacisnięto przycisk!", "Komunikat", MB_ICONINFORMATION ); // Ten Message Box się pojawi przy wciśnięciu jakiegokolwiek
//przycisku

Jeśli chcesz sprawdzić czy wciśnięcie nastąpiło od konkretnego przycisku, wewnątrz WM_COMMAND to sprawdzasz lParam, gdzie znajduje się uchwyt do przycisku.
if(( HWND ) lParam == Przycisk )

tylko że ten Przycisk musi być zmienna globalną, więc wywal tą linijke:
HWND Ramka, Pole_tekstowe, Pole_opcji_1, ...

lParam musi mieć ten sam uchwyt przycisku który został wciśnięty.


Możesz też sprawdzać wParam jeśli podałeś identyfikator przycisku podczas wywołania CreateWindowEx();
Poczytaj kurs Złośliwca tam jest wszystko wyjaśnione z resztą ;p
P-89053
aspoka
Temat założony przez niniejszego użytkownika
» 2013-07-31 17:53:56
wywal tą linijke:
HWND Ramka, Pole_tekstowe, Pole_opcji_1, ...

Ale jeśli ja wywale to pojawia się błąd
[Error]'Przycisk' was not declared the scope
P-89121
pekfos
» 2013-07-31 18:32:36
Jeśli chcesz mieć te zmienne w procedurze okna, to muszą być globalne.. Ta linijka tworzyła nowe zmienne, a nie "importowała" je z WinMain().
P-89126
MrPoxipol
» 2013-07-31 18:49:37
Wywal z tej linijki zmienną Przycisk i zadeklaruj ją globalnie..

/edit: Fail..Otworzyłem stronę jakiś kwadrans temu i nie odświeżyłem..
P-89129
aspoka
Temat założony przez niniejszego użytkownika
» 2013-08-01 15:01:11
Możesz napisać jak to wygląda, bo ja nie ogar jestem.
P-89186
« 1 » 2
  Strona 1 z 2 Następna strona