Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Bitmap zeichnen

Empfohlene Antworten

Veröffentlicht

hallo,

ich versuche in einem programm ein bitmap zu zeichnen. das ganze sieht zur zeit so aus.


case WM_PAINT:

{

  if (strcmp(g_Img, "") != 0)

  {

    cout << "paint" << endl;

    HBITMAP hBitmap;

    BITMAP bitmap;

    HDC hdc, hdcMem;

    PAINTSTRUCT    ps;

    hBitmap = (HBITMAP) LoadImage(NULL, g_Img, IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE | LR_CREATEDIBSECTION);

    GetObject (hBitmap, sizeof (BITMAP), &bitmap);

    hdc = BeginPaint (hWnd, &ps);

    hdcMem = CreateCompatibleDC (hdc);

    SelectObject (hdcMem, hBitmap);

    BitBlt (hdc, 50, 50, bitmap.bmWidth, bitmap.bmHeight, hdcMem, 0, 0, SRCCOPY);

    EndPaint (hWnd, &ps);

    DeleteDC (hdcMem);

    DeleteObject (hBitmap);

  }

 break;

}

in g_Img steht der dateiname des bitmaps, das gezeichnet werden soll. das problem ist jetzt, das er das bitmap zwar einwandfrei zeichnet, aber nur, nachdem ich das fenster einmal minimiert und dann wiederhergestellt habe. bei einen einfachen senden der nachricht WM_PAINT des fensters wird das bitmap nicht gezeichnet. meine frage ist nun die nach dem warum und wie kann ich das ändern ???

<FONT COLOR="#a62a2a" SIZE="1">[ 23. Oktober 2001 08:29: Beitrag 1 mal editiert, zuletzt von maddin ]</font>

Wenn ich mich dunkel erinnere, müßtest du die Methode on_paint (oder so) überschreiben, damit bei Fensterveränderungen der Fensterinhalt neu aufgebaut wird.

wenn ich mich dunkel erinner ist die mehtode on_paint oder das überschreiben dieser eine geschichte der mfc. und damit arbeite ich nicht.

Hi, unter windows ist es so das Anwendung sich selber merken müssen was bei ihnen gespeichert wurde. Daher musst du dir alle gezeichneten Objekte abspeichern z.B. in der Klasse CArray. Wenn nun das Fenster z.B. minimiert und maximiert. wird wird die Message WM_PAINT geschickt, welche von der Funktion onpaint() aufgegangen wird, diese Funktion musst du überschreiben, und hierrin dann die Gespeicherten Objete neu Zeichnen!

@NewNuke

ok erstmal benutze ich immer nocht nicht die mfc und kann so auch nicht die funktion onpaint überschreiben. oder habe ich da irgentetwas nicht mitbekommen.

zweitens habe ich mir alle objekte die ich zeichnen möchte gespeichert. und zwar als dateinamen eines bitmaps in g_Img.

drittens ist es glaube ich genau andere herum wie du es verstanden hast. das bitmap wird nach einem minimieren und gefolgtem wiederherstellen korrekt gezeichnet.

das einzige problem ist, das das bild nicht gezeichnet wird, wenn ich dem fenster manuell die nachricht WM_PAINT sende.

Ich meine auch, daß Du um das OnPaint nicht drumrum kommst.

"The system sends an internal WM_PAINT message only once. After an internal WM_PAINT message is returned from GetMessage or PeekMessage or is sent to a window by UpdateWindow, the system does not post or send further WM_PAINT messages until the window is invalidated or until RedrawWindow is called again with the RDW_INTERNALPAINT flag set."

Die Nachricht wird halt aufgenommen und ins Nirvana geschickt, bevor sie Dein Fenster erreicht. Offensichtlich ist Onpaint dran schuld, weil hier die Paint-Message abgefangen wird. Vielleicht würde es klappen, wenn Du hier RedrawWindow() mit dem komischen Flag am Ende aufrufst?!?!? Oder besser noch das ganze in UpdateWindow() refreshen lassen.

<FONT COLOR="#a62a2a" SIZE="1">[ 23. Oktober 2001 09:36: Beitrag 3 mal editiert, zuletzt von Crush ]</font>

<BLOCKQUOTE><font size="1" face="Verdana, Arial, Helvetica, sans-serif">Zitat:</font><HR>Original erstellt von Crush:

<STRONG>Ich meine auch, daß Du um das OnPaint nicht drumrum kommst.

</STRONG>

Ok, anderer Vorschlag: Nimm einen Message-Schnüffler und Zeichne mal die Messages die beim Minimizen & Maximizen so verschickt werden auf. Versuche einen von diesen Messages abzufangen und hier den Update reinzubasteln. Ich habe mich auch schon gefragt, wie ich mich in die Message-Queue einklinken könnte, sodaß ich zuerst alle Signale filtern kann bevor irgendwas ausgelöst wird. Wenn Du das irgendwie hinkriegen solltest, würd´s mich interessieren wie. Darfst Du keine MFC verwenden oder willst Du das nicht? Härteste Lösung wäre es einen Timerprozess laufen zu lassen, der die Größe und den Status des Fensters ausliest. Beim Ändern zu Normalgröße mußt Du halt dann das Bild selber neu blitten.

CWnd *pmeinWindow = FindWindow(NULL, _T("Name von Meinemwindow"));

dann kannst Du ja hiermit ordentlich weiterarbeiten!

<FONT COLOR="#a62a2a" SIZE="1">[ 23. Oktober 2001 10:35: Beitrag 3 mal editiert, zuletzt von Crush ]</font>

1.) ich darf keine mfc verwenden.

2.) an die message - queue anhänge wäre sicherlich interessant. da bin ich aber auch schon ein wenig am tüftel. bislang erfolglos. am besten den source von spy++ klauen.

3.) problem hat sich gelöst. habe vor dem senden der WM_PAINT nachricht einen aufruf der funktion InvalidateRect hinzugefügt. mit RedrawWindow sollte es laut doku auch klappen aber irgendwie nicht bei mir.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.