Bitmap in Edit



  • Also irgentwie funktioniert es nicht. Ich dachte ich mach erst mal so, dass halt nach dem Zeichnen wieder alles so aussieht wie am Anfang. Also erst mal ohne transparenz. Es funktioniert aber nicht. Wie kann ich den den alten DC speichern und nach dem Zeichnen des Bildes den alten wieder reinmalen?

    So schauts aus:

    if((HWND)lParam==GetDlgItem(hDlg, TXT_TEXT)){
                // get item
                dis = (DRAWITEMSTRUCT*)&lParam;
    
                hDC = BeginPaint(hDlg, &ps);
                    // save old
                    hOldDC = (HDC)wParam;
    
                    // create compatible dc
                    hMemDC = CreateCompatibleDC((HDC)wParam);
    
                    // select bitmap into memory
                    SelectObject(hMemDC, hPanelBmp);                    
    
                    // blit it to main dc
                    BitBlt((HDC)wParam, 0, 0, 100, 100, hMemDC, 0, 0, SRCCOPY);
    
                    // blit old back
                    BitBlt((HDC)wParam, 0, 0, 100, 100, hOldDC, 0, 0, SRCCOPY);
    
                    // cleanup
                    DeleteDC(hMemDC);
                EndPaint(hDlg, &ps);
    
                //return (LRESULT)GetStockObject(NULL_BRUSH);
            }
    


  • Ich denke mal, du musst das so anstellen:

    - Handle auf den DC holen (DC1)
    - Kompatiblen DC zu DC1 erstellen (DC2)
    - Kompatibles Bitmap von DC1 erstellen (BMP1)
    - BMP1 in DC2 selektieren
    - DC1 auf DC2 blitten (jetzt hast du eine Kopie des bisherigen Inhalts)

    - Kompatiblen DC zu DC1 erstellen (DC3)
    - Dein Bitmap hineinselektieren
    - DC3 auf DC1 blitten (jetzt siehst du das Bitmap)

    - Jetzt DC2 wieder auf DC1 blitten (mit geeignetem ROP-Code)

    PS: Du speicherst bisher nur ein Handle, des DC, das bringt dir natürlich nichts, du musst ihn schon richtig kopieren 😉

    [ Dieser Beitrag wurde am 16.02.2003 um 15:53 Uhr von flenders editiert. ]



  • Also danke flenders,
    Hört sich logisch an, aber ich raffs net.
    Habs so:

    if((HWND)lParam==GetDlgItem(hDlg, TXT_PROFILE)){
    
                hDC = BeginPaint(hDlg, &ps);
                    // save old
                    hOldDC = CreateCompatibleDC(hDC);
    
                    HBITMAP hBmp = CreateCompatibleBitmap((HDC)wParam, 50, 30);
    
                    SelectObject(hOldDC, hBmp);
    
                    BitBlt(hOldDC, 0, 0, 50, 30, hDC, 0, 0, SRCCOPY);
    
                    // create compatible dc
                    //hMemDC = CreateCompatibleDC((HDC)wParam);
    
                    // select bitmap into memory
                    //SelectObject(hMemDC, hPanelBmp);                  
    
                    // blit it to main dc
                    //BitBlt((HDC)wParam, 0, 0, 50, 30, hMemDC, 0, 0, SRCCOPY);
    
                    // blit old back
                    BitBlt((HDC)wParam, 0, 0, 50, 30, hOldDC, 0, 0, SRCCOPY );
    
                    // cleanup
                    DeleteDC(hMemDC);
                EndPaint(hDlg, &ps);
    
                //SetBkMode((HDC)wParam,TRANSPARENT);
                //return (long)CreateSolidBrush(RGB(218, 218, 255));
            }
    

    Wenn ich es so mache müsste doch rein optisch garnichts passieren oder?
    Ich speichere das alte und blitte es dann sofort wieder rein?!



  • Eigentlich schon 🙄
    BTW, warum nimmst du nicht einfach CreateCompatibleBitmap(hDC); 😕



  • Original erstellt von flenders:
    Eigentlich schon 🙄
    BTW, warum nimmst du nicht einfach CreateCompatibleBitmap(hDC); 😕

    Hä? CreateCompatibleBitmap verlangt bei mir 3 Parameter, oder hab ich dich falsch verstanden?



  • Du kannst auch nur den ersten angeben: http://msdn.microsoft.com/library/en-us/gdi/bitmaps_1cxc.asp



  • Also es ist jetzt so.
    Zeichne ich den vorher gespeicherten DC nicht wieder zurück dann wird das Bitmap angezeigt. Nur komischerweise plötzlich unter dem Edit. Also es schaut nur unten ein kleines Stück heraus.
    Zeichen ich aber das vorher gespeicherte wieder zurück dann ist alles als wäre nichts also scheint es jetzt zu funktionieren.

    Ich hab halt noch das Problem mit dem Edit:

    --------------------
    | Hier ist das Edit |
    --------------------
    ******** <= Stück vom Bitmap
    

    Hier mein Quelltext

    // edit
        case WM_CTLCOLOREDIT:
            // get item
            dis = (DRAWITEMSTRUCT*)&lParam;
    
            if((HWND)lParam==GetDlgItem(hDlg, TXT_PROFILE)){
                // save old
                HGDIOBJ hOldObj1, hOldObj2;
                HDC     hOldDC      = CreateCompatibleDC((HDC)wParam);
                HBITMAP hOldBmp     = CreateCompatibleBitmap((HDC)wParam, 50, 50);
                SelectObject(hOldDC, hOldBmp);
                BitBlt(hOldDC, 0, 0, 50, 50, (HDC)wParam, 0, 0, SRCCOPY);
    
                // blit bitmap
                HDC hMemDC          = CreateCompatibleDC((HDC)wParam);
                hOldObj2            = SelectObject(hMemDC, hBmpTest);
                BitBlt((HDC)wParam, 0, 0, 50, 50, hMemDC, 0, 0, SRCCOPY);
    
                BitBlt((HDC)wParam, 0, 0, 50, 50, hOldDC, 0, 0, SRCCOPY);
    
                // cleanup
                DeleteObject(SelectObject(hMemDC, hOldObj2));
                DeleteDC(hMemDC);
                DeleteObject(SelectObject(hOldDC, hOldObj1));
                DeleteObject(hOldBmp);
                DeleteDC(hOldDC);
    
                // break;
                return 0;
            };
    
            // all normal statics
            SetBkMode((HDC)wParam,TRANSPARENT);
            return (long)CreateSolidBrush(RGB(218, 218, 255));
    

    Man! Wo ist da der Haken?!?!?!

    danke!
    cu para
    😃



  • dis = (DRAWITEMSTRUCT*)&lParam; 😕 😕



  • CreatePatternBrush();
    WM_CTLCOLOREDIT
    SetBkMode();



  • Original erstellt von <Gregor>:
    dis = (DRAWITEMSTRUCT)&lParam; 😕 😕*

    Was willst du damit sagen???
    Ich brauch dir struct weiterunten im Code

    CreatePatternBrush();
    WM_CTLCOLOREDIT
    SetBkMode();

    Wäre evtl. ein wenig Text zusätzlich möglich, weil ich kann mir nichts darunter vorstellen.

    Ähem. Das hätte sich dann wohl erledigt.
    DANKE DANKE DANKE!
    Funktioniert einwandfrei!

    danke!
    cu para
    😃



  • Achja. Kann es sein, dass es nicht bei RichEdit funktioniert???



  • lol, bei WM_CTLCOLOREDIT ist lparam doch garkeine DRAWITEMSTRUCT*, und wenn ist lparam direkt der Zeiger. Aber zum Glück verwendest du die Struktur garnicht. 😃



  • Jetzt sag nicht nach 2 Seiten, dass du garkein Edit, sondern ein RichEdit hast...
    Die Frage von Gregor war schon berechtigt: nimm mal das '&' weg vor lParam.

    [EDIT] Oh ja. lParam ist ein HWND [/EDIT]

    [ Dieser Beitrag wurde am 16.02.2003 um 17:38 Uhr von WebFritzi editiert. ]



  • wParam
    Handle to the device context for the edit control window.
    lParam
    Handle to the edit control.



  • Original erstellt von WebFritzi:
    **Jetzt sag nicht nach 2 Seiten, dass du garkein Edit, sondern ein RichEdit hast...
    Die Frage von Gregor war schon berechtigt: nimm mal das '&' weg vor lParam.

    [EDIT] Oh ja. lParam ist ein HWND [/EDIT]

    [ Dieser Beitrag wurde am 16.02.2003 um 17:38 Uhr von [qb]WebFritzi** editiert. ][/QB]

    Doch das sage ich jetzt.
    Sagen wir so ich hab beides.
    Und möchte gerne wissen wie es bei dem RichEdit geht.



  • Sendet denn ein Richedit überhaupt so eine Color Message?



  • Original erstellt von <Frage>:
    Sendet denn ein Richedit überhaupt so eine Color Message?

    Gute Frage...

    Auserdem funzt es doch noch nicht so gut:

    // edit
        case WM_CTLCOLOREDIT:
            if((HWND)lParam==GetDlgItem(hDlg, TXT_PROFILE)){
                SetBkMode((HDC)wParam,TRANSPARENT);         // Texthintergrund auf transparent setzen
                SetTextColor((HDC)wParam,RGB(0,0,0)); // Textfarbe auf Weiss setzen
                return (long)CreatePatternBrush(hBmpTest);
            }
    

    Also ich schreibe jetzt in die Box. Funzt einwandfrei. Dahinter steht dann auch mein Bitmap. Nur wenn ich jetzt mit Backspace das löschen will oder Entfernen (ist egal) dann bleibt der Text so lange darin stehen, bis er praktisch nicht mehr drinstehen darf, weil alles entfernt wurde. Erst dann verschwindet er.

    [ Dieser Beitrag wurde am 16.02.2003 um 17:47 Uhr von paranoiac.org editiert. ]



  • teste es aus (ich glaube nein)



  • Original erstellt von <mal>:
    teste es aus (ich glaube nein)

    Ja mit der Msg von oben gehts net. Aber ne RichEdit sendet doch bestimmt sowas ähnliches...



  • Subclassing?


Anmelden zum Antworten