hBitmap und Memory-DC farbig



  • Hallo!

    Was hab ich vor: Ich will außerhalb von WM_PAINT in ein memory-DC malen und in WM_PAINT dann nur noch das ganze auf einen Teil der Oberfläche schmeißen. Die memory-DC (oder die bitmap?) soll wiederverwendet werden, damit ich die ganzen berechnungen nicht nochmal machen muss, falls z.b. das fenster vergrößert wird. die lösung, die ich mir zusammengegoogelt habe, funktioniert auch im Prinzip:
    (hab jetz nnich auf gdi-leaks geachtet)

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static HDC hdcScr,hdc;
    static HBITMAP hbmpScr, hbmpOrig;
       switch (message)                  /* handle the messages */
        {   case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            return 0;
        case WM_CREATE: {
            SetTimer(hwnd, 1, 700, (TIMERPROC) NULL);
            hdc = GetDC(hwnd);
            hdcScr = CreateCompatibleDC(hdc);
            ReleaseDC(hwnd, hdc);
            //hbmpOrig=CreateBitmap(400,400,1,24,&farbe);
            hbmpOrig = CreateCompatibleBitmap(hdcScr, 400,400);
            hbmpScr=(HBITMAP)SelectObject(hdcScr,hbmpOrig);
            RECT r = {0,0,400,400};
            FillRect(hdcScr, &r, (HBRUSH)GetStockObject(WHITE_BRUSH));
            break;}
        case WM_PAINT:
        {   PAINTSTRUCT ps;
            hdc = BeginPaint(hwnd, &ps);
            BitBlt(hdc, ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right - ps.rcPaint.left,ps.rcPaint.bottom - ps.rcPaint.top,
                   hdcScr, ps.rcPaint.left, ps.rcPaint.top, SRCCOPY);
            EndPaint(hwnd, &ps);
            break; }
        case WM_TIMER:
        {   HBRUSH hbrush = CreateSolidBrush(0xFF2eF0);
            SelectObject(hdcScr,hbrush);
            int xx1=rand()%290,yy1=rand()%290;
            Rectangle(hdcScr,xx1,yy1,xx1+30,yy1+30);
            InvalidateRect(hwnd, NULL, TRUE);
            return 0;}
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);}
        return 0;}
    

    Mein Problem: das ganze funktioniert nur in schwarz-weiß, Farben funktionieren iwie nicht. Wie kann ich die hbitmap oder memory-DC verbiegen, sodass sie 24-bit-farben kann?

    google und msdn haben mich nicht wirklich weiter gebracht.

    zusätzlich sei gesagt, dass ich plane, die berechnete Bitmap auch als Datei zu speichern(könnte ja relevant sein für die richtung des lösungsansatzes)
    vielen dank für hilfe, ich hoffe ich konnte verstanden werden.

    Falls es euch hilft: ich benutze codeblocks und gnu gcc



  • Bei:

    CreateCompatibleBitmap(hdcScr, 400,400);
    

    nicht hdcScr, sondern hdc angeben 😉

    Nachtrag:
    Bild speichern als *.bmp: http://www.c-plusplus.net/forum/39400
    Mit GDI+ kann man auch u.A. PNG und Jpeg-Dateien erzeugen:
    http://www.c-plusplus.net/forum/217739-full



  • geeky schrieb:

    Bei:

    CreateCompatibleBitmap(hdcScr, 400,400);
    

    nicht hdcScr, sondern hdc angeben 😉

    Nachtrag:
    Bild speichern als *.bmp: http://www.c-plusplus.net/forum/39400
    Mit GDI+ kann man auch u.A. PNG und Jpeg-Dateien erzeugen:
    http://www.c-plusplus.net/forum/217739-full

    Vielen Dank! allerdings muss man die zeile noch nach oben vor das ReleaseDC schieben, erst dann gehts bei mir. so, jetzt schau ich mir mal das speichern an...


Log in to reply