Skocz do zawartości

Omega

Członkowie
  • Postów

    0
  • Dołączył

  • Ostatnio

    Nigdy

Posty napisane przez Omega

  1. 1. Musisz nadac mu styl LBS_NOTIFY i wtedy w WM_COMMAND listbox bedzie przekazywal reakcje zmiany zaznaczenia poprzez LBN_SELCHANGE. Oczywiscie nie przekarze mumeru wpisu. Musisz wtedy sam pobrac informacje poprzez SendMessage ze stala LB_GETCURSEL.

  2. DialogBox powoduje utworzenie okna modalnego, dlatego...ja tez zle odpowiedzialem, ale nie mozna uzyc akceleratorow bo jak wyzej. Poprostu jak wywolujesz funkcje DialogBox to dlasza czesc kodu dopiero wykonuje sie po zamknieciu DialogBoxa. Aby uzyc akceleratory w oknach dialogowych to wywolaj je poprzez CreateDialog.

  3. 1. Nic nie stoi na przeszkodzie aby do dialogboxow przypisac akcelerator klawiatury. Blad pewnie lezy w zlym napisaniu algorytmu przez ciebie.

    2. Mozna, ale sam musisz odrysowywac taki caption - rowniez z tekstem. Zapoznaj sie z takimi komunikatami jak WM_NCPAINT.

    3. Jezeli nie twoj to co sie martwisz? :)  Na pewno blad lezy...patrz na punkt nr. 1.

  4. Czekasz na odpowiedz? Stary zastanow sie albo czasami skorzystaj z pliku pomocy typu win32.hlp. Jezeli nie masz to ci moge przyslac. Musisz wiedziec, ze jak do kontekstow przypiszesz przed operacja bitblt z parametrem SRCAND inny kolor pedzla niz jest standardowy to moga sie zamienic kolory, ktore beda "przeswitujace".

  5. Jezeli lparam rowna sie uchwtytowi kontrolki edit to dla niej to zastosuj. Stary, czy ty tylko czekasz na gotowce, czy rzeczywiscie nie wiesz, ze w tym komunikacie oprocz jego samego sa takie parametry jak lparam i wparam. I wlasnie lparam zwraca uchwyt kontrolki, ktora akurat obsluguje.

  6. to zrob tak jak napisalem, tylkow komunikacie WM_CTLCOLORSTATIC, czyli:

    WM_CTLCOLORSTATIC:begin 
       SetBKColor(wparam,RGB(0,255,0));      //aby tlo pod tekstem mialo kolor 
       result:=CreateSolidBrush(RGB(0,255,0)); //aby ogolnie tlo mialo kolor 
    end; 

    ;)

  7. Czy sie da skopiowac przyslonietego okna to niewiem, bo nie probowalem. Ale ogolnie, to nie jestem pewien czy da sie tak standardowo skopiowac obraz odrysowywany przez DirectX. Pierwsza uwaga to za duzo tego kodu w WM_PAINT. Powinien byc tylko kod do odrysowania, a nie tez do pokazania komunikatow. No i ten UpdateWindow w tym komunikacie? Poza tym zrobiles zegar i komunikat chyba nie zdazy takiej ilosci wykonac naraz - zalezne jest to od sprzetu i jaki zadales interwal czasowy na SetTimer. WM_Paint poiwnien prawidlowo wygladac tak:

    WM_PAINT:begin
     dc:=beginpaint(okno,ps);
     ... //tutaj kod do odrysowania. Odrysowujac na oknie masz kontekst dc, lub ps.hdc. zawsze jak tworzysz nowekonteksty w pamieci to pamietaj aby je na koncu zwalniac. Jezeli odrysowujesz ciagle te same okno to po co naokraglo odwolywac sie do niego w tym komunikacie. Wystarczy raz pobrac np. w WM_CREATE i np. w zegarze sprawdzac czy caly czas jest. Bo jesli nie to po co wywlywac odrysowanie okna poprzez InvalidateRect?
     endpaint(okno,ps);
    end;
  8. Aby skopiowac cokolwiek z ekranu wystarczy urzyc nastepujacego algorytmu:

    var
     dc,screen:hDC;
     bm:HBITMAP;
    begin
     screen:=getdc(0);
     bm:=createcompatiblebitmap(screen,200,200); //200 to np. rozmiar wyskosci i szerokosci kopiowanego okna
     dc:=createcompatibledc(screen);
     selectobject(dc,bm);
     bitblt(dc,0,0,200,200,screen,50,50,SRCCOPY); //50 to polozenie okna (x,y)
     releasedc(0,screen);
     ...

    i bm jest uchwytem zrzuconej mapy. A jezeli chcesz pobrac polozenie okna wystarczy zastosowac GetWindowRect.

  9. Nawet specjalista od delphi nic nie pomoze, bo tak troche jak pokazales to wydaje sie dobrze. ;)

    Musial bys pokazac jak wywolujesz ta funkcje i ta funkcja musiala by byc pokazana w calej okazalosci.

  10. Aby zastapic oryginlna funkcje kontrolki musisz zrobic np. tak:

    function NewWndProc(Handle: HWND; Msg: Integer; wParam, lParam: Longint):Longint; stdcall;
    if msg=WM_PAINT then begin
    i tu obsluga odrysowania
    end;
    result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
    end;

    WProc:=pointer(SetWindowLong(Edit1.Handle,GWL_WNDPROC,Longint(@NewWndProc)));

  11. var res,ACFont,plik:THandle;
        ACData:pointer;
        HM:cardinal;
    begin
      Res:=FindResource(hinstance, 'CLASSIC', 'TTF');
      ACFont:=LoadResource(hinstance, Res);
      ACData:=LockResource(ACFont);
      HM:=SizeofResource(hinstance, res);
      Plik:=CreateFile('classic.ttf', GENERIC_WRITE, 0, nil, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, 0);
      WriteFile(Plik, ACData^, HM, HM, nil);
      CloseHandle(Plik);
    end.

    Sam skonfrontuj swoje bledy

  12. No stary, jak to nie wiesz? Linkiem praktycznie zalatwilem wszystko. A wiec jesli chcesz wyciagnac zasob z programu, ktory wlasnie ma to zrobic to juz nie musisz korzystac z funkcji LoadLibrary, lub LoadLibraryEx (ta druga najczesciej jest stosowana do wyciagania zasobow z plikow 16 bitowych), tylko wystarczy zrobic tak (kod w delphi):

    hres:=FindResource(nil,'CLASSIC','TTF'); //hres - uchwyt zasobu. Jesli blad to zwroci 0;
    
    hMem := LoadResource(nil, hResource);  //bedzie blad to jw. W windows od 95 nie musisz stosowac pozniej FreeResource, bo system robi to automatycznie
      
    lpResource := LockResource(hMem); //pobierasz wskaznik do danych
    size:=SizeofResource(nil,hres); //pobierasz rozmiar

    lpresource to wskaznik a size to rozmiar bloku zasobu. Chyba wiecej nic ci do szczescia nie potrzeba.

    Wszystko pisalem praktycznie z pamieci i byc moze cos zle wklepalem (ale nie wydaje mi sie) to wal. ;)

  13. Zapisac do pliku plik? Nie zabardzo moze rozumiem o co ci chodzi. Czy chcesz zapisac cala strukture jakiegos pliku do zasobow czy na odwrot z zasobow wyciagnac dane do pliku?...Zapisac do pliku plik TTF o nazwie CLASSIC???? Czy TTF moze jest nazwa zasobu. W zasobach nie ma plikow tylko sa dane, ktore moga byc pobrane i dopiero z nich moze byc utworzony plik.

    P.S. Zmien kodowanie polskich znakow na swojej stronie bo ich nie widac - krzacza sie.

  14. StretchBlt jest jednym z mozliwosci jezeli wykorzystujesz uchwyt. Jezeli chcesz dzialac bezposrednio na bitach rysunku to wykorzystaj:
    StretchDIBits

    Przyklad na StretchBlt (w delphi):

    Var

    mapa:HBITMAP;
    PS:TPaintStruct;
    DC:hDC;
    x,y:integer;  //x,y - rozmiar jaki bedzie wyswietlany rzeczywiscie - czyli 
    przeskalowany
    xo,yo:  integer; //xo,yo - rozmiar oryginalny bitmapy
    ...
    WM_PAINT:begin
     beginPaint(Okno,PS);
     DC:=CreateCompatibleDC(PS.hDC);
     SelectObject(DC,mapa);
     StretchBlt(PS.hDC,0,0,x,y,DC,0,0,xo,yo,SRCCOPY);
     DeleteDC(DC):
     EndPaint(Okno,PS);
    end;

    Dodatkowo mozesz wykorzystac funkcje SetStretchBltMode, zktorej wykorzystujac odpowiednie stale mozesz sprawdzic z ktora najladniej wychodzi.

    Powyzsza metoda moze byc wykorzystana do bezposredniej zmiany rozmiaru mapy - przedtawilem to na przykladzie pokazania bezposredniego. Chociarz takie kombajny jak photoshop wykorzystuja wlasne algorytmy i wyglada to miejwiecej tak jak opisuje Nicon. Dodatkowo ten program ma wybor zmiany rozmiaru obrazka. Nie pamietam jak to dokladnie sie nazywa, ale chyba metoda sasiadujaca, dwuszescienna i dwuliniowa.

×
×
  • Utwórz nowe...