Bild in einem Fenster anzeigen/laden
-
Hallo,
Ich möchte in einem Fenster ein Bild anzeigen. Ich habe allerdings bei der Forensuche nur beiträge gesehen in dennen das über WM_PAINT gemacht wird gesehen. In dem Fenster in dem das Bild angezeigt werden soll gibt es aber ncoh andere Fenster die nicht mehr gezeichnet werden wenn ich WM_PAINT benutzte. Hat jemmand ne Idee wie ich das machen kann oder wo ich ein gutes Tut zu Bilden in Fenstern finde?
PS: Das bild liegt als bmp vor.
-
Dann ist entweder dein WM_PAINT-Zweig falsch oder die anderen Fenster sind falsch designed. Zeig doch mal deinen Versuch.
Prinzipiell wird immer alles in ("irgendeinem") WM_PAINT gezeichnet!
-
case WM_CREATE: //Intialiesierungen static HINSTANCE hinstance = (HINSTANCE) GetWindowLong(hwnd,GWL_HINSTANCE); CreateWindow("static", "Latein:", WS_VISIBLE | WS_CHILD, 60,100,100,20, hwnd, NULL, hinstance, NULL); CreateWindow("static", "Deutsch:", WS_VISIBLE | WS_CHILD, 60,140,100,20, hwnd, NULL, hinstance, NULL); CreateWindow("static", "Zusätze:", WS_VISIBLE | WS_CHILD, 60,180,100,20, hwnd, NULL, hinstance, NULL); CreateWindow("edit", "", WS_VISIBLE | WS_CHILD | WS_BORDER, 140,100,160,20, hwnd, (HMENU) EDIT_LATEIN, hinstance, NULL); CreateWindow("edit", "", WS_VISIBLE | WS_CHILD | WS_BORDER, 140,140,160,20, hwnd, (HMENU) EDIT_DEUTSCH, hinstance, NULL); CreateWindow("edit", "", WS_VISIBLE | WS_CHILD | WS_BORDER, 140,180,160,20, hwnd, (HMENU) EDIT_ZUSATZ, hinstance, NULL); CreateWindow("button", "Weiter", WS_VISIBLE | WS_CHILD, 220,220,100,30, hwnd, (HMENU) BU_WEITER, hinstance, NULL); CreateWindow("button", "Lösung", WS_VISIBLE | WS_CHILD, 100,220,100,30, hwnd, (HMENU) BU_LOSUNG, hinstance, NULL); EnumChildWindows(hwnd, EnumChildProc, 0); case WM_COMMAND: switch(LOWORD(wParam)) { case BU_WEITER: MessageBox(0, "Weiter", 0,0); break; case BU_LOSUNG: MessageBox(0, "Lösung", 0,0); break; case MENU_OFFNEN: MessageBox(0, "Öffnen", 0,0); break; case MENU_SPEICHERN: MessageBox(0, "Speichern",0,0); break; case MENU_DRUCKEN: MessageBox(0,"Drucken",0,0); break; } case WM_PAINT: break;Hier werden die einzelnen Elemente des Fensters die bei WM_CREATE stehen nicht gezeichnet.
-
WM_PAINT ist ja leer
Ich meinte mit dem Bild zeichnen.BTW: fehlen da einige "return 0;" bzw. break;
-
Also das ist nur ein Ausschnit und das das Break nach WM_CREATE fehlt ist nicht so tragisch, (habe ich jetzt hingemacht). Ich glaube das Problem ist das die Schaltflächen deshalb nicht gezeichnet werden weil, sie mit DefWindowProc arbeiten, das ja nur bei nachrichten aufgerufen wird die ich nicht selber behandele.
Da es jetzt schon nicht mit einem leeren WM_PAINT funktioniert, wird es auch dann nicht funktionieren wenn WM_PAINT da ist.
HINWEIS: Es funktioniert nur (das überhaupt was gezeichnet wird), wenn ich WM_PAINT ganz weglasse.
-
In WM_PAINT musst du BeginPaint/EndPaint oder ValidateRect aufrufen oder es die DefWindowProc machen lassen.
-
Toll und wie kann ich in WM_PAINT ein Bild zeichnen und es gleichzeitig an die DefWndProc weitergeben. Einfach am Ende von WM_PAINT DefWndProc aufrufen?
-
Was ich ganz vergessen habe zu erwähnen, gibt es ne möglichkeit das Bild einfach so einzufügen wie ich den Rest gemacht habe, also mit CreateWindow("xy", ...)?
-
flammenvogel schrieb:
Toll und wie kann ich in WM_PAINT ein Bild zeichnen und es gleichzeitig an die DefWndProc weitergeben. Einfach am Ende von WM_PAINT DefWndProc aufrufen?
Wofür sollte das denn gut sein?
Möglichkeiten:
1. Du lässt Windows alles selber zeichnen: WM_PAINT wird nicht abgefangen2. Du zeichnest das Fenster selber: WM_PAINT wird abgefangen:
case WM_PAINT: return OnPaint();2.a) "leeres" OnPaint():
BOOL CppAppWnd::OnPaint() { PAINTSTRUCT ps; // fehlen diese drei Zeilen, BeginPaint(hAppWnd,&ps); // produziert man eine EndPaint(hAppWnd,&ps); // Endlosschleife return 0; }2.b) selber etwas zeichnen
BOOL CppAppWnd::OnPaint() { PAINTSTRUCT ps; HDC hdc = BeginPaint(hMapScroll, &ps); HDC hdcMem = CreateCompatibleDC(NULL); // Male das bitmap ins Map-Feld SelectObject(hdcMem, hBmp); BitBlt(hdc, 0, 0, xMapScroll, yMapScroll, hdcMem, xPos, yPos, SRCCOPY); EndPaint(hAppWnd,&ps); return 0; }
-
flammenvogel schrieb:
Was ich ganz vergessen habe zu erwähnen, gibt es ne möglichkeit das Bild einfach so einzufügen wie ich den Rest gemacht habe, also mit CreateWindow("xy", ...)?
3.
Ein static-Control kann Bilder anzeigen: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/commctls/staticcontrols/staticcontrolreference/staticcontrolmessages/stm_setimage.asp
-
Danke es läuft jetzt