Icon (Bitmap) neben Auswahlbox anzeigen.
-
Hallo Leute,
ich habe folgendes vor:
Ich lese ein Verzeichnis nach Ordnern aus mit:
wcscpy (sDirectory, L"\\Storage Card\\Designs\\*.*\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;Jetzt würde ich gerne aus dem jeweilig markierten Ordner der Textbox dsa in dem Ordner befindliche Bitmap als Vorschau in einem daneben liegenden Bitmap anzeigen lassen, wenn der User sich da durchwühlt....
D.h.: Wenn der User in der Textbox einen anderen Eintrag auswählt, soll die Vorschau aktualisiert werden
Hat da jemand eine Idee zu, wie ich das hinbekommen kann?
Die Ordner-Struktur ist immer identisch und auch das Bitmap heisst immer gleich.
-
Erst einmal ist das eine von wenigen Situationen, in der man lieber eine fußgesteuerte Schleife nehmen sollte.
FindFirstFile(...); do { //.. }while(FindNextFile(...));So reduzierst du doppelten Code, bei Veränderungen braucht nur ein Bereich überprüft werden.
Du reagierst nun auf die WM_COMMAND-Msg, LOWORD(wParam) ist die ID der Listbox, HIWORD(wParam) sollte LBN_SELCHANGE sein.
Anschließend das Bitmap entladen, den Pfad der Datei aus dem Root-Name, dem Listeneintrag und dem Namen des Bitmaps zusammenbauen, das Bitmap laden und den Bereich, in dem das Bitmap angezeigt werden soll, für ungültig erklären. Vorher sollte noch überprüft werden, ob sich das Höhen-Breiten-Verhältnis geändert hat, wenn ja, sollte der Hintergrund ebenfalls gelöscht werden (InvalidateRect(hwnd,&rcBitmap,TRUE).
-
Hallo Vicious Falcon,
erst mal vielen Dank für die Hilfe.
Allerdings krieg ich das selber so nicht gebacken. Hättest Du dazu vielleicht einen Codeschnippel für mich, dass ich das verstehe? Büdde...

-
Keine Codeschnipsel, nur ein paar Anregungen. Ich denke, der Dialog/das Fenster ist erstellt, die Listbox eingefügt und die Ordnernamen sind in der Lise gespeichert.
Jetzt muss deine WndProc angepasst werden, das geht, wie oben beschrieben mit WM_COMMAND und den Werten des WPARAMs.case WM_COMMAND: { switch(LOWORD(wParam) { case ID_DER_LISTE: if(HIWORD(wParam)!=LBN_SELCHANGE) break; // hier jetzt mit LB_GETCURSEL Index bestimmen, mit LB_GETTEXT den Text auslesen // Achtung: Vorher unbedingt mit LB_GETTEXTLEN prüfen, ob der Puffer groß genug ist } }Den Dateinamen des Bitmaps solltest du jetzt zusammenbauen können. Stichwort StringCbCopy und StringCbCat aus den StrSafe-Funktionen.
Nun überprüfen, ob ein Bitmap zuvor geladen wurde. Ich würde das HBITMAP als statische Variable in der WndProc deklarieren.
Dieses HBITMAP nun auf NULL testen und ggf. per DeleteObject freigeben. Dieses DeleteObject sollte auch bei WM_DESTROY stehen.
Per LoadBitmap kann nun das Bitmap geladen werden.
Der Bereich, in dem das Bitmap angezeigt werden soll, wird nun für ungültig erklärt (InvalidateRect(...)).
Im WM_PAINT-Zweig wird nun BeginPaint aufgerufen, das Bitmap in einen zuvor erstellten DC gewählt (CreateCompatibleDC) und entweder BitBlt oder StretchBlt aufgerufen (mit dem durch BeginPaint erhaltenen DC als hdcDest).
-
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.