Index: base/applications/clipbrd/clipbrd.c =================================================================== --- base/applications/clipbrd/clipbrd.c (révision 70347) +++ base/applications/clipbrd/clipbrd.c (copie de travail) @@ -142,8 +142,15 @@ if (Globals.hDspBmp) { DeleteObject(Globals.hDspBmp); + Globals.hDspBmp = NULL; } + if (OpenClipboard(Globals.hMainWnd)) + { + Globals.hDspBmp = GetBitmapFromClipboardData(Globals.uDisplayFormat); + CloseClipboard(); + } + ZeroMemory(&Scrollstate, sizeof(Scrollstate)); UpdateWindowScrollState(Globals.hMainWnd, Globals.hDspBmp, &Scrollstate); @@ -275,71 +282,42 @@ static void ClipboardPaintHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - HDC hdc; PAINTSTRUCT ps; RECT rc; - if (!OpenClipboard(NULL)) + if (Globals.uDisplayFormat == CF_NONE) + return; + + if (!BeginPaint(hWnd, &ps)) + return; + + if (!GetClientRect(hWnd, &rc)) { + EndPaint(hWnd, &ps); return; } - hdc = BeginPaint(hWnd, &ps); - GetClientRect(hWnd, &rc); - - switch (Globals.uDisplayFormat) + if (!IsClipboardFormatSupported(Globals.uDisplayFormat)) { - case CF_NONE: - { - break; - } + DrawTextFromResource(Globals.hInstance, ERROR_UNSUPPORTED_FORMAT, ps.hdc, &rc, DT_CENTER | DT_WORDBREAK | DT_NOPREFIX); - case CF_UNICODETEXT: - { - DrawTextFromClipboard(hdc, &rc, DT_LEFT | DT_NOPREFIX); - break; - } + EndPaint(hWnd, &ps); + return; + } - case CF_BITMAP: + if (Globals.uDisplayFormat == CF_METAFILEPICT) + { + if (OpenClipboard(NULL)) { - BitBltFromClipboard(hdc, rc.left, rc.top, rc.right, rc.bottom, 0, 0, SRCCOPY); - break; + PlayMetaFileFromClipboard(ps.hdc, &rc); + CloseClipboard(); + return; } + } - case CF_DIB: - { - SetDIBitsToDeviceFromClipboard(CF_DIB, hdc, rc.left, rc.top, 0, 0, 0, DIB_RGB_COLORS); - break; - } + ScrollBlt(ps, Globals.hDspBmp, Scrollstate); - case CF_DIBV5: - { - SetDIBitsToDeviceFromClipboard(CF_DIBV5, hdc, rc.left, rc.top, 0, 0, 0, DIB_RGB_COLORS); - break; - } - - case CF_ENHMETAFILE: - { - PlayEnhMetaFileFromClipboard(hdc, &rc); - break; - } - - case CF_METAFILEPICT: - { - PlayMetaFileFromClipboard(hdc, &rc); - break; - } - - default: - { - DrawTextFromResource(Globals.hInstance, ERROR_UNSUPPORTED_FORMAT, hdc, &rc, DT_CENTER | DT_WORDBREAK | DT_NOPREFIX); - break; - } - } - EndPaint(hWnd, &ps); - - CloseClipboard(); } static LRESULT WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -381,8 +359,6 @@ UpdateWindowScrollState(hWnd, Globals.hDspBmp, &Scrollstate); if ((Globals.uDisplayFormat == CF_METAFILEPICT) || - (Globals.uDisplayFormat == CF_ENHMETAFILE) || - (Globals.uDisplayFormat == CF_DSPENHMETAFILE) || (Globals.uDisplayFormat == CF_DSPMETAFILEPICT)) { InvalidateRect(Globals.hMainWnd, NULL, FALSE); @@ -391,6 +367,10 @@ { InvalidateRect(Globals.hMainWnd, NULL, TRUE); } + else + { + InvalidateRect(Globals.hMainWnd, NULL, FALSE); + } break; } Index: base/applications/clipbrd/cliputils.c =================================================================== --- base/applications/clipbrd/cliputils.c (révision 70347) +++ base/applications/clipbrd/cliputils.c (copie de travail) @@ -95,6 +95,43 @@ } } +HBITMAP GetBitmapFromClipboardData(UINT uFormat) +{ + HBITMAP hBitmap = NULL; + HDC hdc; + + hdc = GetDC(Globals.hMainWnd); + if (!hdc) + return NULL; + + switch (uFormat) + { + case CF_BITMAP: + hBitmap = CopyImage(GetClipboardData(uFormat), IMAGE_BITMAP, 0, 0, 0); + break; + + case CF_ENHMETAFILE: + hBitmap = GetEnhMetafileFromClipboard(uFormat, hdc); + break; + + case CF_DIB: + case CF_DIBV5: + hBitmap = GetDibFromClipboard(uFormat, hdc); + break; + + case CF_UNICODETEXT: + hBitmap = GetUnicodeTextFromClipboardData(uFormat, hdc); + break; + + default: + break; + } + + ReleaseDC(Globals.hMainWnd, hdc); + + return hBitmap; +} + void DeleteClipboardContent(void) { if (!OpenClipboard(Globals.hMainWnd)) Index: base/applications/clipbrd/cliputils.h =================================================================== --- base/applications/clipbrd/cliputils.h (révision 70347) +++ base/applications/clipbrd/cliputils.h (copie de travail) @@ -11,3 +11,4 @@ void DeleteClipboardContent(void); UINT GetAutomaticClipboardFormat(void); BOOL IsClipboardFormatSupported(UINT uFormat); +HBITMAP GetBitmapFromClipboardData(UINT uFormat); Index: base/applications/clipbrd/winutils.c =================================================================== --- base/applications/clipbrd/winutils.c (révision 70347) +++ base/applications/clipbrd/winutils.c (copie de travail) @@ -66,69 +66,6 @@ return MessageBoxIndirectW(&mb); } -void DrawTextFromClipboard(HDC hDC, LPRECT lpRect, UINT uFormat) -{ - HGLOBAL hGlobal; - LPWSTR lpchText; - - hGlobal = GetClipboardData(CF_UNICODETEXT); - if (!hGlobal) - return; - - lpchText = GlobalLock(hGlobal); - if (!lpchText) - return; - - DrawTextW(hDC, lpchText, -1, lpRect, uFormat); - GlobalUnlock(hGlobal); -} - -void BitBltFromClipboard(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, int nXSrc, int nYSrc, DWORD dwRop) -{ - HDC hdcMem; - HBITMAP hbm; - - hdcMem = CreateCompatibleDC(hdcDest); - if (hdcMem) - { - hbm = (HBITMAP)GetClipboardData(CF_BITMAP); - SelectObject(hdcMem, hbm); - BitBlt(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcMem, nXSrc, nYSrc, dwRop); - DeleteDC(hdcMem); - } -} - -void SetDIBitsToDeviceFromClipboard(UINT uFormat, HDC hdc, int XDest, int YDest, int XSrc, int YSrc, UINT uStartScan, UINT fuColorUse) -{ - LPBITMAPINFOHEADER lpInfoHeader; - LPBYTE lpBits; - HGLOBAL hGlobal; - INT iPalSize; - - hGlobal = GetClipboardData(uFormat); - if (!hGlobal) - return; - - lpInfoHeader = GlobalLock(hGlobal); - if (!lpInfoHeader) - return; - - if (lpInfoHeader->biBitCount < 16) - { - iPalSize = (1 << lpInfoHeader->biBitCount) * 4; - } - else - { - iPalSize = 0; - } - - lpBits = (LPBYTE)lpInfoHeader + lpInfoHeader->biSize + iPalSize; - - SetDIBitsToDevice(hdc, XDest, YDest, lpInfoHeader->biWidth, lpInfoHeader->biHeight, XSrc, YSrc, uStartScan, lpInfoHeader->biHeight, lpBits, (LPBITMAPINFO)lpInfoHeader, fuColorUse); - - GlobalUnlock(hGlobal); -} - void PlayMetaFileFromClipboard(HDC hdc, const RECT *lpRect) { LPMETAFILEPICT mp; @@ -149,14 +86,6 @@ GlobalUnlock(hGlobal); } -void PlayEnhMetaFileFromClipboard(HDC hdc, const RECT *lpRect) -{ - HENHMETAFILE hEmf; - - hEmf = GetClipboardData(CF_ENHMETAFILE); - PlayEnhMetaFile(hdc, hEmf, lpRect); -} - UINT RealizeClipboardPalette(HWND hWnd) { HPALETTE hPalette; @@ -206,3 +135,109 @@ return uResult; } + +HBITMAP GetUnicodeTextFromClipboardData(UINT uFormat, HDC hdc) +{ + HBITMAP hBitmap = NULL; + HDC hdcMem; + HGLOBAL hGlobal; + LPWSTR lpchText; + RECT rc; + + hGlobal = GetClipboardData(uFormat); + if (!hGlobal) + return NULL; + + lpchText = GlobalLock(hGlobal); + if (!lpchText) + return NULL; + + hdcMem = CreateCompatibleDC(hdc); + if (hdcMem) + { + SetRectEmpty(&rc); + DrawTextW(hdc, lpchText, -1, &rc, DT_CALCRECT | DT_LEFT | DT_NOPREFIX); + + hBitmap = CreateCompatibleBitmap(hdc, rc.right, rc.bottom); + SelectObject(hdcMem, hBitmap); + + FillRect(hdcMem, &rc, GetSysColorBrush(COLOR_WINDOW)); + SetBkColor(hdcMem, GetSysColor(COLOR_WINDOW)); + DrawTextW(hdcMem, lpchText, -1, &rc, DT_LEFT | DT_NOPREFIX); + DeleteDC(hdcMem); + } + + GlobalUnlock(hGlobal); + + return hBitmap; +} + +HBITMAP GetDibFromClipboard(UINT uFormat, HDC hdc) +{ + HBITMAP hBitmap = NULL; + HDC hdcMem; + LPBITMAPINFOHEADER lpInfoHeader; + LPBYTE lpBits; + HGLOBAL hGlobal; + int iPalSize; + + hGlobal = GetClipboardData(uFormat); + if (!hGlobal) + return NULL; + + lpInfoHeader = GlobalLock(hGlobal); + if (!lpInfoHeader) + return NULL; + + hdcMem = CreateCompatibleDC(hdc); + if (hdcMem) + { + hBitmap = CreateCompatibleBitmap(hdc, lpInfoHeader->biWidth, lpInfoHeader->biHeight); + SelectObject(hdcMem, hBitmap); + + if (lpInfoHeader->biBitCount < 16) + { + iPalSize = (1 << lpInfoHeader->biBitCount) * 4; + } + else + { + iPalSize = 0; + } + + lpBits = (LPBYTE)lpInfoHeader + lpInfoHeader->biSize + iPalSize; + + SetDIBitsToDevice(hdcMem, 0, 0, lpInfoHeader->biWidth, lpInfoHeader->biHeight, 0, 0, 0, lpInfoHeader->biHeight, lpBits, (LPBITMAPINFO)lpInfoHeader, DIB_RGB_COLORS); + DeleteDC(hdcMem); + } + + GlobalUnlock(hGlobal); + + return hBitmap; +} + +HBITMAP GetEnhMetafileFromClipboard(UINT uFormat, HDC hdc) +{ + HBITMAP hBitmap = NULL; + HDC hdcMem = NULL; + HENHMETAFILE hEmf; + ENHMETAHEADER emh; + RECT rc; + + hEmf = GetClipboardData(uFormat); + if (!hEmf) + return NULL; + + hdcMem = CreateCompatibleDC(hdc); + if (hdcMem) + { + SetRectEmpty(&rc); + GetEnhMetaFileHeader(hEmf, sizeof(emh), &emh); + SetRect(&rc, 0, 0, emh.rclBounds.right, emh.rclBounds.bottom); + hBitmap = CreateCompatibleBitmap(hdc, rc.right, rc.bottom); + SelectObject(hdcMem, hBitmap); + PlayEnhMetaFile(hdcMem, hEmf, &rc); + DeleteDC(hdcMem); + } + + return hBitmap; +} Index: base/applications/clipbrd/winutils.h =================================================================== --- base/applications/clipbrd/winutils.h (révision 70347) +++ base/applications/clipbrd/winutils.h (copie de travail) @@ -10,9 +10,8 @@ void BringWindowToFront(HWND hWnd); int DrawTextFromResource(HINSTANCE hInstance, UINT uID, HDC hDC, LPRECT lpRect, UINT uFormat); int MessageBoxRes(HWND hWnd, HINSTANCE hInstance, UINT uText, UINT uCaption, UINT uType); -void DrawTextFromClipboard(HDC hDC, LPRECT lpRect, UINT uFormat); -void BitBltFromClipboard(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, int nXSrc, int nYSrc, DWORD dwRop); -void SetDIBitsToDeviceFromClipboard(UINT uFormat, HDC hdc, int XDest, int YDest, int XSrc, int YSrc, UINT uStartScan, UINT fuColorUse); void PlayMetaFileFromClipboard(HDC hdc, const RECT *lpRect); -void PlayEnhMetaFileFromClipboard(HDC hdc, const RECT *lpRect); UINT RealizeClipboardPalette(HWND hWnd); +HBITMAP GetUnicodeTextFromClipboardData(UINT uFormat, HDC hdc); +HBITMAP GetDibFromClipboard(UINT uFormat, HDC hdc); +HBITMAP GetEnhMetafileFromClipboard(UINT uFormat, HDC hdc);