nairu Temat założony przez niniejszego użytkownika |
[WinApi] ComboBox - ustalanie listy wyboru drugiego Combo w zaleznosci od wybrania pozycji z pierwszego » 2014-07-21 22:27:29 Witam, Mam problem - nie wiem jak uzaleznic elementy wyswietlane w comboboxie od wyboru konkretnego elementu z pierwszego comboboxa. Mam dwie listy - pierwsza z mozliwosciami wyboru "aaa" i "bbb". Jesli wybiore "aaa", to w drugim comboboxie chce, zeby pojawily sie do wyboru opcje "111" i "222", natomiast jesli w pierwszym wybiore "bbb", to chcialbym w drugim moc wybrac miedzy "333" i "444". Kod, ktory mam, niestety nie dziala zbyt dobrze. W main.cpp nic nie robilem, wiec wklejam sam LRESULT CALLBACK WindowProcedure. Calosc funkcji siedzi w combo.cpp, wiec ten plik wklejam w calosci. Plik naglowkowy to tylko deklaracje funkcji, wiec tez nie wklejam. Bede wdzieczy za pomoc. main.cpp: LRESULT CALLBACK WindowProcedure( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_CREATE: { CreateCbox( hwnd ); CzytajPlik( 1 ); break; } case WM_COMMAND: { switch( LOWORD( wParam ) ) { case 101: { SprawdzWartosc(); break; } case 102: { CzytajPlik( 2 ); break; } } break; } case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hwnd, message, wParam, lParam ); } return 0; }
plik combo.cpp: #include <windows.h> #include <fstream> #include <sstream> #include <string> #include "combo.h"
using namespace std;
HWND cbox1, cbox2;
int aa =- 1;
void CreateCbox( HWND shwnd ) { cbox1 = CreateWindowEx( NULL, "COMBOBOX", NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, 10, 10, 150, 100, shwnd,( HMENU ) 101, GetModuleHandle( NULL ), NULL ); cbox2 = CreateWindowEx( NULL, "COMBOBOX", NULL, WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, 200, 10, 150, 100, shwnd,( HMENU ) 102, GetModuleHandle( NULL ), NULL ); } void CzytajPlik( int box ) { string liniabiezaca; string typ, wartosc; fstream plik( "baza.txt" ); while( getline( plik, liniabiezaca ) ) { plik >> typ >> wartosc; switch( box ) { case 1: { if( typ == "data1" ) { SendMessage( cbox1, CB_ADDSTRING, 0,( LPARAM ) wartosc.c_str() ); } break; } case 2: { if( aa = 0 ) { if( typ == "dataaaa" ) { SendMessage( cbox2, CB_ADDSTRING, 0,( LPARAM ) wartosc.c_str() ); } } else if( aa = 1 ) { if( typ == "databbb" ) SendMessage( cbox2, CB_ADDSTRING, 0,( LPARAM ) wartosc.c_str() ); } break; } } } } void SprawdzWartosc() { aa = SendMessage( cbox1, CB_GETCURSEL, 0, 0 ); }
korzystam z zapisanej w pliku tekstowym bazy danych: ------pierwszy box----- data1 aaa data1 bbb -----drugi box----------- dataaaa 111 dataaaa 222 databbb 333 databbb 444 |
|
Monika90 |
» 2014-07-21 23:56:08 Nie dość że używasz zmiennych globalnych, to jeszcze mają nic nie mówiące nazwy jak np. aa. warunek nigdy nie jest spełniony, na dodatek zmienia wartość aa warunek zawsze jest spełniony i zmienia wartość aa |
|
nairu Temat założony przez niniejszego użytkownika |
» 2014-07-22 09:43:02 Hah, tragiczna w skutkach literowka :D. Tak, uzywam zmiennej globalnej w tym przykladzie - kod pisany na potrzeby pokazania mechanizmu reakcji comboboxow. W programie, do ktorego to potrzebuje jest zamiast tego obpowiednie zmienna w ramach obiektu - tak mam nadzieje moze juz byc. Nawet jednak po poprawie literowki program nie robi tego, co powinien. Dla zainteresowanym rozwiazaniem jest wyczyszczenie zawartosci comboboxa: SendMessage( cbox2, CB_RESETCONTENT, 0, 0 ); . Ta linijka wyladowala w funkcji Sprawdz wartosc . Zastanawia mnie natomiast dlaczego gdy wrzuce Sprawdz wartosc do case 101, czyli odczytania wiadomosci z cbox1, a do case 102 CzytajPlik( 2 ); , to w cbox2 pojawia mi sie cztery pozycje, zamiast dwoch. Rozwiazaniem jest umieszczenie wszyzstkiego w procedurze zdarzeniowej dla cbox1, ale wciaz nie wiem dlaczego tak sie dzieje. Bede wdzieczny za odpowiedz. |
|
« 1 » |