Funkcjonalne UI c++

0

Witam, jestem nowy na tym forum(a czytanie regulaminów jest nudne) więc z góry przepraszam jeżeli w złym miejscu zamieściłem temat.

Planuję zrobić aplikacje któa będzie coś robiła i poszukuję jakiegoś UI które spełni moje wymagania:

  • posiada jakiś container na który można rysować z poziomu kodu(najlepiej jak by były funkcje czyszczenia tego containera i rysowania propek/kresek).
  • jest łatwo dostępne z poziomu kodu (z tego powodu odrzucam windows forms).

Z góry dziękuję za pomoc, Kamil.

1

Zobacz Qt, na pewno są jakieś funkcje na to pozwalające.

0

A ja napiszę trochę odważnie. Może C++ Builder? Bez problemu zrobisz to o co Ci chodzi nawet w darmowej wersji.

0

:) W sumie to jeśli chodzi o qt itd. to chciałbym żeby kod ui był bardziej dodatkiem do już i tak rozbudowanego kodu programu niż jego główną częścią. Btw. program czyta w pamięci i zbiera dane itd... i właśnie chciałem w ui zrobić sobie log + jakaś interpretacja danych które w pamięci wyczytać, do tego potrzebuje rysować na ui tak jak np. w javie jest swing gdzie na studiach mieliśmy animowanie kulki w ui, czegoś takiego poszukuję pod c++ :)

3

@Kamil9132 moim zdaniem jeśli sensownie podzielisz kod oddzielając logikę od GUI to będzie dało się to zrobić w większości środowisk.

0

Na chwilę obecną po spróbowaniu kilku gui zostałem jednak przy win forms.

Znalazłem info jak sie maluje w win forms.

Jeśli chodzi o oddzielenie kodu itd... to tutaj mam lekkie schodki, aplikacja tworzy objekt głównej klasy która w konstruktorze tworzy forme, przypisuje do niej wskaźnik i odpala w nowym wątku funkcję która ma robić za updater programu. Mniej więcej to wygląda tak że w głównym wątku odpalona jest forma a w wątku pobocznym funkcja która cośtam ma robić i działać cały czas do zakończenia programu.

W hooku po zamknięciu formy wrzuciłem Application::Exit(); ale nie działa, ktoś ma jakiś pomysł żeby zadziałało?

Edit: Najlepiej jak by się dało zamknąć wszystkie wątki i aplikacje bez wskaźnika na wątek poboczny.
Dodatkowa uwaga: wątek poboczny korzysta ze wskaźnika na formę także zamknięcie jednego wątka skutkuje crashem.

0

Ok poradziłem sobie z problemem z ostatniego posta, zrobiłem repo bo zamierzeniem tego projektu było że będzie opensourcowy. Jak by ktoś był zainteresowany to daje linka: repo projekt będzie kontynuowany na dniach.

0

Poszło trochę update'ów na repo jak by ktoś był zainteresowany(na teraz zrobiona jest podstawa czytania z pamięci i działa już jako tako).

Na teraz zostało mi dokończenie czytania z pamięci oraz interpretacja wyników/przeniesienie ich na mape(skalowanie pozycji) oraz wybór kolorów do odpowiednich typów objektów :)

Przypominam że nie przeczytałem jeszcze regulaminu forum więc przepraszam jeżeli nie można posta pod postem :)

0

w Ultimate++ się da, kiedyś to robiłem :D

0

Kod wygląda w miarę ok. Nie mniej jednak nie wszystko jest idealnie.

Dlaczego offsety zrobiłeś jako enumy? Skoro je dodajesz w innych miejscach to nie powinny to być enumy, a stałe. Np. tutaj to jest bardzo mylące:

void Reader::ReadPlayerXYZ(float &x, float &y, float &z)
{
    DWORD lvl1PTR, lvl2PTR, plrBASE;
    UINT64 guid = GetLocalGUID();
    plrBASE = FindByGUID(guid);

    ReadProcessMemory(hWoW, (LPVOID)(plrBASE + OFF_UNIT_X), &x, sizeof(float), 0);
    ReadProcessMemory(hWoW, (LPVOID)(plrBASE + OFF_UNIT_Y), &y, sizeof(float), 0);
    ReadProcessMemory(hWoW, (LPVOID)(plrBASE + OFF_UNIT_Z), &z, sizeof(float), 0);

}

Dla mnie OFF_UNIT_X wygląda (przez nazwę pisaną wielkimi literami) na jakiś #define

0

Offsety z założenia są używane tylko w momencie czytania z pamięci. Enumy nie funkcjonują jak stałe? Tzn. można zmienić ich wartość w innym miejscu niż podczas deklaracji? Albo inaczej, wyjaśnij mi dlaczego muszą być stałe, uzasadnij swoje zdanie. (offsetów będzie trochę więcej niż teraz jest a robić plik w którym będzie z 10-20 stałych dla mnie wyglądało by niechlujnie)

A co do nazewnictwa to kto powiedział że nie można używać wielkich liter przy enumach?
Trinitycore(kiedyś przeczytałem że największy projekt opensource jeżeli bierze się pod uwagę ilość kodu) używa enumów pisanych wielkimi literami, np: link

Btw. Jutro(to już chyba będzie dzisiaj) pushnę na repo kolejne zmiany.

0

@Kamil55678 tak zachowują się jak stałe. Nie mniej jednak zazwyczaj enum'ów używa się aby zawęzić wartości do ściśle określonego zbioru, dlatego nigdy nie rzutuję ich na inty, a tym bardziej nie castuję w drugim kierunku. Np tak jak tu Enum

Co więcej, w takim przypadku jak u Ciebie nie deklarowałbym trochę dziwnej, nic nie mówiącej nazwy SomeOffsets, a zdefiniował nową przestrzeń nazw oraz w niej zmienne:

namespace GameOffsets
{
    const int OFF_CLIENT_CONECTION        = 0x00C79CE0;
    const int OFF_OBJ_MGR                 = 0x2ED0;
}

Do których potem odwoływałbym się w ten sposób:

    int addres;
    addres = GameOffsets::OFF_CLIENT_CONECTION;

Ale jak to mówią są gusta i guściki. Po prostu we wszystkich kodach z jakimi miałem do czynienia enumy były używane nawet bez definiowania ich wartości.

Co do nazewnictwa to kwestia przyjętej konwencji. W większości przypadków w C/C++ nazwy pisane samymi wielkimi literami używa się właśnie dla makr preprocesora, stąd moja uwaga, ponieważ tak to zrozumiałem.

0

Poszło kilka zmian, zamierzałem od początku nazwać enumy lepiej i je posegregować, ale zrobiłem to dopiero teraz, bo miałem problem z wymśleniem nazwy :)

Edit: Wrzuciłem kilka kolejnych zmian. w tym projekcie znalazło się też miejsce na podwójne buforowanie :)
Btw. Zauważyłem że im mniejszy timer ustawie sobie w kodzie tym mniej procesora mi proces zużywa, mam podejrzenia dotyczące funkcji która mi zwraca czas w ms, ma ktoś pomysł na jakąś optymalną? Używam jej tylko na potrzeby timera, więc może zwracać nawet czas od odpalenia programu byle w ms:)

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