[ maximus_1 @ 08.09.2006. 13:02 ] @
Programiram jednu igru tipa solitare pa sam skužio da u cards.dll u system32 direktoriju postoje slike karata. Sad ne znam kako učitati te slike u svoj program dok se on izvodi.
[ kiklop74 @ 08.09.2006. 13:33 ] @
Citat:
maximus_1: Programiram jednu igru tipa solitare pa sam skužio da u cards.dll u system32 direktoriju postoje slike karata. Sad ne znam kako učitati te slike u svoj program dok se on izvodi.


Nema potrebe da ucitavas slike. Cards.dll je napisan upravo kao dll sa funkcijama za olaksano kreiranje igara sa kartama.

Jedan primer upotrebe cards.dll za iscrtavanje karata u programu imas u projektu VCF. Source code je ovde:

http://svn.sourceforge.net/viewvc/vcf/trunk/vcf/examples/Cards/

Tebe zanimaju datoteke Cards.h, CardContainer.h i Cardclass.h

Ako ti se to ne dopada i bas hoces slike onda skini program resource hacker odavde http://www.angusj.com/resourcehacker/

i sa njime izvuci sve slike iz dll'a.

[ Duke Nukem @ 09.09.2006. 09:57 ] @
Resouce Hacker je odlican

Gde samo nalazis linkove sa programcicima koje olaksavaju zivot programerima ?
Imas li jos neki za preporuku ???

[ kiklop74 @ 09.09.2006. 17:24 ] @
Sve se nalazi na internetu. Google je tvoj najbolji prijatelj. Treba samo da imas jasnu ideju sta ti treba.
[ X Files @ 10.09.2006. 09:21 ] @
To oko cards.dll, bi trebalo da bude lako /netestirano/:

--- H ---
Code:

private:    // User declarations

        // ...
        HINSTANCE hi;
        int brojac;
        Graphics::TBitmap *pBitmap;
        // ...

public:        // User declarations
        // ...
        __fastcall ~TForm1();
       // ...
};


--- CPP ---
Code:

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   brojac = 0;

   hi = 0;
   hi = LoadLibrary( "cards.dll" );

   pBitmap = 0;
   pBitmap = new Graphics::TBitmap();

   Button1->Caption = "levo";
   Button2->Caption = "desno";
}

__fastcall TForm1::~TForm1()
{
   if ( hi )
      FreeLibrary( hi );

   if ( pBitmap )
      delete pBitmap;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   if ( hi && pBitmap && brojac > 1 )
   {
      Caption = --brojac;
      pBitmap->LoadFromResourceID( int( hi ), brojac );
      Canvas->Draw( 0, 0, pBitmap );
    }
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
   if ( hi && pBitmap && brojac < 52 )
   {
      Caption = ++brojac;
      pBitmap->LoadFromResourceID( int( hi ), brojac );
      Canvas->Draw( 0, 0, pBitmap );
    }
}


Dakle, trebaju ti dva Buttona (Button1 i Button2), koji ce predstavljati listanje karti
levo i desno. Ispis ide direktno na Canvas fome, pa izmena nije trajna. Ako hoces da
slika bude permanentna stavi je na TImage objekat.

Ovo sam sklepao na brzinu, pa ipak proveri da li ima neki bug.
[ Duke Nukem @ 11.09.2006. 09:57 ] @
Lepo i efektno

Resource Hacker je pisan u Delphiju 3;

Autor je verovatno koristio isti nacin pristupa bmp resursima koje je pomenu XFiles.
Korisio je takodje i neke API funkcije za pristup StringTabelama, Menijima i sl.
[ X Files @ 11.09.2006. 14:38 ] @
Postoji jos nekoliko slicnih programa (cak i boljih):

PE Explorer

Resource Builder

XN Resource Editor

... pronadji ih na netu. Neki cak prepoznaju i DFM strukturu.
[ maximus_1 @ 13.09.2006. 17:18 ] @
Hvala na kodu, uspio sam učitati slike u program no pojavio se novi problem. Naime, slike su monokromatske sa namjerom da se napravi što manja biblioteka. E sad, ja sam se sjetio da bih mogao crtati po canvasu i popravit rubove i crvene okvire tako pretvoriti u crne. Napisao sam funkciju:

Code:
BOOL __fastcall Pixelize (TCanvas *cnv, TImage *img) {

    int x1, x2, x3, y1, y2, y3;

    x1 = img->Left + img->Width;;
    x2 = img->Left;
    y1 = img->Top + img->Height;
    y2 = img->Top;

    x3 = 5;
    y3 = 5;

    cnv->Brush->Style = bsClear;
    cnv->Pen->Color = clBlack;
    cnv->RoundRect(x1, y1, x2, y2, x3, y3);

    int p1, p2, p3, p4;

    p1 = img->Left;
    p2 = p1 + 2;
    p3 = img->Top;
    p4 = p3 + 2;

    cnv->Pen->Color = clGreen;

    cnv->MoveTo(p1, p3);
    cnv->LineTo(p2, p3);
    cnv->MoveTo(p1, p3);
    cnv->LineTo(p1, p4);

    p1 = img->Left + img->Width - 1;
    p2 = p1 - 2;
    p3 = img->Top;
    p4 = p3 + 2;

    cnv->MoveTo(p1, p3);
    cnv->LineTo(p2, p3);
    cnv->MoveTo(p1, p3);
    cnv->LineTo(p1, p4);

    p1 = img->Left;
    p2 = p1 + 2;
    p3 = img->Top + img->Height - 1;
    p4 = p3 -2;

    cnv->MoveTo(p1, p3);
    cnv->LineTo(p2, p3);
    cnv->MoveTo(p1, p3);
    cnv->LineTo(p1, p4);

    p1 = img->Left + img->Width - 1;
    p2 = p1 - 2;
    p3 = img->Top + img->Height - 1;
    p4 = p3 - 2;

    cnv->MoveTo(p1, p3);
    cnv->LineTo(p2, p3);
    cnv->MoveTo(p1, p3);
    cnv->LineTo(p1, p4);

    return TRUE;
}


koja savršeno radi ali samo ako se ne poziva u istoj funkciji u kojoj se učitava slika. Pa npr. u funkciji:



Code:
void __fastcall TfrmMain::Load_P(TImage * img, str pic)
{
    if (pic == "empty" ||
        pic == "deck1" ||
        pic == "deck2" ||
        pic == "deck3") {

        img->Transparent = TRUE;
    } else {
        img->Transparent = FALSE;
    }


    int CardNumber = GetCardNumberFromPicName(pic);
    if (CardNumber != -1) {
        LoadCardFromDll(img, CardNumber, hi);

        // TREBA još pixelizirat rubove

        Pixelize (frmMain->Canvas, img);

    } else {
        throw "Pogreška pri učitavanju slike iz Cards.dll";
    }
}


neće uopće da radi ali ako stavim još jedno dugme i onda na OnClick eventu pozovem Pixelize() onda uspije.

U čemu je problem?
[ maximus_1 @ 15.09.2006. 09:22 ] @
Riješio sam problem. Razlog zašto se nisu iscrtavala okviri je zato što sam crtao po frmMain canvasu a slike bi uvijek ostale ispred pa se crte ne bi vidjele. Probao sam crtati po canvasu svake slike (TImage) ali opet problem jer sam mogao crtati samo monokromatskim bojama. Da bih to riješio, pretvorio sam slike u 24 bitne i crtao pa canvasu. Možda i nije baš najpopularnija metoda ali mi je upalila.