Image aus Buffer zeichnen



  • Hallo

    Wie kann ich nun aber Image1 eine Bitmap aus dem Speicher zuweisen?

    ...->Canvas->Draw(x,y,TBitmap);

    zu deinem Programm :
    Mach ein Array aus deinen Bitmaps :

    Graphics::TBitmap* Bmps[10];
    ...
    for (int Lv = 0; Lv < 10; Lv++) 
    {
      Bmps[Lv] = new Graphics::TBitmap();
      Bmps[Lv]->LoadFromFile("Bitmap" + IntToStr(Lv) + ".bmp");
      }
    ...
      image->Picture->Bitmap=Bmps[number];
    ...
    for (int Lv = 0; Lv < 10; Lv++) 
    {
      delete Bmps[Lv];
      }
    

    außerdem solltest du dir mal switch anschauen.

    bis bald
    akari



  • hermes schrieb:

    gibs vieleicht eine einfachere Lösung?

    Benutze eine ImageList (Reiter 'Win32').



  • Danke für den Hinweis.

    Gibt es eigentlich auch eine andere Lösung die Bitmaps zu schreiben, bei der
    o.a. Methode flackert die Anzeige ständig.



  • Hallo

    schau dir diesen Thread an :
    http://www.c-plusplus.net/forum/viewtopic.php?t=93888

    bis bald
    akari



  • Das ganze ohne flackern und wesentlich kürzer.

    WND hwndWinamp;
    Graphics::TBitmap* Bmps[10];
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
         : TForm(Owner)
    {
         hwndWinamp = FindWindow("Winamp v1.x",NULL);
         TrackBar1Change(NULL);
         for (int Lv = 0; Lv < 10; Lv++)
         {
              Bmps[Lv] = new Graphics::TBitmap();
              Bmps[Lv]->LoadFromFile("Bitmap" + IntToStr(Lv) + ".bmp");
         }
         DoubleBuffered = true;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::draw_num(TImage* image,char number)
    {
       image->Picture->Bitmap =Bmps[number];
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::TrackBar1Change(TObject *Sender)
    {
        SendMessage(hwndWinamp,WM_USER,((TrackBar1->Position-255)*-1),122);
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
         unsigned int time;
         time =(SendMessage(hwndWinamp,WM_USER,0,105)/100);
         time = hex_to_dec(time);
         draw_num(Image1,(time&0x0f));
         draw_num(Image2,(time>>4)&0x0f);
         draw_num(Image3,(time>>8)&0x0f);
         draw_num(Image4,(time>>12)&0x0f);
         draw_num(Image5,(time>>16)&0x000f);
    }
    //---------------------------------------------------------------------------
    int __fastcall TForm1::hex_to_dec(int int_num)
    {
         int result;
         asm
         {
              mov  ecx,0
              mov  ebx,10
              mov  edi,0
              mov  eax,int_num
    next:
              xor  edx,edx
              div  ebx
              and  edx,0x0f
              shl  edx,cl
              or   edi,edx
              add  ecx,4
              cmp  eax,0
              jne next
              mov  result,edi
         }
         return result;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
         for (int Lv = 0; Lv < 10; Lv++)
         {
              delete Bmps[Lv];
         }
    }
    

    Danke für die Hilfe.



  • DoubleBuffered muss nur einmal gesetzt werden.
    Und TImageList solltest du dir trotzdem nochmal ansehen.



  • Wie würde ich nun eine Komponente "7Segment" erstellen.
    Was müsste ich in der überschriebenen Methode Paint tun, wenn anhand
    der Eigenschaft Number die entsprechende Bitmap dargestellt werden soll?



  • Hallo

    Wie würde ich nun eine Komponente "7Segment" erstellen.
    Was müsste ich in der überschriebenen Methode Paint tun, wenn anhand
    der Eigenschaft Number die entsprechende Bitmap dargestellt werden soll?

    Ich würde von TImage ableiten. Als __property
    - eine Referenz auf eine externe TImageList, die alle Bitmaps enthält. Ohne zugewiesene ImageListe entweder leer oder Exception
    - unsingned int als Wert, der gerade dargestellt wird. Im Setter dieser Property kannst du (wenn TImageList vorhanden ist) das entsprechende Bitmap in das eigentliche Bitmap des TImages schreiben (TImage->Canvas->Draw(0,0,<Bitmap für neuen Wert>).

    bis bald
    akari



  • Habe mit ImageList rumprobiert und kein vernüftiges Ergebniss bekommen.

    Mit doppelklick auf die ImageList Komponente eine Bitmap hinzugefügt und
    dann mit

    ImageList1->GetBitmap(0,Image1->Picture->Bitmap);

    ausgegeben.

    Das Ergebniss sieht nicht so wie erwartet aus (zu klein und verzerrt).



  • Hi,
    hasst du auch Width und Height der ImageList angepasst?

    MfG

    Alexander Sulfrian


Anmelden zum Antworten