Edity w WinApi

0

Mam pewien problem. Otóż Muszę wyświetlić tekst ze zmiennej LPSTR w polu typu EDIT lub STATIC.
Załóżmy, że moja zmienna LPSTR ( char )* zawiera nastepujący napis:

LPSTR Bufor = "Imię \n Nazwisko \n Data \n" 

Wszystko się komplikuje, kiedy chcę wyświetlić ową zmienną. Chcę zaznaczyć, że konieczny jest pionowy pasek przewijania.
Tak wygląca mój static, a tak Edit

 tekst = CreateWindowEx(0, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 151, 1, 617, 150,hwnd, NULL, hInstance, NULL );
 tekst = CreateWindowEx(0, "STATIC", "", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 151, 1, 617, 150,hwnd, NULL, hInstance, NULL );

A więc zaczynamy.

Przy wyświetlaniu w polu EDIT kompilator omija znaki \n (tzn. nie przechodzi do nastepnej linijki), a tekst wyświetlony jest następujący: "Imię Nazwisko Data".
Natomiast przy polu STATIC tekst wyświetla się poprawnie, ale niestety SCROLLBAR źle działa. (widać go, ale jest on nieaktywny i nie przewija tekstu).

Proszę o pomoc w rozwiązaniu jednego z tych 2 problemów.
Głowiłem się z tym długo i nic nie wymyśliłem, a z internetu tylko w szkole korzystam i googluję, ile mogę.

0

Temat zamykam :) Udało mi się samemu rozwiązać problem.

W edicie zamiast \n można wstawić \r\n i wszystko gra.

0

Ehhh... jednak mam jeszcze jeden problem z Editami. Otóż mam zmienną LPSTR Bufor w której przetrzymuję długi tekst (ok. 4000 znaków). Po wywołaniu funkcji SetWindowText(Edit, Bufor); w Edicie pojawia się tylko zaledwie połowa tekstu, który powinien być wyświetlony. Szukałem w Google, ale nawet 1 strony nie znalazłem.
Coś robię źle, czy może w Edicie jest jakieś ograniczenie co do ilości wyświetlanego tekstu? A może to Bufor nie przyjmuje takiej ilości danych?

Proszę o pomoc.

0

Bracie,bo o WinAPI to nie gógli się pyta,ino MSDN Online:
http://social.msdn.microsoft.com/Search/en-US?query=edit%20control&ac=1

0

"Bad Request
HTTP Error 400. The request is badly formed."

Niestety nie wczytuje mi tej strony :( . jest jakaś inna żebym mógł w tej dokumentacji pogrzebać :) ??

i tak w nawiasie zmienna char* przechowuje adres pierwszej komórki tekstu, więc tekst może być tak długi, na ile pozwala mi pamięć tak?
Bo nie wiem, czy dobrze rozumuję.

0

A jaką wartość zwraca EM_GETLIMITTEXT? Jeśli się nie mylę EDIT może zmieścić 64 tysiące znaków. Czy wspomniany "LPSTR Bufor" nie zawiera w środku znaków '\0'? Możesz też spróbować ustawić limit tekstu za pomocą EM_SETLIMITTEXT

0
 
Bufor1 = "Osoby do wykwaterowania:\r\n";
dlugosc = GetWindowTextLength( MENU3_data );
Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
GetWindowText( MENU3_data, Bufor, dlugosc + 1 ); //pobieram tekst z edita (czyli datę) i wypełniam tym tekstem "Bufor"
strcpy( datado, Bufor ); //kopiuję tekst z "Bufor" do tablicy "char datado[10]"
for(help = 0; help < 201; help++) //w mojej strukturze jest max 201 osob
{ 
	if(osoba[help].czyste_pole == false) //ta zmienna okresla, czy w danej strukturze jest jakaś osoba,jeśli pole jest false, to tak
        {
        	Bufor = osoba[help].data_wybycia; // Wypelniamy bufor datą wykwaterowania jednostki
                strcpy( skopiowany, Bufor ); // wypelniamy tablice "char skopiowany[2000]" tekstem z Bufora
                if(skopiowany[0] == datado[0] && skopiowany[1] == datado[1] && skopiowany[2] == datado[2] && skopiowany[3] == datado[3] && skopiowany[4] == datado[4] && skopiowany[5] == datado[5] && skopiowany[6] == datado[6] && skopiowany[7] == datado[7] && skopiowany[8] == datado[8] && skopiowany[9] == datado[9])
//jezeli osoba ze striktury okreslonej w zmiennej help ma taka sama date wykwaterowania jak ta ktora wpisalismy w edicie to ma dodac do Bufora1 jej imie                
               {
                	kolejka++;
                        //wyswietlanie danych o osobie (dodanie )
                        Bufor2 = "\r\n"; wsprintf (polaczone_stringi, "%s%s", Bufor1, Bufor2);Bufor1 = polaczone_stringi;
                        Bufor2 = osoba[help].nazwa; wsprintf (polaczone_stringi, "%s%s", Bufor1, Bufor2);Bufor1 = polaczone_stringi;
                } 
        }
}
//pod koniec ma wyswietlic w drugim edicie zawartosc Bufora1, czyli imiona osob, ktore maja ta sama date wykwaterowania.
SetWindowText(MENU3_wykwaterowani, Bufor1);
Bufor = ""; Bufor2 = ""; Bufor1 = "";

Moje 2 Edity wyglądają tak:

  1. miejsce na wpisanie daty w formacie (dd.mm.rrrr)
MENU3_data = CreateWindowEx(1, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_CENTER, 1, 275, 326, 22,hwnd, NULL, hThisInstance, NULL );
  
  1. edit służący do wyświetlania tych osób:
MENU3_wykwaterowani = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_READONLY| ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL, 425, 1, 400, 500,hwnd, NULL, hThisInstance, NULL );
  

Nie wiem co mam zrobić żeby mogło mi w nim wyświetlić cały Bufor1...

0

@Tomek2

Nie mam pojęcia jak użyć EM_GETLIMITTEXT. Doczytałem, że lParam i wParam mają być równe 0. To przez SendMessage() mam używać? Jeśli tak to w jaki sposób? Bo z Microsoftu nic nie kumam ;/

Edit:

Znalazłem na innym forum coś takiego.

 lResult = SendMessage(
(HWND) hWndControl,       // control handle
(UINT) EM_GETLIMITTEXT,   // message ID
(WPARAM) wParam,
(LPARAM) lParam
);

I zrobiłem to tak. Chyba źle użyłem konwertowania zmiennych bo wynik pokazuje mi 0 :(
Nie wiem czy dobrze przekonwertowałem LRESULT aa do LPSTR Bufor

 aa = SendMessage(MENU3_wykwaterowani, EM_GETLIMITTEXT, 0, 0);
                 ab = aa;
                Bufor = &ab;
                        
                MessageBox(0,Bufor,"",MB_OK);
0

Jezeli nie upierasz sie bardzo przy kontrolce Edit to moze sprobuj Rich Edit i bankowo bedziesz mogl wyswietlic taki tekst ;)

http://msdn.microsoft.com/en-us/library/windows/desktop/bb787605%28v=VS.85%29.aspx

0

@araso

Hmm... RichEdit wydaje się ciekawszy niż Edit ^^. Ale czy będę mógł go ukrywać za pomocą ShowWindow()? Czy RichEdit jest taką samą kontrolką jak Edit tylko ulepszoną?

1

EM_GETLIMITTEXT - tak, użyj SendMessage()

Co do kodu: alokujesz pamięć GlobalAlloc(), potem w "for" nadpisujesz wskazujący na nią wskaźnik Bufor i nigdzie nie zwalniasz (brak GlobalFree()).
Rozlazłą formę "if(skopiowany[0] == datado[0] && ..." można zapisać jako strncmp(skopiowany, datado, 10).
wsprintf - http://msdn.microsoft.com/en-us/library/windows/desktop/ms647550%28v=vs.85%29.aspx - "The buffer that is to receive the formatted output. The maximum size of the buffer is 1,024 bytes.". Czy przypadkiem nie przekraczasz tej wartości? Do łączenia napisów użyj strcat/strncat.

0

1:

Bufor2 = "\r\n";                 
strncat(Bufor1,Bufor2,5);
Bufor2=osoba[help].nazwa;
strncat(Bufor1,Bufor2,50); // ponieważ osoba[help].nazwa nie bedzie wieksze niz 50 znakow

2:

Bufor2 = "\r\n";                 
strcat(Bufor1,Bufor2);
Bufor2=osoba[help].nazwa;
strcat(Bufor1,Bufor2); 

Problem:
W obu przypadkach otrzymuję komunikat "wyślij raport o błędach" (nie wiem jak się nazywa ten komunikat). Co jest źle?

1

Czy Bufor 1 to to?
Bufor1 = "Osoby do wykwaterowania:\r\n";

Jeśli tak, to się nie dziwię - chcesz nadpisać literał znakowy. Proponuję zajrzeć tu: http://www.cplusplus.com/reference/clibrary/cstring/strcat/

0

To jak mam char polaczone_stringi[4084] i wypełniam tę tablicę spacjami (ponieważ używam jej w wielu przypadkach i mam w niej różne śmieci) , to jak mogę zrobić, aby dopisywało mi do tablicy od początku? Jak wyczyścić tę tablicę? polaczone_stringi = ''; nie działa.

0

JEST ! :D UDAŁO MI SIĘ ! ^^ Problem leżał w wsprintf... Nigdy bym na to nie wpadł. Teraz mogę lecieć dalej. Jestem Ci dozgonnie wdzięczny ^^

0

Do pisania w połączone_stringi użyj strcpy() podając odpowiedni indeks jako początek, gdzie ma zacząć pisać. Pamiętaj, że strcat() "The terminating null character in destination is overwritten by the first character of source ...", czyli zawsze będzie szukał kończącego znaku 0 i dopisywał począwszy od niego.

No i "=" nie działa, bo działasz na wskaźnikach, czyli co najwyżej przypiszesz jeden wskaźnik do drugiego. Rozumiem, że piszesz aplikację w WinAPI, ale takie podstawy przydałoby się opanować dla własnej wygody i oszczędnści czasu.

0

Jej... fakt. Ale ja jestem ...gapa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1