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

Sprawdzenie, czy checkbox jest zaznaczony

Ostatnio zmodyfikowano 2012-12-27 15:01
Autor Wiadomość
miadko
Temat założony przez niniejszego użytkownika
Sprawdzenie, czy checkbox jest zaznaczony
» 2012-12-23 17:04:48
Witajcie

Stworzyłem sobie plik .rc:
C/C++
#include <windows.h>
#define IDD_DIALOG 100
#define IDC_LOGIN 101
#define IDMOMA 300
IDD_DIALOG DIALOG DISCARDABLE 20, 20, 190, 46
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Logowanie"
FONT 9, "MS Sans Serif"
{
    AUTOCHECKBOX "Ptaszek", IDMOMA, 5, 25, 180, 14
    DEFPUSHBUTTON "&OK", IDOK, 80, 25, 50, 14
    PUSHBUTTON "&Anuluj", IDCANCEL, 135, 25, 50, 14
}
w którym jest pewien przycisk, który można zaznaczyć ptaszkiem lub nie.

i dla przycisku OK chciałem, żeby jakiś statyczny element zmieniał tekst w zależnosci od zaznaczenia pola w oknie dialogowym.
Jak napisałem:
C/C++
if( IsDlgButtonChecked( hwnd, 300 ) == BST_CHECKED )
{
    SetDlgItemText( hwnd, ID_STATICBM, "Zaznaczono" );
}
else
{
    SetDlgItemText( hwnd, ID_STATICBM, "Nie znaznaczono" );
}
to za każdym razem, nawet jak jest zaznaczone, wyświetla mi "Nie zaznaczono"

W oknie glównym mam:
#define ID_STATICBM 3050

i w funkcji głównej:
HWND hstatic = CreateWindowEx( 0, "STATIC", "Tekst bez zmian", WS_CHILD | WS_VISIBLE, 5, 35, 250, 25, hwnd,( HMENU ) ID_STATICBM, hInstance, NULL );

gdzieś robię błąd? Od dwóch dni nie mogę do tego dojść ;(
P-71754
xevuel
» 2012-12-23 17:41:45
ID_STATICBM i IDMOMA mają różnych rodziców, więc albo wywołanie
IsDlgButtonChecked( hwnd, 300 )
 albo
SetDlgItemText( hwnd, ID_STATICBM, "Nie znaznaczono" )
 jest nieprawidłowe.
P-71757
DejaVu
» 2012-12-23 17:42:39
http://cboard.cprogramming.com/windows-programming/555-radio-buttons.html

Sugeruję wyświetlić MessageBox-a z komunikatem czy checkbox jest zaznaczony czy też nie. Problemem może być bowiem fakt, że odświeżenie treści kontrolki na ekranie może wymagać wywołania funkcji InvalidateRect.
P-71758
miadko
Temat założony przez niniejszego użytkownika
» 2012-12-24 23:58:34
Zobaczyłem, co jest w tym linku, spróbowałem zrobić... alenic mi nie wyszło. Podejrzewam, że za każdym razem są różni rodzice kontrolek. Przyznam się szczerze, że troszkę tego nie rozumeim, bo IsDlgButtonChecked( hwnd, 300 )  wstawiłem w funkcji obsługującej okienko dialogowe, a SetDlgItemText( hwnd, ID_STATICBM, "Nie znaznaczono" ) też w niej, ale ta funkcja jest w głównym pliku cpp, gdzie też zdefiniowałem kontrolkę ID_STATICBM.

Tak czy siak:
1) Czy jest jakaś możliwość takiego stworzenia okna dialogowego, żeby nie było problemu z rodzicami okna, kiedy bada się kontrolki?
2) Jakbyście mieli taki problem i zrobilibyście to samo - jak naprawilibyście to? Jakoś inaczej napisalibyście warunki, użylibyście jakiegoś innego makra/funkcji/instrukcji.

Może po prostu nie wszystko zrozumiałem - byłbym wdzięczny, gdybyście spróbowali mi własnymi słowami jakoś objaśnić mi mój problem
P-71895
xevuel
» 2012-12-25 09:01:14
Jakbyście mieli taki problem i zrobilibyście to samo - jak naprawilibyście to? Jakoś inaczej napisalibyście warunki, użylibyście jakiegoś innego makra/funkcji/instrukcji.
Jaka wyrafinowana prośba o pomoc 8)

Tworzysz kontrolkę "w funkcji głównej"
HWND hstatic = CreateWindowEx( 0, "STATIC", "Tekst bez zmian", WS_CHILD | WS_VISIBLE, 5, 35, 250, 25, hwnd,( HMENU ) ID_STATICBM, hInstance, NULL );
której rodzicem jest hwnd, które pokazuje na główne okno aplikacji. Jednocześnie tworzysz też kontrolkę
AUTOCHECKBOX "Ptaszek", IDMOMA, 5, 25, 180, 14

Która skoro utworzona w dialogu, to jej rodzicem jest uchwyt do okna dialogowego. I teraz, jeśli
C/C++
if( IsDlgButtonChecked( hwnd, 300 ) == BST_CHECKED )
{
    SetDlgItemText( hwnd, ID_STATICBM, "Zaznaczono" );
}
else
{
    SetDlgItemText( hwnd, ID_STATICBM, "Nie znaznaczono" );
}
znajduje się w procedurze dialogu, a hwnd wskazuje na dialog, wywołując
SetDlgItemText( hwnd, ID_STATICBM, "Zaznaczono" );
 próbujesz się odwołać do elementu, który należy do innego rodzica, a więc nie zostanie on odnaleziony i tekst nie zostanie ustawiony.
P-71900
miadko
Temat założony przez niniejszego użytkownika
» 2012-12-25 15:43:58
Przyjąłem inne uchwyty, np. w procedurze dialogowej zamiast na przykład  hwnd przyjąłem na przykład drp. Wtedy napisałbym:
C/C++
if( IsDlgButtonChecked( drp, 300 ) == BST_CHECKED )
{
    SetDlgItemText( hwnd, ID_STATICBM, "Zaznaczono" );
}
else
{
    SetDlgItemText( hwnd, ID_STATICBM, "Nie znaznaczono" );
}

i na samym początku funkcji obsługującej dialog też wywalił hwnd a wstawił drp?
Spróbowałem tak zrobić, ale podczas kompilowania pokazało, że hwnd nie zostało zadeklarowane. Jest to jednak okna-rodzica z moją kontrolką, tyle że w funkcji głownej programu, a nie w funkcji obsługującej dialog.
Postanowiłem zatem przy tworzeniu okna zostawić samo hwnd = createwin... itd, a poza główną funkcję wystawić HWND hwnd; Wtedy juz jest zadeklarowane hwnd, wszystko się kompiluje... ale pomimo dwóch różnych uchwytów, wciąż źle działa... Podejrzewam (może xle) że to dlatego, że hwnd = createwin... znajduje się w funkcji głównej, a po za nią to po prostu samo hwnd.

Ogólnie rzecz biorac:
a) Czy takie zmienianie uchwytów możę podziałać?
b) Jeżeli może podziałać, popełniam gdzieś błąd?

Przepraszam może za głupie pytania, jakie może zadałem, ale troszeczkę nie ogarniam.
P-71907
xevuel
» 2012-12-25 16:15:16
Daj aktualny kod, po zadeklarowaniu globalnie hwnd.
P-71911
miadko
Temat założony przez niniejszego użytkownika
» 2012-12-25 19:07:38
W pliku zasobów mam:
C/C++
#include <windows.h>
#define ID_DIALOG 750
ID_DIALOG DIALOG DISCARDABLE 40, 40, 200, 86
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 9, "MS Sans Serif"
{
    AUTOCHECKBOX "&Ptaszek", IDRETRY, 24, 52, 50, 14
    DEFPUSHBUTTON "&OK", IDOK, 24, 18, 50, 14
    PUSHBUTTON "&Anuluj", IDCANCEL, 24, 35, 50, 14
}

W głównym pliku mam:
C/C++
#include <windows.h>
#define ID_STATICBM 3050
LPSTR NazwaKlasy = "Klasa Okienka";
HWND hwnd;
MSG Komunikat;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
BOOL CALLBACK DlgProc( HWND uchdial, UINT Msg, WPARAM wParam, LPARAM lParam );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    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 + 0 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Wysoka Komisja odmawia rejestracji tego okna!", "Niestety...",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Próbnia", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 480, 120, NULL, NULL, NULL, NULL );
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Okno odmówiło przyjścia na świat!", "Ale kicha...", MB_ICONEXCLAMATION );
        return 1;
    }
   
    HWND hPrzyc = CreateWindowEx( 0, "BUTTON", "Dialog", WS_CHILD | WS_VISIBLE, 5, 5, 50, 25, hwnd, NULL, hInstance, NULL );
    HWND hStatic = CreateWindowEx( 0, "STATIC", "Tekst bez zmian", WS_CHILD | WS_VISIBLE, 5, 35, 160, 25, hwnd,( HMENU ) ID_STATICBM, hInstance, NULL );
    ShowWindow( hwnd, nCmdShow );
   
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}

LRESULT CALLBACK WndProc( HWND dlp, UINT mesg, WPARAM wParam, LPARAM lParam )
{
    switch( mesg )
    {
    case WM_COMMAND:
        {
            int ret = DialogBox( GetModuleHandle( NULL ), MAKEINTRESOURCE( 750 ), dlp, DlgProc );
            if( ret == IDOK )
            {
                if( IsDlgButtonChecked( dlp, 300 ) == BST_CHECKED )
                {
                    SetDlgItemText( hwnd, ID_STATICBM, "Zaznacozno" );
                }
                else
                {
                    SetDlgItemText( hwnd, ID_STATICBM, "Nie zaznacozno" );
                } } }
        break;
       
    case WM_DESTROY:
        PostQuitMessage( 0 );
        break;
       
        default:
        return DefWindowProc( dlp, mesg, wParam, lParam );
    }
    return 0;
}
BOOL CALLBACK DlgProc( HWND hwNd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
    switch( Msg )
    {
    case WM_COMMAND:
        {
            switch( LOWORD( wParam ) )
            {
            case IDOK:
                {
                    EndDialog( hwNd, IDOK );
                }
                break;
               
            case IDCANCEL: EndDialog( hwNd, IDCANCEL ); break;
            } }
        break;
       
        default: return FALSE;
    }
    return TRUE;
}
P-71931
« 1 » 2
  Strona 1 z 2 Następna strona