Skocz do zawartości

Aspect

Członkowie
  • Postów

    0
  • Dołączył

  • Ostatnio

    Nigdy

Posty napisane przez Aspect

  1. Nic nie zyskasz - mówiłeś tylko, że pod C działa, a pod C++ nie, więc pozostanie przy C mogło być pewnym, tymczasowym środkiem zaradczym :p.

  2. Jeżeli chcesz koniecznie rysować w kontrolce Edit funkcjami textout lub drawtext (choc nie wiem czemu, ta kontrolka obsługuje wyświetlanie tekstu sama - ja bym wysłał do niej WM_SETTEXT), to odpowiedzią na Twoje pytanie jest punkt pierwszy mojego poprzedniego posta. :)

  3. Do Twardego: Arkowi_17 wlasnie chodzi o to, że sobie zarejestrował własną kontrolkę o nazwie "suwak" i chciałby ją wyświetlić w dialogboxie. Jak znajde chwilke po zakończeniu semestru to napiszę arta o tym jak tworzyć własne kontrolki (dla tych co nie maja petzolda ;-) ).

    Do Arka_17: To, że dialog box z nią sie nie wyświetla, to znaczy że coś jest skopane albo przy rejestracji kontrolki (najpewniej) albo w jej funkcji obsługi. Na razie nie chce mi się niestety szukać błędu w Twoim kodzie (mam bardzo mało czasu) zwłaszacza, że jest wyświetlony bez tabulacji (prośba do wszystkich jak wklejacie kod używajcie znaczników [ code ]). Sam popróbój, poeksperymentuj - może Ci się uda. A jeżeli nei używasz obiektowości to zostaw program jako projekt C.

    PS. Do Twardego. Już poprzednio ten Avatar był okropny, ale teraz to już przesada. ;-)

  4. Trochę nieprecyzyjnie zadałeś pytanie i w sumie nie wiadomo czy chodzi Ci o:

    1. Narysowanie tego tekstu na jakiejś kontrolce w jej komunikacie WM_PAINT - w tym przypadku musialbyś subclassować kontrolkę i obsłużyć w jej funkcji obsługi ten komunikat.

    2. Spowodować zmianę tekstu kontrolki dziecka (np. editboxa - jego zawartość to jakby tytul jego okienka), co spowoduje wypisanie się na niej tekstu - w tym przypadku musisz wysłać do niej komunikat WM_SETTEXT

    3. O coś innego - w tym przypadku to ja nie wiem ;-)

  5. Należy wysłać do buttona komunikat BM_SETIMAGE.

    SendMessage( 
      (HWND) hWnd,         // handle to destination window 
      BM_SETIMAGE,         // message to send
      (WPARAM) wParam,     // image type
      (LPARAM) lParam      // handle to the image (HANDLE)
    );

    Parameters:

    wParam
    Specifies the type of image to associate with the button. This parameter can be one of the following values:
    IMAGE_BITMAP
    IMAGE_ICON

    lParam
    Handle to the image to associate with the button.

  6. m-rog napisał:
    1. Która funkcja służy do przemiany char na LPCSTR i na odwrót???

    LPCSTR to skrót od angielskiego Long Pointer to Character STRing, czyli daleki wskaźnik do łańcucha znaków. Jak sama nazwa wskazuje typ ten jest równoważny typowi char*, więc zmienne tych typów można spokojnie przypisywać lub porównywać.

    m-rog napisał:
    2. Za pomocą jakiej funkcji najlepiej jest kopiować plik???

    Możesz użyć np. funkcji FileCopy, lub bardziej rozbudowanej (o możliwość uruchamiania specjalnej funkcji callback po każdej skopiowanej porcji danych i możliwość anulowania operacji) FileCopyEx.

    m-rog napisał:
    3. Która funkcja w api zwraca nam nazwy wszystkich katalogów podając dany "patch"???

    Chodzi Ci o "path"? Jeżeli tak, to ja takiej funkcji nie znam (być może istnieje). Pokombinuj z FindFirstFile i FindNextFile (możesz przerobić algorytm nicona do przeszukiwania zawartości dysku - zacznij przeszukiwać od wybranej ścieżki i jeżeli znaleziony plik będzie katalogiem to zapisuj jego nazwe do jakiejś tablicy/listy).

  7. Wkelj tutaj, albo gdzieś udostępnij, cały kod swojego programu, bo z tego co piszesz to błąd nie wynika ze złego wypełnienia struktury OPENFILENAME, tylko z jakiejś pomyłki, którą popełniłeś w innym miejscu. Tak na "ślepo" trudno jest cokolwiek powiedzieć.

    1. OPENFILENAME ofn ; //lokalna

      Jeżeli ta zmienna jest lokalna i nie jest statyczna, to w następnym wywołaniu procedury obsługi wartości, które podałeś w WM_CREATE nie będą już znane. Jeżeli tak samo masz w programie, to dialog OpenFileName nie będzie się otwierał.

    2. int x = MAKEINTRESOURCE("DIALOGBOX1");

      Tu Ci się po prostu chyba pomyliło, jak przepisywałeś na forum. Makro MAKEINTRESOURCE pobiera identyfikator(liczbowy) kontrolki i zamienia go na ciąg znaków. Ale to nie ma z Twoim głównym problemem żadnego związku raczej. Tak samo jak i punkt następny.

    3. ofn.lpTemplateName= x ;

      To pole i tak jest u Ciebie ignorowane, poniewaz nie dałęś flagi OFN_ENABLETEMPLATE.

  8. m-rog napisał:
    Potrzebuje jakieś linki lub proste programy, w których były by wykorzystane komonikaty tj.: WM_CTLCOLORSTATIC,WM_CTLCOLORDLG,WM_CTLCOLORLISTBOX.

    Poniższy fragment kodu wklej sobie do funkcji obslugi Twojego dialog boxa:

            case WM_CTLCOLORSTATIC:{
                SetTextColor ((HDC)wParam,RGB(0,0,255)) ;
                SetBkMode((HDC)wParam,TRANSPARENT);
                HBRUSH hbrStatic=CreateSolidBrush(RGB(255,0,0));
                return (LRESULT) hbrStatic;}

    Zmienia on kolor tekstu na niebieski i kolor tła na czerwony we WSZYSTKICH staticach będących dziećmi tego dialog boxa.

    m-rog napisał:
    Ostatnie pytanie. W jaki sposób wykorzystuje się funkcje DlgDirList w ListBox'ie????

    Polecam MSDN, tam są wszystkie funkcje dokładnie opisane.

  9. m-rog napisał:
    1. W jaki sposób można zmienić kolor tekstu i tła w kontrolkach list,edit i static text???

    Służą do tego komunikaty WM_CTLCOLOR..., które muszą być obsłużone przez kontrolkę rodzica. Dostajesz w nim uchwyt do kontekstu urządzenia, w którym będą wyrysowanie kontrolki, więc musisz zmodyfikować po prostu ten kontekst.

  10. Jeżeli tworzysz kontrolkę za pomocą funkcji CreateWindow();, wyślij do niej komunikat WM_SETFONT. Jeżeli natomiast kontrolki są dziećmi dialogboxa, tworzonego z zasobów, to przed listą kontrolek w zasobach napisz np: FONT 8, "MS Shell Dlg", 400, 0, 0x1.

  11. jn-tek napisał:
    ... Mam pomysł, żeby zrobić okno w odpowiednim stylu, ale to nie jest najlepszy pomysł ...

    Nie wiem, czy dokładnie o to Ci chodzi, ale do menu podręcznego najprościej chyba używać funkcji:

    BOOL TrackPopupMenu(
      HMENU hMenu,         // handle to shortcut menu
      UINT uFlags,         // options
      int x,               // horizontal position
      int y,               // vertical position
      int nReserved,       // reserved, must be zero
      HWND hWnd,           // handle to owner window
      CONST RECT *prcRect  // ignored
    );

    Jeżeli chodzi o pozycjonowanie, to tak jak Piasiu pisał pobierz współrzędne kursora funkcją GetCursorPos();, wpisz je do parametrów x i y, a parametr uFlags ustaw na TPM_RIGHTALIGN | TPM_BOTTOMALIGN (tray zazwyczaj znajduje się w prawym, dolnym rogu ekranu).

  12. Skrócenie ścieżki do żądanej długości w pixelach:

    BOOL PathCompactPath(
        HDC hDC, //kontekst urządzenia, na którym ma byc "wyrysowana" scieżka (potrzebny, żeby odczytać rozmiar czcionki)
        LPTSTR lpszPath, //tekst do skrócenia, tutaj znajdzie się też wynik
        UINT dx //żądana długość tekstu w pixelach
    );

    Skrócenie ścieżki do żądanej ilości znaków:

    BOOL PathCompactPathEx(
        LPTSTR  pszOut, //bufor wyjściowy
        LPCTSTR pszSrc, //bufor wejściowy
        UINT    cchMax, //maksymalna żądana długość ciągu
        DWORD   dwFlags //wartosc nie uzywana
    );

    Obie funkcje w bibliotece Shlwapi.dll w wersji 4.71 i wyższych.

  13. Oczywiście, że jest aktualny, tylko "się zawiesił" na czas semestru, kiedy to większość osób nie ma czasu. Mam nadzieję, że ten nieprzyjemny przestój nie zrazi Was do wspólnego programowania (choć już chyba trochę zraził) i kiedy tylko będzie więcej czasu zbierzemy się znowu do roboty.

  14. Funkcja strtok(char* string,char* seps); (a raczej jej wywołanie w pętli) dzieli string przy użyciu dowolnych separatorów. Przykładowy kod wykorzystujący tę funkcję zakoszony z MSDNa:

    #include <string.h>
    #include <stdio.h>
    
    char string[] = "A string\tof ,,tokens\nand some  more tokens";
    char seps[]   = " ,\t\n";
    char *token;
    
    void main( void )
    {
       printf( "%s\n\nTokens:\n", string );
       /* Establish string and get the first token: */
       token = strtok( string, seps );
       while( token != NULL )
       {
          /* While there are tokens in "string" */
          printf( " %s\n", token );
          /* Get next token: */
          token = strtok( NULL, seps );
       }
    }

    i jego wynik:

    A string   of ,,tokens
    and some  more tokens
    
    Tokens:
     A
     string
     of
     tokens
     and
     some
     more
     tokens

    Jednak (jak widać powyżej) wykorzystuje ona biblioteke string.h i jej stosowanie w połączeniu ze strumieniami wydaje mi się mało "eleganckie". Poszukaj w MSDNie jakiegoś jej odpowiednika dla strumieni (na 90% będzie).

  15. Co do tych zasobów, to problem prawdopodobnie polegał na tym, że nie zaincludowałeś <windows.h> w pliku zasobów, w związku z czym, niezdefiniowane były stałe DS_MODALFRAME, WS_POPUP, WS_CAPTION, WS_SYSMENU. Poza tym w Dev zasoby obsługuje się noramalnie - dodajesz nowy plik do projektu -> zmieniaz mu nazwe na *.rc -> piszesz w nim skrypt zasobów -> i już powinno działać. Jeżeli nie działa to możesz spróbować odłączyć plik od projektu i dodać go na powrót. A, no i jeszcze jedna ważna sprawa - jeżeli zmienisz coś w pliku zasobów to musisz przy kompilacji wybrać opcję "Rebiuld All".
    Co do zmiany w opcjach kompilacji, to niestety trzeba się do tego przyzwyczaić i nauczyć (nie koniecznie musisz, przedzierać się przez dziesiątki stron dokumentacji - poeksperymentujesz, napiszesz kilka programów i w końcu dojdziesz do wprawy), z resztą jest to konieczne nie tylko w Dev - Visual też nie robi tego za Ciebie.

  16. Nie za bardzo rozumiem, co masz na myśli pisząc: "rad, kruczków i zasad" (czy chodzi Ci o spis błędów, które wyrzuca kompilator i ich dokładny opis?).

    Rzuć też jakimś przykładowym błędem, będącym problemem z kompilatorem - ja też pisze w Dev i do tej pory z czymś takim się nie spotkałem.

    Pewnie już sam to znalazłeś, ale TUTAJ masz dokładną dokumentację MinGW.

  17. Zakładam, że chodzi Ci o rozwiązanie Twojego problemu w WinAPI, bo w MFC robi się wszystko automatycznie 8) .
    Też miałem podobny problem z toolbarem i rebarem. Nie pamiętam dokładnie jak sobie poradziłem (problem rozwiązał się dosyć szybko), napiszę Ci jednak na co warto zwróćić uwagę:

    • Toolbar musi być dzieckiem rebara, a rebar rodzicem toolbara (trochę to może śmiesznie brzmieć ;) )
    • Pobaw się trochę stylami obu pasków (może jeden ze stylów jaki nadałeś powoduje te dziwne zachowania). U mnie działające paski mają następujące style:
      Rebar:WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_BANDBORDERS | RBS_VARHEIGHT | CCS_NODIVIDER
      Toolbar:WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOMOVEY

    Mam nadzieję, że choć trochę pomogłem. :) W razie dalszych problemów, rzuć kodem - wtedy zawsze łatwiej znależć błąd.

×
×
  • Utwórz nowe...