Winapi + wyświetlanie kodu C\C++

0

Witam
Pisze edytor dla programistów C & C++ na zaliczenie z JiTP.
Edytor ma wyświetlać tekst w kolorach. Np. komentarze na zielono, słowa kluczowe na niebiesko. Ma obsługiwać tabulatory itp.

Plik źródłowy jest wczytywany do struktury PLIK_ZRODLOWY, która wygląda tak

/
typedef struct LiniaTekstu
{
	unsigned int	iIloscZnakowWLini;
	TCHAR*			szTekst;
	void*			pPoprzedniaLiniaTekstu;
	void*			pNastepnaLiniaTekstu;
} LINIA_TEKSTU;


typedef struct PlikZrodlowy
{
	TCHAR			szSciezkaDoPliku[MAX_PATH];
	LINIA_TEKSTU*	pLinieTekstu;
	unsigned int	iIloscLiniTekstu;
} PLIK_ZRODLOWY;

Plik jest zapisany w pamięci linia po lini. I teraz pytanie. Jak najwydajniej napisać funkcje, która bedzie wyświetlała tekst w okienku?

udało mi się napisac funkcję, która wyświetla tekst znak po znaku. Sprawdza, czy kolejne dwa znaki są /* wtedy zmienai kolor na zielony a gdy */ na czarny. Gdy '//' to znów nazielony do końca lini. I niby okej, ale jest mało wydajna.

Gdy plik jest złożony z tysiąca lini lub więcej, funkcja itak drukuje je wszystkie w przypadku, gdy jest na ekranie jest wyswietlonych kilka ostatnich lini. (inaczej jest gdy wyswietla tylko poczatkowe linie). Wysweitla wszystkie dlatego, ze przy wyswietlaniu znaków sprawdza jakim kolorem je wydrukowac. Np. jesli w pierwszej lini byłby znak '/' a zamykający '/' w 1000 lini, to funkcja musiałaby widzieć o tym jesli chce wyswietlic linie z zakresu od 990 do 1010.
Jak to napisać optymalnie?

Kolejny problem to znaki tabulacji. Gdy funkcja napotka znak '\t' przesuwa licznik pozycji o 4*8 (gdzie 8 to szerokość jednegoznaku). Ale zobaczmy na dwa przykłady:

"przykład numer 1\t la la la"
"przykład dwa\t la la la"

zostaną wyświetlone tak

"przykład numer 1    la la la"
"przykład dwa    la la la"

tabulatory nie sa wyrównane, jak to obejść w najprostszy sposób


0

Z każdą linią skojarz kontener (np. kontener set), który będzię zawiarał dodatkową informacje o pozycjach znaków specjalnych, tzn. tych zmieniających styl lub kolor czcionki. Wtedy nie będziesz musiał przeszukiwać całych linii tylko same kontenery. Możesz je aktualizować na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) śledząc wpisywane zanki do edytora.
Co do tabulatora, to porostu przechwyć moment w którym jest wpisywany i nie wpisuj go do edytora (lub wykasuj jeśli został już wpisany), a zamiast niego wstawiaj określoną ilość spacji.

0

a zagladales tu http://sourceforge.net/projects/dev-cpp ?:>

co prawda napisane jest to w delphi ale moze sciagniesz jakies rozwiazanie

0

mógłbyś napisać przykład takiego kontenera na podstawie mojej struktury?
myślisz, żeby dopisać taki kontener do struktury czy stworzyć osobny?

A co do tabluatorów to wstawianie spacji odpada, właściwie to mam już pomysł, tylko niei wiem jeszcze jak go ładnie napisać.
Tabluator będzie co 4 znaki czyli będzie w pozycji 0, 32, 64, 96, 138 pixeli, ... itd. (bo jeden znak ma 8pixeli, w czciące, którą wykorzystuje)
Załóżmy, że wyświetle 8 znaków czyli 98 = 72. następnm znakiem jest znak '\t' czyli wyswitlanie tekstu powinno zaczac sie od 96, gdybym po prostu dodał 4 znaki tabulacji jak poprzednio to wyswietlanie zaczęło by się od 72+48 = 104...
ale teraz mam taki pomysł, że jak napotka znak tabulacji aktualna pozycje do wyswietlania liczy w ten sposób:
aktualna pozycja wyswietlania / (48) - i to zaokrągla w górę * 32
czyli 72/32 = 2,25 zaokrągla to w górę do 3 a potem 3
32 = 96

tylko teraz jaka funkcja zaokrągla w górę? bo nie chce mi sie szukać <leniwiec>

CyberKid

dzieki za to, na pewno przeglądne, szkoda, że nie w C
ma ktoś może jakieś kody źródłowe edytorów pisanych w C??
najlepiej prostych edytorów, bez rzadnych bajerów</url>

już nie potrzebuje zaokrągląc zapisałem funkcję tak:
t - aktalna pozycja wyświetlanej litery

t = t / 32;
t+= 1;
t*= 32;
0

A musisz mieć w C ? Użycie kontenera set jest banalne, trzeba mieć tylko kompilator C++. Jak musisz mieć to w C to musisz napisać liste z wskaźnikami w obie strony, sortowaną po indeksie jakim jest pozycja znaku specjalnego w lini. W kontenerze zapisujesz numer znaku specjalnego. Wszystkie zmiany śledzisz na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) kontrolując, jakie znaki są wpisywane. </cpp>

0

mogłobybyć w C++, ale już zacząłem pisać w czystym C i tak projekt oddaje

mógłbyś dać jakiś przykład?

pojawił się jeszcze jeden problem..
jak sprawdzać słowa kluczowe? znak po znaku? zna ktoś jakiś szybszy sposób?

0

Googluj !
Elementy listy sortuj względem pozycji znaku, da ci to swobode w poruszaniu sie po niej i wyszukiwaniu.

Taki element wyglądałby mniejwięcej tak:

typedef struct
{
   int znak_specjalny;
   int pozycja_znaku;
   void * nastepny_element;
   void * poprzedni_element;
} element;

typedef struct lista
{
   element* pierwszy;
   element* ostatni;
   funkcje wstawiania, usuwania ...
};

pojawił się jeszcze jeden problem..
jak sprawdzać słowa kluczowe? znak po znaku? zna ktoś jakiś szybszy sposób?

Podczas otwarcia nowego pliku musisz sprawdzić wszytkie znaki. A później już tylko na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) aktualizujesz listy ze znakami specjalnymi i nic nie muszisz sprawdzać.

0

witam
dzięki za odpowiedzi.. dzisiaj oddałem część projektu, prof. był bardzo zadowolony (dał mi cenę cząstkową 5.0), ale nadal nie ukończone jest wyświetlania tekstu w kolorze...
tak sobie dzisiaj pomyślałem, żeby znaki specjalne dodawać bezpośrednio do tekstu przy wczytywaniu.. np. tak jak znakiem nowej lini jest \n a znakiem końca stringu jest \0. dodałbym znak specjalny, który oznaczałby zmiane koloru. Potrzebowałbym kilka odmian tego znaku na różne kolory (osobny kolor komentarzy inny dla słów kluczowych itp). I tu mam problem, bo nie wiem jakie znaki mógłbym wykorzystać. Chcę korzystać z UNICODu.

A co do UNICODU to mam jeszcze jeden problem, otóż nie wyświetla mi polskich znaków poprawnie. Kompiluje program z defunicją UNIOCDE. Używam biblioteki <tchar.h>.. i zmiennej zdefioniowanej TCHAR, a także uniocodowych wersji funkcji, a jednak polskich znaków nie ma.. Zastanawiam się gdzie jest błąd. Być może po stronie czcionki? Jak myślicie?

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