diff --git a/reactos/dll/win32/user32/windows/caret.c b/reactos/dll/win32/user32/windows/caret.c index cb7fbb38165..2befd871142 100644 --- a/reactos/dll/win32/user32/windows/caret.c +++ b/reactos/dll/win32/user32/windows/caret.c @@ -31,53 +31,56 @@ #include #include +WINE_DEFAULT_DEBUG_CHANNEL(user32); + /* FUNCTIONS *****************************************************************/ void DrawCaret(HWND hWnd, PTHRDCARETINFO CaretInfo) { - HDC hDC, hComp; + HDC hdc, hdcMem; + HBITMAP hbmOld; + BOOL bDone = FALSE; - hDC = GetDC(hWnd); - if(hDC) + hdc = GetDC(hWnd); + if (!hdc) { - if(CaretInfo->Bitmap && GetBitmapDimensionEx(CaretInfo->Bitmap, &CaretInfo->Size)) - { - hComp = CreateCompatibleDC(hDC); - if(hComp) - { - SelectObject(hComp, CaretInfo->Bitmap); - BitBlt(hDC, - CaretInfo->Pos.x, - CaretInfo->Pos.y, - CaretInfo->Size.cx, - CaretInfo->Size.cy, - hComp, - 0, - 0, - SRCINVERT); - DeleteDC(hComp); - } - else - PatBlt(hDC, - CaretInfo->Pos.x, - CaretInfo->Pos.y, - CaretInfo->Size.cx, - CaretInfo->Size.cy, - DSTINVERT); - } - else - { - PatBlt(hDC, - CaretInfo->Pos.x, - CaretInfo->Pos.y, - CaretInfo->Size.cx, - CaretInfo->Size.cy, - DSTINVERT); - } - ReleaseDC(hWnd, hDC); + ERR("GetDC failed\n"); + return; } + + if(CaretInfo->Bitmap && GetBitmapDimensionEx(CaretInfo->Bitmap, &CaretInfo->Size)) + { + hdcMem = CreateCompatibleDC(hdc); + if (hdcMem) + { + hbmOld = SelectObject(hdcMem, CaretInfo->Bitmap); + bDone = BitBlt(hdc, + CaretInfo->Pos.x, + CaretInfo->Pos.y, + CaretInfo->Size.cx, + CaretInfo->Size.cy, + hdcMem, + 0, + 0, + SRCINVERT); + SelectObject(hdcMem, hbmOld); + DeleteDC(hdcMem); + } + } + + if (!bDone) + { + PatBlt(hdc, + CaretInfo->Pos.x, + CaretInfo->Pos.y, + CaretInfo->Size.cx, + CaretInfo->Size.cy, + DSTINVERT); + } + + ReleaseDC(hWnd, hdc); }