Gelber Balken in CEditCtrl



  • Hallo

    Ich möchte gerne einen gelben Balken in meinem Edit Control einbauen (wie in UltraEdit oder Notepad++)

    Folgenden Code habe ich in WM_PAINT eingebaut

    HDC hdc, hdcScreenBuffer;
    PAINTSTRUCT ps;
    RECT rcClient;
    HBITMAP hBitmap, hBmpOld;
    HBRUSH hBrYellow,hBrWhite;

    //Start painting
    hdc = ::BeginPaint(m_cEditor,&ps);

    hdcScreenBuffer = CreateCompatibleDC( ::GetDC(hWnd) );
    ::GetClientRect(m_cEditor,&rcClient);
    hBitmap = CreateCompatibleBitmap(hdc,rcClient.right, rcClient.bottom = 20 );
    hBmpOld = (HBITMAP) SelectObject(hdcScreenBuffer,hBitmap);
    hBrYellow = CreateSolidBrush(RGB(0xFF, 0xFF, 0));
    hBrWhite = CreateSolidBrush(RGB(100, 100,100));

    ::FillRect(hdcScreenBuffer,&rcClient,hBrYellow);
    BitBlt(hdc,0,yDest,rcClient.right ,rcClient.bottom ,hdcScreenBuffer,0,0,SRCAND);

    // Free Memory
    DeleteObject(SelectObject(hdcScreenBuffer,hBmpOld));
    DeleteObject(hBrYellow);
    DeleteObject(hBrWhite);
    DeleteDC(hdcScreenBuffer);
    ReleaseDC(hdc);

    //Stop painting
    ::EndPaint(m_wndEditor,&ps);

    Beim ersten Click wird ein gelber Balken in die entsprechende Textzeile gezeichnet. So weit so gut.
    Beim Nächsten Click wird ebenfalls ein gelber Balken an die Stelle gezeichnet. Somit habe ich pro Click einen Balken im Text.

    Wie kann ich es erreichen, dass der "alte" Balken verschwindet und nur der Neue zu sehen ist?

    Gruss
    Matthias



  • zuerst folgendes:
    bitte benutze die cpp-tags um code zu posten.

    dein problem wird sein, dass das controll nur den berech neu zeichnet, wo der cursor ist.
    Du musst also ein neuzeichnen der alten position erzwingen. Zb mit invalidateRect.

    BitBlt ist doch auch im globalen Namespace, sollte also auch zwei doppelpunkte spendiert bekommen.



  • Dazu muss du einen zweiten Buffer haben. Deswegen wird die Technik: Double Buffering genannt. Der zweite Buffer ist BITBLT ,,,, XOR
    so kann man die Bilder beliebig ein und ausblenden. Genauer kann man sagen: Du erhälst das Original-Bild als Speicherbitmap und blittest immer eines dazu, das geht auch.



  • vlad_tepesch schrieb:

    zuerst folgendes:
    bitte benutze die cpp-tags um code zu posten.

    dein problem wird sein, dass das controll nur den berech neu zeichnet, wo der cursor ist.
    Du musst also ein neuzeichnen der alten position erzwingen. Zb mit invalidateRect.

    BitBlt ist doch auch im globalen Namespace, sollte also auch zwei doppelpunkte spendiert bekommen.

    Schwätzer! ⚠


Anmelden zum Antworten