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

[WinAPI] Brak obsługi wciśnięcia przycisku

Ostatnio zmodyfikowano 2012-12-29 11:04
Autor Wiadomość
gylopl
Temat założony przez niniejszego użytkownika
[WinAPI] Brak obsługi wciśnięcia przycisku
» 2012-12-28 15:10:50
witam, mam maly problem, otoz nie chce mi dzialac obsluga zdarzen, a mianowicie obsluga wcisniecia buttona.
Button nalezy do ramki hRamka, jesli jednak nalezy do okna glownego hwnd to obsluga zdarzenia dziala. nie wiem za bardzo jak zmienic mam ta funckje, aby to dzialalo.
C/C++
#include <windows.h>
#define ID_PRZYCISK1 501
#define ID_PRZYCISK2 502

LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
HWND g_hPrzycisk;
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( 0, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName =( hInstance, MAKEINTRESOURCE( 200 ) );
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( hInstance, "ikona" );
   
    //REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...", MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    //TWORZENIE OKNA
    HWND hwnd;
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Moje okienko!", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL, hInstance, NULL );
   
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
    }
   
    ShowWindow( hwnd, nCmdShow ); //Pokaż okienko...
    UpdateWindow( hwnd );
    //DODAWANIE RAMKI NA COMBOBOX I BUTTON
    HWND hRamka = CreateWindowEx( 0, "BUTTON", "RAMKA!", WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 70, 70, 600, 70, hwnd, NULL, hInstance, NULL );
    //KONIEC DODAWANIA RAMKI
   
    HWND hButton1 = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Pierwszy", WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 50, 150, 30, hRamka,( HMENU ) ID_PRZYCISK1, hInstance, NULL ),
    hButton2 = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Drugi", WS_CHILD | WS_VISIBLE | WS_BORDER, 50, 100, 150, 30, hwnd,( HMENU ) ID_PRZYCISK2, hInstance, NULL );
   
    //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: //Tu wyrzuca błąd
        switch( wParam )
        {
        case ID_PRZYCISK1:
            MessageBox( hwnd, "Wcisnąłeś przycisk 1", "Test", MB_ICONINFORMATION );
            break;
        case ID_PRZYCISK2:
            MessageBox( hwnd, "Wcisnąłeś przycisk 2", "Test", MB_ICONINFORMATION );
            break;
            default:
            MessageBox( hwnd, "Zrobiłeś coś innego ;-)", "Test", MB_ICONINFORMATION );
        }
        break;
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
    return 0;
}
Przycisk pierwszy nalezacy do hRamka nie dziala, a drugi nalezacy do hwnd dziala.
P-72191
CodeMeister
» 2012-12-28 16:02:52
spróbuj odbierać nie identyfikator  tylko  uchwyt  w obsłudze
P-72195
gylopl
Temat założony przez niniejszego użytkownika
» 2012-12-28 16:38:56
moglbys pokazac peseudokod, albo bardziej mnie naprowadzic, bo nie moge nic wymyslec, chcialem dodac nowego switcha(hwnd), ale to mi wywala blad
P-72198
xevuel
» 2012-12-28 16:59:43
P-72200
CodeMeister
» 2012-12-28 18:06:33
po prostu uchwyty do buttonów uczyń zmiennymi  globalnymi i w funkcji odbierającej komunikaty

C/C++
//hwnd button1...

case WM_COMMAND:
if(( HWND ) lParam == button1 )
     MessageBox( hwnd, "Nacisnąłeś przycisk!", "Ha!", MB_ICONINFORMATION );

break;
P-72206
gylopl
Temat założony przez niniejszego użytkownika
» 2012-12-29 11:04:55
ok, poradzilem sobie, za pomoca SetWindowLong zrobilem nowa procedure obslugi okna dla ramkki
P-72244
« 1 »
  Strona 1 z 1