Zum Inhalt springen

Bitmap zeichnen


maddin

Empfohlene Beiträge

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

@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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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>

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...