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: #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: 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ść ;( |
|
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. |
|
DejaVu |
» 2012-12-23 17:42:39 |
|
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 |
|
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 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. |
|
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: 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. |
|
xevuel |
» 2012-12-25 16:15:16 Daj aktualny kod, po zadeklarowaniu globalnie hwnd. |
|
miadko Temat założony przez niniejszego użytkownika |
» 2012-12-25 19:07:38 W pliku zasobów mam: #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: #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; }
|
|
« 1 » 2 |