Edity w WinApi

gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
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:

Kopiuj
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

Kopiuj
 tekst = CreateWindowEx(0, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 151, 1, 617, 150,hwnd, NULL, hInstance, NULL );
Kopiuj
 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ę.

gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
0

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

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

edytowany 1x, ostatnio: gswidwa
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
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.

edytowany 2x, ostatnio: gswidwa
MasterBLB
  • Rejestracja:około 19 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Warszawa
  • Postów:1454
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


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 1x, ostatnio: MasterBLB
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
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ę.

edytowany 2x, ostatnio: gswidwa
MasterBLB
dajesz w gógle "msdn online",a tam wyszukaj frazy "edit control".Niemniej sprawdź linka,klikałem i zadziałał
T2
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 9 lat
  • Postów:164
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

gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
0
Kopiuj
 
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)
Kopiuj
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:
Kopiuj
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...

gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
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.

Kopiuj
 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

Kopiuj
 aa = SendMessage(MENU3_wykwaterowani, EM_GETLIMITTEXT, 0, 0);
                 ab = aa;
                Bufor = &ab;
                        
                MessageBox(0,Bufor,"",MB_OK);
edytowany 2x, ostatnio: gswidwa
arasso12
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 5 lat
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


non omnis moriar i tyle :-)
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
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ą?

T2
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 9 lat
  • Postów:164
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.

gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
0

1:

Kopiuj
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:

Kopiuj
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?

gswidwa
ale ja sobie utrudniam życie :D zamiast konwertować daty na tablicę i porównywać komórka po komórce mogłem porównać 2 Bufory funkcją memcmp() :D
T2
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 9 lat
  • Postów:164
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/

edytowany 1x, ostatnio: Tomek2
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
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.

gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
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 ^^

T2
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 9 lat
  • Postów:164
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.

gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
0

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

arasso12
Wtrącę odpowiedź na Twoje pytanie z poprzedniej strony - Tak, będziesz mógł ukryć Rich Edit jak Edit'a. Pozdro
gswidwa
Przerzuciłem się na RichEdity :D , dobre ustrojstwo.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)