Bitmap auf Dialog zeichnen - was geht hier schief?



  • Hallo,

    ich habe einen Dialog, auf dem ich ein erst zur Laufzeit vorliegendes Bitmap zeichnen will.

    Globale Varibalen:

    CBitmap* my_pic_bitmap=NULL;
    HWND     dlg_pic;
    

    Funktionen:

    VOID CopyImageToBitmap(ColorImage& my_pic)
    { 
        my_pic.Resize(705,260);
        my_pic_bitmap=new CBitmap;
        my_pic_bitmap->CreateBitmap(my_pic.Width(),my_pic.Heigth(),1,24,NULL);
    
        BITMAP bm;
        my_pic_bitmap->GetObject( sizeof(BITMAP), &bm );
        unsigned char *data = new unsigned char[bm.bmHeight*bm.bmWidthBytes];
    
        for (int y=0; y<bm.bmHeight; ++y)
    	for (int x=0; x<bm.bmWidth; ++x)
    		{data[(x*3)+(y*bm.bmWidthBytes)]   = (unsigned char)(*my_pic)(y,x).b;
    		 data[(x*3)+(y*bm.bmWidthBytes)+1] = (unsigned char)(*my_pic)(y,x).g;
    		 data[(x*3)+(y*bm.bmWidthBytes)+2] = (unsigned char)(*my_pic)(y,x).r;
    		}
    
        //ofstream ofs("test.ppm",ios::binary);
        //my_pic.Store(ofs);
    }
    
    VOID DrawBitMapToDiaolog(HWND hDlg)
    { 	
       HBITMAP hbitmap = (*my_pic_bitmap).operator HBITMAP();
       dlg_pic = CreateWindowEx(NULL, "STATIC", "", WS_CHILD | WS_VISIBLE | WS_THICKFRAME | SS_BITMAP , 16, 70, 705, 260, hDlg, NULL, 0 , 0);
       SendMessage(dlg_pic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hbitmap );
    }
    

    Die auskommentierten Zeilen zum Speichern dienten zum Überprüfen, ob das ColorImage (eigener Typ) auch das richtige Bild enthält. Tut es.
    Das ganze wird übersetzt und läuft auch ohne Abzustürzen. Leider ist auf dem Dialog ein völlig falsches Bild dargestellt! Nicht das was ich sehen wollte, sondern ein quadratisches, in den die Windows Fenster-Steuer-icons (Minimieren,Maximieren,Schließen - jeweils gedrückt und ungedrückt ) Desweiteren sicnd die Icons aller geöffneten Programme in diesem Bild enthalten jeweils doppelt für aktiviertes Fenster und nicht aktiviertes Fenster ... alles schon sauber hintereinander. Meine Frage ist bloß: Wie kommen die in meine Bitmap?? Keine Ahnung, was geht hier schief?

    Vielen Dank für sachdienliche Hinweise. 😕



  • Ich tippe auf falsche Abarbeitungsreihenfolge. Bzw solltest du "my_pic_bitmap" noch irgendwo erklären, daß es doch bitte die Bilddaten aus "data" abholen soll 😉



  • Sorry, das war ein copy-and-paste Fehler. Im Programm lautet es

    VOID CopyImageToBitmap(ColorImage& my_pic) 
    { 
        my_pic.Resize(705,260); 
        my_pic_bitmap=new CBitmap; 
        my_pic_bitmap->CreateBitmap(my_pic.Width(),my_pic.Heigth(),1,24,NULL); 
    
        BITMAP bm; 
        my_pic_bitmap->GetObject( sizeof(BITMAP), &bm ); 
        unsigned char *data = new unsigned char[bm.bmHeight*bm.bmWidthBytes]; 
    
        for (int y=0; y<bm.bmHeight; ++y) 
        for (int x=0; x<bm.bmWidth; ++x) 
            {data[(x*3)+(y*bm.bmWidthBytes)]   = (unsigned char)(*my_pic)(y,x).b; 
             data[(x*3)+(y*bm.bmWidthBytes)+1] = (unsigned char)(*my_pic)(y,x).g; 
             data[(x*3)+(y*bm.bmWidthBytes)+2] = (unsigned char)(*my_pic)(y,x).r; 
            } 
    
       my_pic_bitmap->SetBitmapBits((bm.bmHeight*bm.bmWidthBytes),data);
       delete [] data; 
        //ofstream ofs("test.ppm",ios::binary); 
        //my_pic.Store(ofs); 
    }
    

    Also daran liegt es wohl eher nicht. Wie kann ich überprüfen, ob in my_pic_bitmap das richtige steht?



  • Ok, weiterer Versuch. Das oben auskommentierte sichern des Bildes wieder reingenommen und nicht die Bitmap auf den Dialog übertragen, sondern das gesicherte Bild von Platte geladen ...

    VOID DrawBitMapToDiaolog(HWND hDlg)
    { 	
       HANDLE hImage = LoadImage(NULL, "c:\\test.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
       dlg_pic = CreateWindowEx(NULL, "STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_THICKFRAME | SS_BITMAP , 16, 70, 705, 260, hDlg, NULL, NULL , NULL);  
       SendMessage(dlg_pic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImage );
    
       //HBITMAP hbitmap = (*my_pic_bitmap).operator HBITMAP();
       //spec_dlg_pic = CreateWindowEx(NULL, "STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_THICKFRAME | SS_BITMAP , 16, 70, 705, 260, hDlg, NULL, NULL , NULL);
       //SendMessage(dlg_pic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hbitmap );
    
    }
    

    Jetzt ist das richtige dargestellt 😮 Irgendetwas geht beim übertragen des Bildes auf die CBtimap und dann auf das Dialogelement schief ... 🙄



  • Also ich habe noch mal nachgeschaut ... in der CBitmap* my_pic_bitmap ist definitiv das richtige drin. Der Fehler kann nur beim Übertragen auf den Dialog zustandekommen ... 😕 Hilfe!

    Viele Grüße



  • *schaut sich an, was für eine Nachricht da überhaupt gesendet wird*

    MSDN schrieb:

    An application sends an STM_SETIMAGE message to associate a new image with a static control.

    Ist ein Dialog ein "static control"? Nach meiner Einschätzung nicht 😉

    Du solltest vielleicht versuchen, das Bild selber zu zeichnen, indem du WM_PAINT abfängst und auswertest (etwas weiter unten im Board dürfte auch ein Quelltext dazu sein).



  • 😉 dagegen:

    );
       dlg_pic = CreateWindowEx(NULL, "STATIC", NULL, WS_CHILD | WS_VISIBLE | WS_THICKFRAME | SS_BITMAP , 16, 70, 705, 260, hDlg, NULL, NULL , NULL);  
       SendMessage(dlg_pic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImage );
    

    STM_SETIMAGE wird an dlg_pic gesendet, und das ist doch als "STATIC" gebastelt ... ?
    Außerdem würde es dann wohl auch beim laden des Bildes von Platte nicht funktionieren ... tut es aber 😞


Anmelden zum Antworten