Icon (Bitmap) neben Auswahlbox anzeigen.
-
Danke!
Ich werd schauen, ob ich das hin bekomme...
Wenn nicht, melde ich mich wieder.
-
Doch zu blööd dafür...

Ich versuche gerade einen anderen Weg mit einem Button, der dann eine Vorschau anzeigen soll. Diese Vorschau soll auf dem MainDlgProc mit eingeblendet werden.
Ich habe folgenden Code jetzt:
static LRESULT CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { /* Static, so we remember it between calls */ switch (uMsg) { case WM_INITDIALOG: { PPC_CheckDlgButton(hwndDlg,ID_PUSH, TRUE); SetForegroundWindow(hwndDlg); wcscpy (sDirectory, L"\\Storage Card\\Designs\\TestOrdner\\*.*\0"); hSearch = FindFirstFile(sDirectory, &FindFileData); if (hSearch) { wcscpy(sFileName,FindFileData.cFileName ); if (wcscmp(sFileName, L"") != 0) { index = SendDlgItemMessage(hwndDlg, ID_BOX, LB_ADDSTRING, 0, (LPARAM)sFileName);} } else{return 0;} while (FindNextFile(hSearch, &FindFileData) != 0) { wcscpy(sFileName,FindFileData.cFileName ); if (wcscmp(sFileName, L"") != 0) {index = SendDlgItemMessage(hwndDlg, ID_BOX, LB_ADDSTRING, 0, (LPARAM)sFileName);} } return TRUE; } case WM_COMMAND: switch (IDDlgItem=GET_WM_COMMAND_ID(wParam, lParam)) { case ID_LOOK: /* Hier lese ich die gefüllte Box aus */ hList = GetDlgItem(hwndDlg, ID_BOX); int read = SendMessage(hList, LB_GETCURSEL , 0, 0); if (read<0) return TRUE; SendMessage(hList, LB_GETTEXT,read, (LPARAM)variable); Sleep(100); /* Zusammensetzen des Pfades */ wcscat(variable3, L"\\Storage Card\\Designs\\TestOrdner\\"); wcscat(variable3, variable); wcscat(variable3, L"\\icon.bmp\0") /* temporäre MsgBox zur ausgabe des Wertes der variable3 */ MessageBox(NULL, variable3, L"Var", MB_SETFOREGROUND); return TRUE; case ID_STOP: . . .Problem:
Bei jedem Klick auf den Button ID_LOOK wird der neue Pfad an den vorhergehenden angehangen. Beim ersten Start ist der Pfad in Ordnung...
Problem2:
wie kriege ich das Bitmap angezeigt? Ich hab schon probiert mit CreateWindow und SendMessage das jeweilige Bitmap anzuzeigen, aber das krieg ich nicht hin.

Kann mich da mal jemand auf das richtige Pferd setzen, please?

-
Problem 1:
case ID_LOOK: /* Hier lese ich die gefüllte Box aus */ hList = GetDlgItem(hwndDlg, ID_BOX); int read = SendMessage(hList, LB_GETCURSEL , 0, 0); if (read<0) return TRUE; SendMessage(hList, LB_GETTEXT,read, (LPARAM)variable); // besser vorher LB_GETTEXTLEN abfragen Sleep(100); // wozu? /* Zusammensetzen des Pfades */ // variable3 ist eine globale/statische Variable? // Entweder erst kopieren, oder variable3[0] = 0; // damit wcscat richtig arbeitet wcscat(variable3, L"\\Storage Card\\Designs\\TestOrdner\\"); // besser absoluten Pfad setzen ("d:\\...) wcscat(variable3, variable); wcscat(variable3, L"\\icon.bmp\0") /* temporäre MsgBox zur ausgabe des Wertes der variable3 */ MessageBox(NULL, variable3, L"Var", MB_SETFOREGROUND); return TRUE;2. Problem: Ruhig bleiben
, schaffst du schon.
Eine statische Variable vom Typ HBITMAP hast du deklariert, oder? LoadBitmap sollte eigentlich bei korrektem Pfad klappen, wenn du Fragen zur Anzeige hast, kannst du ja noch mal posten.
Ubrigens:LRESULT CALLBACK MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)Das static kannst du weglassen, nur die Variablen innerhalb der Funktion sollten als static deklariert werden.
static HBITMAP hBitmap;
-
case ID_LOOK: /* Hier lese ich die gefüllte Box aus */ hList = GetDlgItem(hwndDlg, ID_BOX); int read = SendMessage(hList, LB_GETCURSEL , 0, 0); if (read<0) return TRUE; SendMessage(hList, LB_GETTEXT,read, (LPARAM)variable); // besser vorher LB_GETTEXTLEN abfragen +++++++++++mach ich noch! Sleep(100); // wozu? // ++++++++++++++++Win CE ist was lahm.... /* Zusammensetzen des Pfades */ variable3[0] = 0; // ++++++++++++++++++Danke!!! wcscat(variable3, L"\\Storage Card\\Designs\\TestOrdner\\"); // Der Pfad ist statisch ;-)..) wcscat(variable3, variable); wcscat(variable3, L"\\icon.bmp\0") //LoadBitmap(0, variable3); // egal wie ich das mache, das Bitmap wird nicht angezeigt... :-( LoadBitmap(NULL,L"\\Storage Card\\Designs\\TestOrdner\\Test1\\Icon.bmp"); // selbst mit komplettem Pfad kommt das Bitmap nicht :-( BeginPaint(hwndDlg, &Ps); HDC hdc = GetDC(hwndDlg); HDC memDC = CreateCompatibleDC(hdc); BitBlt(hdc, 100, 50, 50, 50, memDC, 0, 0, SRCCOPY); ReleaseDC(hwndDlg, hdc); ReleaseDC(hwndDlg, memDC); EndPaint(hwndDlg, &Ps); /* temporäre MsgBox zur ausgabe des Wertes der variable3 MessageBox(NULL, variable3, L"Var", MB_SETFOREGROUND); return TRUE; */An dem Ding krebs ich schon 2 Tage rum...
Was mach ich da falsch???
-
Pitter (c) schrieb:
case ID_LOOK: { /* Hier lese ich die gefüllte Box aus */ hList = GetDlgItem(hwndDlg, ID_BOX); int read = SendMessage(hList, LB_GETCURSEL , 0, 0); if (read<0) return TRUE; SendMessage(hList, LB_GETTEXT,read, (LPARAM)variable); // besser vorher LB_GETTEXTLEN abfragen +++++++++++mach ich noch! Sleep(100); // wozu? // ++++++++++++++++Win CE ist was lahm.... /* Zusammensetzen des Pfades */ variable3[0] = 0; // ++++++++++++++++++Danke!!! wcscat(variable3, L"\\Storage Card\\Designs\\TestOrdner\\"); // Der Pfad ist statisch ;-)..) wcscat(variable3, variable); wcscat(variable3, L"\\icon.bmp\0") //LoadBitmap(0, variable3); // egal wie ich das mache, das Bitmap wird nicht angezeigt... :-( // statisch deklariert direkt unter MainDlgProc // static HBITMAP hbitmap; if(hBitmap) DeleteObject(hBitmap); // "altes" Bmp löschen hBitmap = LoadBitmap(NULL,variable3); // selbst mit komplettem Pfad kommt das Bitmap nicht :-( /* temporäre MsgBox zur ausgabe des Wertes der variable3 MessageBox(NULL, variable3, L"Var", MB_SETFOREGROUND); return TRUE; */ InvaidateRect(hwnd,0,TRUE); // jetzt probehalber alles löschen break; } case WM_PAINT: { PAINTSRUCT ps; HDC hdc = BeginPaint(hwnd,&ps); HDC hdcMem = CreateCompatibleDC(hdc); HGDIOBJ hbOld = SelectObject(hdcMem,hBitmap); // Hier BitBlt/StrectchBlt aufrufen SelectObject(hdcMem,hbOld); DeleteDC(hdcMem); EndPaint(hwnd,&ps); break; }An dem Ding krebs ich schon 2 Tage rum...
Was mach ich da falsch???Nur im WM_PAINT - Zweig sollte gezeichnet werden (es gibt aber Ausnahmen...)
-
case WM_PAINT: PAINTSTRUCT ps; //Fehlermeldung: Illegal use of type name 'PAINTSTRUCT' und Undeclared identifier 'ps' HDC hdc = BeginPaint(hwndDlg,&ps); // Type error in argument 2 to 'BeginPaint'; found 'int *', expected 'LPPAINTSTRUCT'. HDC hdcMem = CreateCompatibleDC(hdc); HGDIOBJ hbOld = SelectObject(hdcMem,hBitmap); BitBlt(hdc, 100, 50, 50, 50, hdc, 0, 0, SRCCOPY); SelectObject(hdcMem,hbOld); DeleteDC(hdcMem); EndPaint(hwndDlg,&ps); // Type error in argument 2 to 'EndPaint'; found 'int *', expected 'LPPAINTSTRUCT'. break;Was mach ich hier falsch???
-
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...
-
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!
