Skocz do zawartości

Static i ListBox - 2 problemy :(


Ray

Recommended Posts

Do ustawiania tekstu w staticu i edicie używasz funkcji SetWindowText. I to tutaj tkwi problem, gdyż funkcja ta służy do innych celów. Zamiast tego skorzystaj z SetDlgItemText(podając uchwyt okna-rodzica oraz id kontrolki), bądź wyślij bezpośrednio do kontrolki komunikat WM_SETTEXT.

 case 201:
{
/*
Tu pojawia się mój pierwszy problem.
Chcę, aby po kliknięciu w button Szukaj, w staticu hPoletxt[1]
pojawił się tekst "!!!", jednak się nie pojawia :(
*/
// id hPoletext[1] to 251
SetDlgItemText(hwnd, 250 + 1, "!!!");
break;
} 

Teraz listbox. Z tego co pomiętam, rodzic jest zawiadamiany o podwójnym kliknięciu w listboxie poprzez komunikat LBN_DBLCLK. Musisz więc zmienić:

 case 209: // ListBox

/*
Tu pojawia się mój drugi problem
Chcę, aby po podwójnym kliknięciu na element z listboxa
zawartosc pola została skopiowana do pola hEdit1
*/
{
// intrukcja switch, która tu się znajdowała, jest zbędna :P
if (HIWORD(wParam)==LBN_DBLCLK)
{
index = SendMessage (hList, LB_GETCURSEL, 0, 0 ) ;

// to LB_GETTEXT było wysyłane do hwnd... Rozumiem, że to tylko niedopatrzenie :P
SendMessage (hList, LB_GETTEXT, index, (LPARAM) wyraz ) ;
SetDlgItemText(hwnd, 207, wyraz);
return 0;
}
break;
}

A tak na marginesie, to nie rozumiem, dlaczego wszystkie zmienne są globalne i zadeklarowane na początku programu... Nawyki z Pascala(Delphi)? Niewiem jak sądzą inni, ale dla mnie kod staje się przez to mniej czytelny. Pozdrawiam.

Link do komentarza
Udostępnij na innych stronach

Thx. ListBox działa bez żadnych problemów za co wielkie dzięki.
Jednak pojawia się problem z

case 201:
{
/*
Tu pojawia się mój pierwszy problem.
Chcę, aby po kliknięciu w button Szukaj, w staticu hPoletxt[1]
pojawił się tekst "!!!", jednak się nie pojawia :(
*/
// id hPoletext[1] to 251
SetDlgItemText(hwnd, 250 + 1, "!!!");
break;
}

Program nie zmienia tekstu w staticu. Próbowałem dodać:
UpdateWindow(hPoletxt[1]);
ale nic nie pomogło.

Posłuchałem rady i użyłem WM_SETTEXT:


case 201:
{
char *lpsz="test";
lParam = (LPARAM)(LPCTSTR)lpsz;
SendMessage(hPoletxt[1], WM_SETTEXT, 0,lParam);
break;
}

Jednak to również nie dało żadnego skutku :(
Nie wiem co dalej z tym robić :(
Może źle zadeklarowałem Static ??

Używam kompilatora: C++BuilderX
Mam WinXP Home

Link do komentarza
Udostępnij na innych stronach

Błąd popełniasz przy tworzeniu statica. Na HMENU rzutujesz jedynie wartość 250, a dopiero potem dodajesz do tego i. To powoduje, że id kontrolki jest inny, niż zamierzony. Aby to naprawić, wystarczy wstawić (250+i) w nawiasy :). Wtedy wartość całego wyrażenia będzie rzutowana na HMENU i w konsekwencji id kontrolki będzie miał właściwą wartość.

hPoletxt[i] = CreateWindow("static", "tekst", WS_CHILD | 
WS_VISIBLE, 11, 136+(i*18), 388, 18, hwnd, 
(HMENU)(250+i), hInst, NULL); 

Po tej zmianie SetDlgItemText będzie działał jak należy.

WM_SETTEXT nie działał ci, ponieważ zapomniałeś tablicę hPoletxt zadeklarować jako static (była usuwana zaraz po zakończeniu WM_CREATE), więc komunikat wysyłałeś do jakiegoś całkowicie dowolnego obszaru pamięci :P To by było na tyle. Pozdrawiam.

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...