Skocz do zawartości

Aspect

Członkowie
  • Postów

    0
  • Dołączył

  • Ostatnio

    Nigdy

Posty napisane przez Aspect

  1. W takim razie moja odpowiedź była na inne pytanie ;) .
    Wiem, że to troche leci w próżnię ;-), ale trudno:
    Zmenne nie nazywa się tak żeby było jak w książkach, tylko tak żeby Ci było łatwo na pierwszy rzut oka powiedzieć, co dana zmienna przechowuje. Dla programu ważniejszy od nazwy zmiennej jest jej typ.

  2. W wielkim skrócie wygląda to mniej więcej tak (za mało czasu i miejsca, żeby to wszystko dokładniej opisać, także moja wiedza na ten temat niestety nie jest kompletna :P):

    CMainFrame - jest to klasa opakowująca okno główne aplikacji (bez obszaru roboczego); znajdują się w niej więc informacje na temat wszelkich toolbarów, statusbarów; tutaj możesz też modyfikować wygląd onka (czy ma przyciski minimalizacji i maxymalizacji, czy da się rozciągać itp)

    CDoc - to klasa opakowująca dane wykorzystywane w Twojej aplikacji (bez sposobów ich wyświetlania); w niej powinna znajdować cała warstwa logiki Twojej aplikacji (wszystkie funkcje modyfikujące dane); udostępnia ona funkcję Serialize służącą do zapisywania dokumentu (a ściślej jego zmiennych)

    CView - klasa opakowująca warstwę interfejsu aplikacji; powina służyć do wyświetlania danych znajdujących się w dokumencie (interpretować te dane i podawać je w postaci łatwo dostępnej dla użytkownika - np.: w dokumencje masz tablicę punktów, a klasa CView wyświetla je jako wykres)

    Nie wiem tego na pewno, ale z tego co zdołałem wywnioskować z budowy aplikacji SDI, to jedynymi klasami, które się ze sobą komunkują są klasa widoku i klasa dokumentu. Po prostu w klasie widoku pobierasz wskaźnik do aktywnego dokumentu, przy użyciu funkcji GetDocument i wyświetlasz zawarte w nim dane.

    Pobieranie wskaźnika wygląda tak:
    W Swojej klasie CView, albo w którejś z jej funkcji, tworzysz sobie wskażnik do obiektu klasy Twojego dokumentu np.: CMyDoc* pMyDoc. Następnie przypisujesz tej zmiennej wskaźnik do bieżącego dokumentu np.: pMyDoc=GetDocument(); i w ten sposób masz już dostęp do wszystkich pól i metod Swojej klasy dokumentu poprzez operator -> np.: pMyDoc->WyznaczPunkty();.

    Architektura Document-View została zaprojektowana po to żeby oddzielić logikę aplikacji (dane i operacje na nich) od interfejsu (sposób wyświetlania tych danych). Ma to ułatwić zmiane interfejsu (np.: nie chcemy oglądać wykresu tylko tablekę z współrzędnymi punktów), bez potrzeby zmiany całej aplikacji oraz bez ryzyka namieszania w częci logicznej.

  3. Musisz stworzyć sobie kontekst w pamięci (HDC), kompatybilny z kontekstm, na którym normalnie wyświetlasz ( użyj funkcji CreateCompatibleDC(); ). Wszystko, co chcesz żeby Ci się wyświetliło, rysuj na tym kontekście w pamięci, a następnie użyj funkcji BitBlt(); do przekopiowania zawartości jednego kontekstu na drugi.
    Wszystko to jest w wielkim skrócie (zakładam, że już troche znasz winapi i GDI oraz, że masz dostęp do dobrego helpa), w razie niejasności - pytaj.

  4. Pytanie 1:
    a) Podczas toworzenia projektu MFC na zakładce (tam są takie dziwne te zakładki z boku) "Application Type" jest npis "Use of MFC:" i tam wybierasz czy chcesz zeby biblioteki MFC były łączone dynamicznie czy statycznie.
    b) Jeżeli chcesz to zmienić po stworzeniu projektu to wchodzisz w opcje projektu i tam na zakładce "General" również jest pole "Use of MFC:".

    Pytanie 2:
    Nie wiem jak jest u Ciebie, bo ja mam całe Visual Studio i u mnie jest (w takim katalogu Visual C++ Projects) Win32 Project.

  5. Ja tam specjalistą od Delphi nie jestem, ale PChar to mi z nazwy wygląda na wskaźnik do char (albo do tablicy char'ów). Prawdopodobną przyczyną "nie iścia" ;-) jest więc zapewne fakt, że nie zaalokowałeś pamięci na napis, który chcesz zapisać.

  6. Nie wiem jak innym, ale mi jest trochę trudno zrozumieć co Ty do mnie piszesz (najbardziej dla mnie zrozumiała była Twoja wypowiedż zapisana w innym wątku pomiędzy znacznikami [ Code ] :) ). Dlatego to, co tu wyjaśniam może nie do końca być tym, o co Ci chodzi. ;-)

    ad 1. Zapis Win32 oznacza, ze program pisany jest na patformę 32 bitową. Moze to być zarówno projekt konsolowy jak i okienkowy. Z tego co piszesz wnioskuję, że poradziłes sobie z problemem dotyczącym typu DWORD.

    ad 2. Skoro mówisz, że wróciłeś do stanu (według Ciebie) wyjściowego i program również nie działa, to wydaje mi się, że jedynym rozwiązaniem (choć może trochę bolesnym) będzie stworzenie nowego projektu i przeniesienie do niego Twojego kodu. Najpierw jednak zastanów się jaką aplikacje chcesz pisać i przy tworzeniu projektu zaznacz tylko te opcje, które będą Ci potrzebne.

  7. Na wstępie chciałbym napisać, że ok 0.001% (jeżeli nie mniej) błędów programu to błędy kompilatora, natomiast pozostałe 99.999% to błędy programistów. Wnioski z tego wyciągnij sam. ;-)

    Teraz odnośnie błędów:
    1. Błąd z DWORD.
    DWORD nie jest typem C ani C++ tylko WinAPI (zadeklarowany np w windows.h). Ty natomiast (wnioskuję z tego co tu napisałeś), stworzyłeś sobie projekt konsolowy, który nie używa bibliotek WinAPI i dlatego nie rozpoznaje typu DWORD.

    2. Błąd z precompiled header.
    Przy wyborze projektu podejrzewam, ze wybrałeś opcję "Precompiled header", wygenerował Ci się "jakiś kod", który usunąłeś i wrzuciłeś własny. Ewentualnie wyrzuciłeś "jakieś niepotrzebne" nagłówki.

    Zgadłem???

  8. Na tym forum ten temat wielokrotnie padł i był dokładnie wyjaśniony. Funkcje konwetujące napis na liczbe i odwrotnie są następujące (trzeba to chyba do FAQ dać):

    atof Convert string to float
    atoi, _atoi64 Convert string to int
    atol Convert string to long
    _ecvt Convert double to string of specified length
    _fcvt Convert double to string with specified number of digits following decimal point
    _gcvt Convert double number to string; store string in buffer
    _itoa, _i64toa, _itow, _i64tow Convert int to string
    _ltoa, _ltow Convert long to string
    strtod, wcstod Convert string to double
    strtol, wcstol Convert string to long integer
    strtoul, wcstoul Convert string to unsigned long integer
    _ultoa, _ultow Convert unsigned long to string
    _wtoi Convert wide-character string to int
    _wtol Convert wide-character string to long

  9. Drugi parametr funkcji fscanf to jest tzw string formatujący, czyli string mówiący funkcji fscanf w jakim formacie i w jaki sposób zapisane są zmienne, które chcemy odczytać. Tutaj:

    fscanf(plik, "%f %f %f", &x, &y, &z); 

    wyraźnie dałeś do zrozumienia funkcji fscanf(...), że będziesz odczytywał 3 zmienne typu float oddzielone spacjami i tylko zmienne zapisane w taki sposób zostaną odczytane poprawnie. Żeby wczytać zmienne oddzielone średnikami musiałbyś napisać:

    fscanf(plik, "%f;%f;%f", &x, &y, &z); 

    Jeżeli chesz odczytywać zmienne oddzielone dowolnymi wybranymi przez Ciebie znaczkami (czyli np. wiesz, ze zmienne będą oddzielona spacjami lub średnikami lub przecinkami) zainteresuj się funkcją strtok.

  10. Rzeczywiście w ListBox'ie nie ma obsługi kolumn (przynajmniej w takim znaczeniu o jakie chodzi Twardemu). Jednak biblioteka Common Controls (niestety nie wiem czy istnieje jej odpowiednik dla Delphi) oferuje kontrolkę ListView (jej klasa nazywa się SysListView32). Obsługuje ona różne widoki (takie jakie mamy do wyboru na przykład w Explorerze), między innymi widok raportu (kolumny), posiada również możliwośc dodawania do niej ikonek itp.
    Tutaj masz wylistowane wszystkie komunikaty które obsługuje ListView.

  11. Nie, nie skończył. Jest cały czas w toku. Jednak niektórzy mają problemy ze swoją częścią (i prosiłbym tych, którzy już skończyli, żeby im troszkę pomogli w miarę swoich możliwości czasowych) albo mają mało czasu.

    Zrobimy tak - niech każdy z Was napisze tutaj, czy już skończył swoją część i jeśli tak to czy zgłasza gotowość do pomocy, a jeżeli nie to niech napisze z czym dokładnie ma problem.

  12. Myślę, że zasada powinna być taka, że jeśli ktoś ma ochotę napisać jakiś artykuł, albo dopisać dodatkowe informacje do tego, który już jest na stronie to może pisać bez pytania o zgodę. Wątpie, żeby Pinolec odrzucił czyjąś pomoc. Od przybytku głowa nie boli. ;-)

  13. eax napisał:
    ... No, a system() w jakim naglowku ma prototp :/ ... zaczalem powoli watpic w jego istnienie ...

    Istnieje na pewno w stdlib.h.

    eax napisał:
    system(cls); 

    Ktos sie spotkal z tym (lub czyms podobnym?) bo w dokumentacji nic nie znalazlem i musze powiedziec ze mi nie bardzo to dziala.

    Nie działa, bo funkcja system(); pobiera jako parametr wskaźnik do tablicy charów. Poprawnie powinno być:

    system("cls");

    Więcej informacji znajdziesz TUTAJ.
    Zanim jednak użyjesz tej funkcji musisz byćpewien, że system na którym będzie on uruchomiony posiada komendę cls.

  14. Zamiast wysyłać komunikat WM_SETTEXT (który służy zupełnie od czegoś innego) musisz ustawić czcionkę, którą stworzyłeś, jako aktualną dla kontekstu urządzenia, na którym wyprowadzasz tekst. Wyswietlenie tekstu przy użyciu wybranej przez Ciebie czcionki powinno wyglądać tak:

    HFONT hFont=CreateFont(blabla); //utworzenie czcionki i otrzymanie uchwytu do niej
    hFont=(HFONT)SelectObject(hdc,hFont); //ustawienie jej jako domyślnej dla kontekstu i jednoczesne zapisanie poprzedniej czcionki używanej przez kontekst
    DrawText(blabla); //wypisujesz sobie co tam chcesz
    DeleteObject(SelectObject(hdc, hFont)); //kasowanie stworzonej czcionki i jednocześne przywracanie poprzedniej

  15. biały napisał:
    ALE CHODZI MI JEDYNIE O TE PROGRAMY, KTÓRE JUŻ NAPISALIŚCIE, ŻEBY PRZETESTOWAĆ WASZ MODUŁ - NIE PISZCIE NOWYCH

    Nie załamuj się. Spróbój popracować nad tymi DIBami (przeczytaj odpowiedni rozdział - chociaż ja z tej książki nie przeczytałem ani jednej strony). Nie wszyscy jeszcze się uporali ze swoimi modułami, więc masz jeszcze trochę czasu.

  16. Ponieważ termin na oddanie modułów minął w tamtą niedzielę (chociaż ja nie naciskam - sam zupełnie nie mam czasu - i rozumiem, że macie mnóstwo zajęć obowiązkowych), więc każdy kto skończy(ł) ;-) niech utworzy w swoim katalogu na FTP podkatalog "modul" i umieści tam TYLKO pliki (cpp, h, dll lub lib) swojego modułu oraz skompilowany program testujący i ewentualnie jego kod (szczerze mówiąc kod programu testującego na pewno dużo mi pomoże - ALE CHODZI MI JEDYNIE O TE PROGRAMY, KTÓRE JUŻ NAPISALIŚCIE, ŻEBY PRZETESTOWAĆ WASZ MODUŁ - NIE PISZCIE NOWYCH).
    Piszę to dlatego, bo trudno mi jest stwierdzić, czy to co jest na FTPie to już skończony, działający program, czy może tylko taka testowa wersja wrzucona na serwer, żebym wiedział, że nie leniuchujecie ;-).
    Ja już zaczynam to wszystko powoli sklejać do kupy. Wiem, że pinolec i twardy już skończyli (jeżeli jest ktoś jeszcze - niech pisze na gg) i za ich moduły wkrótce się zabieram. Staram się poświęcić na to cały mój wolny czas, czyli okolo 1h dziennie, ale myślę, że już niedługo to skończymy.
    Jeżeli komuś już się zaczyna nudzić, niech zastanowi się nad następnym projektem, ewentualnie - niech zgłośi swoją chęć pomocy osobom, które mają problemy ze swoimi modułami.

  17. No brak czasu to jest mało powiedziane. Do tej pory jeszcze nie miałem wszystkich zajęć (pierwszy tydzień), ale obliczyłem, że jak tak dalej pójdzie, to będę miał do napisania średnio 2-3 programy na tydzień i to pod warunkiem, że już teraz się zabiorę.
    Domyślałem się, że chociaż projekt jest mało skomplikowany i teoretycznie powinien zostać szybko skończony, to nie będzie on jedyną rzeczą, której poświęcamy czas. Dlatego też chciałem dać na niego trochę więcej czasu 2-3 tygodnie. Myślę jednak, że uda nam się to skończyć do niedzieli. Wrzucajcie tymczasem efekty swojej pracy do swoich katalogów na ftpie.
    Chciałbym jeszcze powiedzieć, żebyście się nie przejmowali, że to tak wolno idzie (i tak myślę, że nie jest tak źle - jak juz pisalem, planowałem na to 3 tygodnie), to jest nasz pierwszy wspólny projekt. Jest kilka takich rzeczy, których się nie da zrobić z marszu - trzeba się najpierw douczyć(np. DIBy, konwersja obrazu, ładowanie różnych formatów...). Nie traćcie nadziei! ;-)

  18. 1. W funkcji obsługi komunikatów, dodajesz obsługe komunikatu WM_CREATE. W niej najpierw używasz funkcji:

    HWND GetDlgItem(
      HWND hWnd,     // uchwyt do Twojego głównego okna
      int nIDDlgItem   // identyfikator edita, w którym chcesz mieć focus
    );

    żeby uzyskać uchwyt do okna Edita, a potem wywołujesz

    HWND SetFocus(
      HWND hWnd   // handle to window to receive focus
    );

    podając jako parametr uchwyt uzyskany wcześniej.

    2. Zeby uzyskać edit, do którego można wprowadzać tylko liczby nie trzeba subclassingu. Wystarczy nadać mu styl ES_NUMBER. Nie piszesz dokładnie co Ci nie działa, więc trudno cokolwiek powiedzieć.

    3. Robisz sobie jakąś zmienną globalną, lub statyczną w funkcji obsługi komunikatów, np typu bool i ustawiasz na false. W obsłudze naciśniecia przycisku ustawiasz sobie tęzmiennąna true. Potem w obsłudze komunikatu WM_PAINT sprawdzasz czy wartość tej zmiennej jest równa true i jeżeli tak to wyrysowujesz tekst.

×
×
  • Utwórz nowe...