Skocz do zawartości

Static i ListBox - 2 problemy :(


Recommended Posts

Napisano

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.

Napisano

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

Napisano

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.

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...