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

[WinAPI, C++] Nie da się zaznaczyć checkbox'a.

Ostatnio zmodyfikowano 2014-11-28 21:15
Autor Wiadomość
Lotherad
Temat założony przez niniejszego użytkownika
[WinAPI, C++] Nie da się zaznaczyć checkbox'a.
» 2012-09-18 22:42:13
Witam. Mam taki oto kod:
C/C++
#include <windows.h>
HWND g_hPrzycisk;
MSG Komunikat;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShow )
{
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.lpfnWndProc = DefWindowProc;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = 0;
    wc.lpszClassName = "NKlasy";
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Code 1", "Error", MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    HWND hwnd;
    hwnd = CreateWindowEx( 0, "NKlasy", "First", WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 240, 320, NULL, NULL, hInstance, NULL );
    g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Przycisk", WS_CHILD | WS_VISIBLE | BS_CHECKBOX, 50, 50, 150, 50, hwnd, NULL, hInstance, NULL );
    ShowWindow( hwnd, nShow );
    UpdateWindow( hwnd );
   
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_COMMAND:
        if(( HWND ) lParam == g_hPrzycisk )
             MessageBox( hwnd, "a", "a", MB_ICONINFORMATION );
       
        break;
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}

Robiłem wszystko według kursu na tej stronie. Jednak gdy kompiluję i uruchamiam program mogę zobaczyć kwadracik na zaznaczenie, ale nie mogę zaznaczyć. Kwadracik nie jest wcale szary i gdy klikam nie odtwarza się dźwięk błędu, jest checkbox, ale nie mogę go zaznaczyć. Jak to naprawić? Proszą o szybką pomoc.
P-65180
xevuel
» 2012-09-18 23:05:46
» Kurs WinAPI, C++ » PodstawyKontrolki lekcja
Przeczytaj do końca.
P-65182
Lotherad
Temat założony przez niniejszego użytkownika
» 2012-09-19 08:10:35
Przeczytałem i dalej nie wiem (wina wczesnej pory). Możesz wytłumaczyć?
P-65187
DejaVu
» 2012-09-19 12:24:42
checkbox jest przyciskiem, a więc po jego kliknięciu trzeba do kontrolki wysłać notyfikację informującą o zmianie jego wyglądu (zaznacz/odznacz).
P-65189
Lotherad
Temat założony przez niniejszego użytkownika
» 2012-09-19 14:13:18
Zmieniłem z checkbox'a na button i nic się nie dzieje po wciśnięciu przycisku:

C/C++
#include <windows.h>
HWND g_hPrzycisk;
MSG Komunikat;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShow )
{
    WNDCLASSEX wc;
   
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.lpfnWndProc = DefWindowProc;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = 0;
    wc.lpszClassName = "NKlasy";
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Code 1", "Error", MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    HWND hwnd;
    hwnd = CreateWindowEx( 0, "NKlasy", "Save saver alpha", WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 240, 320, NULL, NULL, hInstance, NULL );
    g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Przycisk", WS_CHILD | WS_VISIBLE, 50, 50, 150, 50, hwnd, NULL, hInstance, NULL );
    ShowWindow( hwnd, nShow );
    UpdateWindow( hwnd );
   
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
    case WM_COMMAND:
        if(( HWND ) lParam == g_hPrzycisk )
             MessageBox( hwnd, "Nacisnąłeś przycisk!", "Ha!", MB_ICONINFORMATION );
       
        break;
       
    case WM_CLOSE:
        DestroyWindow( hwnd );
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}
P-65192
Mrovqa
» 2012-09-19 18:54:04
Nie rozumiesz... Gdy naciśnie się na Checkboxa, to zostaje wysłane powiadomienie do pętli obsługującej komunikaty. Musisz odebrać ten komunikat, odczytać aktualny stan checkboxa i wysłać komunikat do niego, by zmienił stan na przeciwny. Wszystko jest w lekcji - źle czytasz.
P-65209
przemool11196
Przykład
» 2014-05-30 23:45:40
Mógłbyś podać jakiś przydał jak to powinło wyglądać??
P-111136
Moorfox
» 2014-05-31 02:26:59
Napisane jest na samym końcu
C/C++
HWND g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Checkbox", WS_CHILD | WS_VISIBLE | BS_CHECKBOX,
100, 100, 150, 30, hwnd, 500, hInstance, NULL );
//To czesc wrzucic gdzies indziej:
BOOL bChecked =( IsDlgButtonChecked( hwnd, 500 ) == BST_CHECKED );
if( bChecked )
{
    CheckDlgButton( hwnd, 500, BST_UNCHECKED );
}
else
{
    CheckDlgButton( hwnd, 500, BST_CHECKED );
}
Pomyśl jeszcze gdzie tego if'a trzeba wrzucić masz to w temacie Kontrolki, a widnieje tam wielki napis "Identyfikowanie kontrolek w komunikatach"
P-111142
« 1 » 2
  Strona 1 z 2 Następna strona