Icon (Bitmap) neben Auswahlbox anzeigen.



  • Ziel- und Quellkontext sind die gleichen (beides hdc).
    Du hast das Bitmap aber in hdcMem gewählt, also muss statt des zweiten hdc's ein hdcMem stehen. Ansonsten siehts doch ganz gut aus.



  • Es lässt sich nicht kompilieren, da ich immer noch "Illegal use of type name 'PAINTSTRUCT'" habe und auch "Undeclared identifier 'ps'"...

    Kann es sein, dass CE mit PAINTSTRUCT nicht klar kommt???

    das mit dem 2. hdc ist mir nicht ganz klar... wo sollte da hdcMem stehen? Ich seh den Wald vor Bäumen nicht mehr... 😉



  • Mit dem zweiten hdc meinte ich deinen Aufruf von BitBlt(..). Da steht zweimal "hdc" bei den Parametern, das zweite sollte aber hdcMem sein.
    Ich habe hier aber gerade gesehen, dasss BeginPaint erst ab Windows 2000 zur Verfügung steht. Unter CE musst du dir den HDC per GetDC besorgen, der Rest ist genau der Gleiche.
    Probier das Ganze aber mal unter Loadbitmap zu schreiben.

    HDC hdc = GetDC(hwnd);
    HDC hdcMem = CreateCompatibleDC(hdc);
    HGDIOBJ hbOld = SelectObject(hdcMem,hBitmap);
    BitBlt(hdc, 100, 50, 50, 50, hdcMem, 0, 0, SRCCOPY);
    SelectObject(hdcMem,hbOld);
    DeleteDC(hdcMem);
    ReleaseDC(hwnd,hdc);
    


  • Kompiliert jetzt mit GetDC, aber das Bitmap kommt trotzdem nicht.

    Ich liege doch richtig, wenn ich das Handle zum Fenster benutze, auf dem das Bitmap angezeigt haben will... also 'hwndDlg' und nicht 'hwnd'?

    Was mir noch aufgefallen ist:

    Meine Variable mit dem Pfad des Bitmaps hab ich nochmal ausgeben lassen.
    Dort steht dann allerdings: \Storage Card\TestOrdner\Test1\icon.bmp und nicht wie sonst in C zu benutzende Doppel-Backslashs...



  • Ja, in deiner DlgProc hast du das Handle ja hwndDlg genannt, ich nutze eigentlich immer nur hwnd.
    Hast du denn mal den Returnwert von LoadBitmap getestet? Wenn die Funktion scheitert, ist hBitmap null, unbedingt testen.
    Du hast ja den Code dadrunter geschrieben, oder? Imho wird WM_PAINT unter CE gar nicht gesendet.



  • Jep, Case WM_Paint hab ich komplett raus genommen und Deinen Code so eingebaut, wie du gesagt hast.

    Ich hab auch mal den Returnwert auf NULL geprüft... er ist NULL... 😡
    Also kommt der Handle zum Bitmap nicht...



  • LoadBitmap sollte aber schon funktionieren, wenn der Dateipfad existiert.
    Folgendes klappt bei dir nicht, oder?

    bool FileExistsW(const wchar_t* pFilename)
    {
        WIN32_FIND_DATAW data;
        HANDLE hdl=FindFirstFileW(pFilename,&data);
        if(hdl==INVALID_HANDLE_VALUE)
            return false;
        if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            return false;
        return true;
    }
    // also vor LoadBitmap
    if(!FileExistsW(variable3))
      MessageBox(0,"existiert nicht!",0,0);
    


  • Keine Ahnung, was da quer läuft...
    Wenn ich ein CopyFile mit der Variable3 mache, dann kopiert er mir das einwandfrei. Also sollte das doch funktionieren...

    Nur das doofe Bitmap wird einfach nicht im Programm angezeigt...


  • Mod

    Geschweifte Klammern vergessen? Ist das evtl. C und kien C++?



  • Hallo Martin,

    ja, das ist C
    Das letzte Schippel habe ich auch nicht eingebaut, sondern per CopyFile() getestet, ob die variable3 den richtigen Link zum Bitmap enthält.



  • Hat denn keiner eine Lösung für mein Problem? 😕

    Hier noch mal der Sourcecode des entsprechenden Buttons:

    case ID_LOOK:
    		/** if clicked, there is shown a previewof the marked item **************/
    			/** Get marked Item from ID_BOX**********/
    			hList = GetDlgItem(hwndDlg, ID_BOX);
    			int read = SendMessage(hList, LB_GETCURSEL , 0, 0);
    			if (read<0) return TRUE;
    			LB_GETTEXTLEN;
    			SendMessage(hList, LB_GETTEXT,read, (LPARAM)pfad);
    			Sleep(100);
    
    			/** if another item is marked, set pfad2 to 0 ************/
    			pfad2[0] = 0;
    
    			/** get the path to the Bitmap ******************/
    			wcscat(pfad2, L"\\Storage Card\\GoPalWorld-Skin\\Designs\\Autotauscher\\");
    			wcscat(pfad2, pfad);
    			wcscat(pfad2, L"\\icon.bmp\0");
    
    			/** test to copy the bitmap to the root of Storage Card ***********/
    			if(CopyFile(pfad2, L"\\Storage Card\\icon.bmp", FALSE) != TRUE)
      				{MessageBox(0,L"Vorschau-Bild existiert nicht!",L"Fehler",0);} // if copying faults send Message to the user
    			else
    				{
    
    				/** show bitmap out of marked folder in ID_BOX on hwndDlg at x = 60, y= 100 **/ 
    		       		 if(hBitmap) DeleteObject(hBitmap); 		// delete "old" Bitmap
    				hBitmap = LoadBitmap(NULL, L"\\Storage Card\\icon.bmp\0"); // Test to load bitmap from SD-card
    				HDC hdc = GetDC(hwndDlg);
    				HDC hdcMem = CreateCompatibleDC(hdc);
    				HGDIOBJ hbOld = SelectObject(hdcMem,hBitmap);
    				BitBlt(hdc, 60, 100, 50, 50, hdcMem, 0, 0, SRCCOPY);
    				SelectObject(hdcMem,hbOld);
    				DeleteDC(hdcMem);
    				ReleaseDC(hwndDlg,hdc); 
    				InvalidateRect(hwndDlg,0,TRUE); 		// jetzt probehalber alles löschen	
    				}	
    
    			break;
    


  • Ich habe für CE nie programmiert, habe es in nächster Zeit auch nicht vor.
    Aber: CopyFile kann vielleicht auf anderer Ebene arbeiten. Probier doch einfach mal, die Datei per fopen zu öffnen und dir die ersten zwei Bytes ausgeben zu lassen (die ersten beiden Bytes des BitmapFileHeaders), ist es wirklich 0x4D42?

    Edit

    LB_GETTEXTLEN;
    // bringt natürlich nichts. Stattdessen
    if(SendMessage(hList,LB_GETTEXTLEN,read,0)>=/*Puffergröße*/)
      return 0;
    


  • Hallo zusammen,

    erst einmal vielen Dank für Eure Hilfe. 👍

    Ich bin jetzt mal einen anderen Weg gegangen zum testen...

    Ich habe jetzt folgendes festgestellt:

    wenn ich mit

    hbit = LoadBitmap(NULL, MAKEINTRESOURCE(IDR_BITMAP));
    			HWND imgCtrl = CreateWindow( _T("STATIC"), NULL, SS_LEFT | SS_BITMAP | WS_CHILD | WS_VISIBLE, 40, 120 , 50, 50, hwndDlg, NULL, NULL, NULL);
    			SendMessage(imgCtrl,STM_SETIMAGE, (WPARAM)IMAGE_BITMAP,(LPARAM)hbit);
    

    ein Bitmap mit in die Exe packe (Pelles C) dann wird das Bitmap an der Stelle angezeigt wenn ich den Button klicke.

    Gehe ich hin und ändere:

    hbit = LoadBitmap(NULL, MAKEINTRESOURCE(IDR_BITMAP));
    

    auf einen Dateipfad, z.B:

    hbit = LoadBitmap(NULL, L"\\Storage Card\\test.bmp\0");
    

    dann geht da nix... 😕

    Selbstverständlich funktioniert dann

    hbit = LoadBitmap(NULL, pfad2);
    

    auch nicht... 😡



  • Nur zur Komplettierung...

    Ich habs geschafft. Ich erstelle ein neues Fenster und kriege das Bitmap damit sichtbar:

    hbit = SHLoadDIBitmap(pfad2); 
    HWND imgCtrl = CreateWindow( _T("STATIC"), L"Auto", SS_LEFT | SS_BITMAP | WS_VISIBLE, 40, 120 , 50, 50, hwnd1, NULL, NULL, NULL);
    SendMessage(imgCtrl,STM_SETIMAGE, (WPARAM)IMAGE_BITMAP,(LPARAM)hbit);
    

    Leider funktioniert das nicht, wenn ich das WS_CHILD setzen will. Aber damit kann ich ganz gut leben.

    Vielen Dank noch mal für Eure Hilfe! 👍


Anmelden zum Antworten