Autor Wątek: Notes - narzędzie do tworzenia prostych plików tekstowych.  (Przeczytany 2969 razy)

Offline Vipa

  • Redaktor

  • +2
# Lipiec 13, 2020, 13:28:51
Hejka,
piekło zamarzło i wróciłem do kodowania ;). Gier już się narobiłem opór to teraz czas na narzędzia. Żeby rozpocząć od czegoś bezstresowego wziąłem się za winapi. Tak, ja też się teraz śmieję z tego "bezstresowego".
Chciałem zrobić coś szybkiego do edycji shaderów i wyszło coś więcej.

Ogólnie program to notatnik z paroma funkcjami, których mi zawsze brakowało:
- numerowanie wierszy
- znaczniki jak w devie czy code blocks (ctrl+cyfra i alt+cyfra)
- widok czarny
- tworzenie kopii pliku - tworzy kopię pliku z datą i godziną a my dalej pracujemy na oryginale - dla mnie mega!
- zaznaczenie flagi "tylko do odczytu" - ile razy potraciłem zawartość pliku przez szaleństwa z ctrl+c i v...
- tablica znaków odpalana z menu
- uruchamianie napisanych w programie plików wsadowych z menu (to bardziej do pracy, ale zostało)

Może komuś jeszcze się przyda. Screenów nie zamieszczam bo nie ma to sensu - ot wygląda jak notepad.exe.
Wiem, są notepady++, jakieś kombajny do GLSL itd. ale jak można mieć coś swojego to zawsze fajniej ;).

Pobierz

Jakby jakaś dobra dusza powytykała mi błędy (code included) to także się nie obrażę. Zaznaczam - nie jestem magikiem w tym ustrojstwie.

Miłej zabawy ;). Pozdrawiam wszystkich, którzy dalej zaglądają na Warsztat    \m/

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline kubera

  • Użytkownik
    • Prywatna strona

# Lipiec 14, 2020, 18:54:37
Działa :)

Offline Vipa

  • Redaktor

# Lipiec 15, 2020, 22:17:13
Działa :)
No, starałem się ;). W przypadku tego programu przynajmniej nie ma kombinacji alepejskich z kompilacją shaderów pod sterownikiem Intela czy też permanentnych kłopotów z wydajnością nakładania się przezroczystych obiektów. Już nawet nie wspomnę o ciągłych kłopotach z nowymi sterownikami pod ATI.

Odpoczywam... :D

Nowa wersja udostępniona, link ten sam.
- Dodałem wyszukiwanie następnego wystąpienia wyrażenia po zamknięciu okna dialogowego szukania, pod F3. Tu także drobna zmiana w porównaniu do notatnika - po wyszukaniu ostatniego wystąpienia szukanej frazy, karetka przesuwana jest na początek pliku co umożliwia szukanie od początku bez konieczności otwierania nowego dialogu wyszukiwania.
- Doszła także opcja wyczyszczenia wszystkich znaczników.
- Jest też przejście na początek i koniec pliku z menu i za pomocą skrótów klawiaturowych.
- Doszła także drobna reorganizacja menu - krótsze nazwy opcji są wyżej. Stwarza to wrażenie większej czytelności. Choć kto teraz zwraca na to uwagę - RIP wordowski Spinacz :(.

Myślałem, że bez rich edit będzie mało możliwości, a tutaj proszę ;).

Offline st3tc

  • Użytkownik

  • +2
# Listopad 03, 2020, 16:59:47
Cześć
Odgrzewam kotlet, ale i tak mało się dzieje ;)

Tak na szybko kilka punkcików

1. jak używasz STL to może nie dawaj rozszerzenia *.c, od tak dla czytelności + domyślnego interpretowania przy kompilacji ;)

2. w 1654 w HWND wpisujesz booleana (g_findhWnd & g_replacehWnd), HWND to wskaźnik, nie wszystkie kompilatorki to puszczą (dałbym nullptr)

3.    HRESULT hResult = PrintDlg(&pd);
   if (hResult == 0) return false;
To jest dziwnie zapisane. Będzie działać ale PrintDlg zwraca BOOL, a HRESULT 0 to S_OK, więc jak hResult będzie S_OK to uciekasz, a jak S_FALSE to kontynuujesz... ;)

4. Tu są małe błędy (i inne linijki tego typu) :         CheckMenuItem(hMenu, CM_VIEW_CLOCK, MF_BYCOMMAND | (statusclock) ? MF_CHECKED : MF_UNCHECKED);
         CheckMenuItem(hMenu, CM_VIEW_STATB, MF_BYCOMMAND | (statusbar) ? MF_CHECKED : MF_UNCHECKED);
         CheckMenuItem(hMenu, CM_VIEW_NUMB, MF_BYCOMMAND | (linenumber) ? MF_CHECKED : MF_UNCHECKED);
         CheckMenuItem(hMenu, CM_VIEW_NEGAT, MF_BYCOMMAND | (negative) ? MF_CHECKED : MF_UNCHECKED);
         CheckMenuItem(hMenu, CM_FORM_LEFT, MF_BYCOMMAND | (leftalign) ? MF_CHECKED : MF_UNCHECKED);
         CheckMenuItem(hMenu, CM_FORM_RIGHT, MF_BYCOMMAND | (rightalign) ? MF_CHECKED : MF_UNCHECKED);
         CheckMenuItem(hMenu, CM_VIEW_HRULER, MF_BYCOMMAND | (hshowruler) ? MF_CHECKED : MF_UNCHECKED);
         CheckMenuItem(hMenu, CM_VIEW_VRULER, MF_BYCOMMAND | (vshowruler) ? MF_CHECKED : MF_UNCHECKED);
Operator | ma wyższy priorytet nad ?:, więc najpierw będzie ustawienie bitków a dopiero porównanie. Działa Ci fuksem tylko dlatego, że MF_BYCOMMAND ma wartość 0. Zmień sobie na coś innego (dla testu) i zobaczysz, że bez względu na sprawdzanego booleanka zawsze dostaniesz MF_CHECKED. Nawiasik powinien objąć całe wyrażenie ?:

4. To linenumber (ifek) tak ma być ? :) Może czytelniej by było nie miksować z case-ami
LRESULT CALLBACK NewWndProc(HWND hwnd, UINT mesg, WPARAM wParam, LPARAM lParam)
{
   switch (mesg)
   {
      if (linenumber)
      case WM_KEYDOWN:
      {
         int hml = (int)SendMessage(g_hEdit, EM_GETLINECOUNT, 0, 0);

5. Tu masz malutkie wycieki z HDC. Linijki 1409 i 1427. Powinien być ReleaseDC dodany.
                  HDC hdc = GetDC(g_hEdit);
                  SetTextAlign(hdc, TA_LEFT);
                  rightalign = false; leftalign = true;
                  HMENU hMenu = GetMenu(hwnd);
                  CheckMenuItem(hMenu, CM_FORM_LEFT, MF_BYCOMMAND | (leftalign) ? MF_CHECKED : MF_UNCHECKED);
                  CheckMenuItem(hMenu, CM_FORM_RIGHT, MF_BYCOMMAND | (rightalign) ? MF_CHECKED : MF_UNCHECKED);
               }
               break;

Pzd.
« Ostatnia zmiana: Listopad 03, 2020, 17:03:55 wysłana przez st3tc »

Offline Vipa

  • Redaktor

# Listopad 23, 2020, 15:51:08
Dzięki!

nullptr, mimo dodania supportu dla c++ 11, nie chce mi uznać. Pewnie to wina mojego wspaniałego devcpp, na razie dałem nulla, choć to żadna różnica ;). Postaram się przesiąść na jakieś nowoczesne IDE.

"Projekt" dalej rozwijany, dodałem kilka funkcji jak np. linijki pionowe i poziome czy screenshot ekranu programu. Poprawiłem też wykrywanie capsa i reszty locków.

Pobierz

Offline st3tc

  • Użytkownik

  • +1
# Listopad 24, 2020, 13:38:55
Nie zauważyłem wcześniej, tutaj masz błąd przy drukowaniu (linijka 1151):

SendMessage(g_hEdit, EM_GETLINE, (WPARAM)iLineNum, (LPARAM)szBuffer);
TextOut(prn, tmargin, (yChar * iLine) + pagemargin.top, szBuffer, strlen(szBuffer));

EM_GETLINE nie ustawia null-terminatorka na końcu stringa, więc drukują się głupotki. Np. jeśli pierwsza linijka była dłuższa od następnej to kolejna, krótsza linijka będzie też zawierać poprzednią, nie mówiąc już jak w buforku będą śmieci :)

EM_GETLINE zwraca ilość znaków, więc takie coś np. powinno pomóc:

long length = SendMessage(g_hEdit, EM_GETLINE, (WPARAM)iLineNum, (LPARAM)szBuffer);
TextOut(prn, tmargin, (yChar * iLine) + pagemargin.top, szBuffer, length);

Pzd.

Offline Vipa

  • Redaktor

# Dzisiaj o 12:18:07
Dzięki!

Pakiecik zaktualizowany.