From dee57c2bf40bf0079205fb630a46ac43c5a6c516 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 1 Nov 2015 16:25:19 +0000 Subject: [PATCH] [CLIPBRD] Add a clipboard viewer utility to ReactOS, courtesy Ricardo Hanke. Icon by Jared Smudde. CORE-10353 svn path=/trunk/; revision=69776 --- reactos/base/applications/CMakeLists.txt | 1 + .../base/applications/clipbrd/CMakeLists.txt | 12 + reactos/base/applications/clipbrd/clipbrd.c | 363 ++++++++++++++++++ reactos/base/applications/clipbrd/clipbrd.rc | 26 ++ reactos/base/applications/clipbrd/cliputils.c | 143 +++++++ reactos/base/applications/clipbrd/cliputils.h | 13 + .../base/applications/clipbrd/lang/de-DE.rc | 61 +++ .../base/applications/clipbrd/lang/en-US.rc | 61 +++ .../base/applications/clipbrd/lang/fr-FR.rc | 61 +++ reactos/base/applications/clipbrd/precomp.h | 33 ++ .../base/applications/clipbrd/res/clipbrd.ico | Bin 0 -> 25214 bytes reactos/base/applications/clipbrd/resources.h | 35 ++ reactos/base/applications/clipbrd/winutils.c | 180 +++++++++ reactos/base/applications/clipbrd/winutils.h | 17 + 14 files changed, 1006 insertions(+) create mode 100644 reactos/base/applications/clipbrd/CMakeLists.txt create mode 100644 reactos/base/applications/clipbrd/clipbrd.c create mode 100644 reactos/base/applications/clipbrd/clipbrd.rc create mode 100644 reactos/base/applications/clipbrd/cliputils.c create mode 100644 reactos/base/applications/clipbrd/cliputils.h create mode 100644 reactos/base/applications/clipbrd/lang/de-DE.rc create mode 100644 reactos/base/applications/clipbrd/lang/en-US.rc create mode 100644 reactos/base/applications/clipbrd/lang/fr-FR.rc create mode 100644 reactos/base/applications/clipbrd/precomp.h create mode 100644 reactos/base/applications/clipbrd/res/clipbrd.ico create mode 100644 reactos/base/applications/clipbrd/resources.h create mode 100644 reactos/base/applications/clipbrd/winutils.c create mode 100644 reactos/base/applications/clipbrd/winutils.h diff --git a/reactos/base/applications/CMakeLists.txt b/reactos/base/applications/CMakeLists.txt index 4a1a8cd03e7..c0fc2ba7501 100644 --- a/reactos/base/applications/CMakeLists.txt +++ b/reactos/base/applications/CMakeLists.txt @@ -3,6 +3,7 @@ add_subdirectory(atactl) add_subdirectory(cacls) add_subdirectory(calc) add_subdirectory(charmap) +add_subdirectory(clipbrd) add_subdirectory(cmdutils) add_subdirectory(control) add_subdirectory(dxdiag) diff --git a/reactos/base/applications/clipbrd/CMakeLists.txt b/reactos/base/applications/clipbrd/CMakeLists.txt new file mode 100644 index 00000000000..7ad25aaf942 --- /dev/null +++ b/reactos/base/applications/clipbrd/CMakeLists.txt @@ -0,0 +1,12 @@ + +list(APPEND SOURCE + clipbrd.c + cliputils.c + winutils.c + precomp.h) + +add_executable(clipbrd ${SOURCE} clipbrd.rc) +add_pch(clipbrd precomp.h SOURCE) +set_module_type(clipbrd win32gui UNICODE) +add_importlibs(clipbrd hhctrl user32 gdi32 comctl32 comdlg32 advapi32 shell32 msvcrt kernel32) +add_cd_file(TARGET clipbrd DESTINATION reactos/system32 FOR all) diff --git a/reactos/base/applications/clipbrd/clipbrd.c b/reactos/base/applications/clipbrd/clipbrd.c new file mode 100644 index 00000000000..633cb87c93a --- /dev/null +++ b/reactos/base/applications/clipbrd/clipbrd.c @@ -0,0 +1,363 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Clipboard Viewer + * FILE: base/applications/clipbrd/clipbrd.c + * PURPOSE: Provides a view of the contents of the ReactOS clipboard. + * PROGRAMMERS: Ricardo Hanke + */ + +#include "precomp.h" + +static const WCHAR szClassName[] = L"ClipBookWClass"; + +CLIPBOARD_GLOBALS Globals; + +static void SetDisplayFormat(UINT uFormat) +{ + CheckMenuItem(Globals.hMenu, Globals.uCheckedItem, MF_BYCOMMAND | MF_UNCHECKED); + Globals.uCheckedItem = uFormat + CMD_AUTOMATIC; + CheckMenuItem(Globals.hMenu, Globals.uCheckedItem, MF_BYCOMMAND | MF_CHECKED); + + if (uFormat == 0) + { + Globals.uDisplayFormat = GetAutomaticClipboardFormat(); + } + else + { + Globals.uDisplayFormat = uFormat; + } + + InvalidateRect(Globals.hMainWnd, NULL, TRUE); + UpdateWindow(Globals.hMainWnd); +} + +static void InitMenuPopup(HMENU hMenu, LPARAM index) +{ + if (GetMenuItemID(hMenu, 0) == CMD_DELETE) + { + if (CountClipboardFormats() == 0) + { + EnableMenuItem(hMenu, CMD_DELETE, MF_GRAYED); + } + else + { + EnableMenuItem(hMenu, CMD_DELETE, MF_ENABLED); + } + } + + DrawMenuBar(Globals.hMainWnd); +} + +void UpdateDisplayMenu(void) +{ + UINT uFormat; + WCHAR szFormatName[MAX_STRING_LEN]; + HMENU hMenu; + + hMenu = GetSubMenu(Globals.hMenu, DISPLAY_MENU_POS); + + while (GetMenuItemCount(hMenu) > 1) + { + DeleteMenu(hMenu, 1, MF_BYPOSITION); + } + + if (CountClipboardFormats() == 0) + return; + + if (!OpenClipboard(NULL)) + return; + + AppendMenuW(hMenu, MF_SEPARATOR, 0, NULL); + + uFormat = EnumClipboardFormats(0); + while (uFormat) + { + RetrieveClipboardFormatName(Globals.hInstance, uFormat, szFormatName, ARRAYSIZE(szFormatName)); + + if (!IsClipboardFormatSupported(uFormat)) + { + AppendMenuW(hMenu, MF_STRING | MF_GRAYED, 0, szFormatName); + } + else + { + AppendMenuW(hMenu, MF_STRING, CMD_AUTOMATIC + uFormat, szFormatName); + } + + uFormat = EnumClipboardFormats(uFormat); + } + + CloseClipboard(); +} + +static int ClipboardCommandHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (LOWORD(wParam)) + { + case CMD_EXIT: + { + PostMessageW(Globals.hMainWnd, WM_CLOSE, 0, 0); + break; + } + + case CMD_DELETE: + { + if (MessageBoxRes(Globals.hMainWnd, Globals.hInstance, STRING_DELETE_MSG, STRING_DELETE_TITLE, MB_ICONWARNING | MB_YESNO) == IDYES) + { + DeleteClipboardContent(); + } + break; + } + + case CMD_AUTOMATIC: + { + SetDisplayFormat(0); + break; + } + + case CMD_HELP: + { + HtmlHelpW(Globals.hMainWnd, L"clipbrd.chm", 0, 0); + break; + } + + case CMD_ABOUT: + { + WCHAR szTitle[MAX_STRING_LEN]; + LoadStringW(Globals.hInstance, STRING_CLIPBOARD, szTitle, ARRAYSIZE(szTitle)); + ShellAboutW(Globals.hMainWnd, szTitle, 0, NULL); + break; + } + + default: + { + break; + } + } + return 0; +} + +static void ClipboardPaintHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + HDC hdc; + PAINTSTRUCT ps; + RECT rc; + + hdc = BeginPaint(hWnd, &ps); + GetClientRect(hWnd, &rc); + + switch (Globals.uDisplayFormat) + { + case CF_NONE: + { + break; + } + + case CF_UNICODETEXT: + { + DrawTextFromClipboard(hdc, &rc, DT_LEFT); + break; + } + + case CF_BITMAP: + { + BitBltFromClipboard(hdc, rc.left, rc.top, rc.right, rc.bottom, 0, 0, SRCCOPY); + break; + } + + case CF_DIB: + { + SetDIBitsToDeviceFromClipboard(CF_DIB, hdc, rc.left, rc.top, 0, 0, 0, DIB_RGB_COLORS); + break; + } + + 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); + break; + } + } + + EndPaint(hWnd, &ps); +} + +static LRESULT WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_PAINT: + { + ClipboardPaintHandler(hWnd, uMsg, wParam, lParam); + break; + } + + case WM_SIZE: + { + InvalidateRect(hWnd, NULL, TRUE); + UpdateWindow(hWnd); + break; + } + + case WM_CREATE: + { + Globals.hMenu = GetMenu(hWnd); + Globals.hWndNext = SetClipboardViewer(hWnd); + UpdateDisplayMenu(); + SetDisplayFormat(0); + break; + } + + case WM_CLOSE: + { + DestroyWindow(hWnd); + break; + } + + case WM_DESTROY: + { + ChangeClipboardChain(hWnd, Globals.hWndNext); + PostQuitMessage(0); + break; + } + + case WM_CHANGECBCHAIN: + { + if ((HWND)wParam == Globals.hWndNext) + { + Globals.hWndNext = (HWND)lParam; + } + else if (Globals.hWndNext != NULL) + { + SendMessageW(Globals.hWndNext, uMsg, wParam, lParam); + } + + break; + } + + case WM_DRAWCLIPBOARD: + { + UpdateDisplayMenu(); + SetDisplayFormat(0); + + SendMessageW(Globals.hWndNext, uMsg, wParam, lParam); + break; + } + + case WM_COMMAND: + { + if ((LOWORD(wParam) > CMD_AUTOMATIC)) + { + SetDisplayFormat(LOWORD(wParam) - CMD_AUTOMATIC); + } + else + { + ClipboardCommandHandler(hWnd, uMsg, wParam, lParam); + } + break; + } + + case WM_INITMENUPOPUP: + { + InitMenuPopup((HMENU)wParam, lParam); + break; + } + + default: + { + return DefWindowProc(hWnd, uMsg, wParam, lParam); + } + } + return 0; +} + +int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) +{ + MSG msg; + HACCEL hAccel; + HWND hPrevWindow; + WNDCLASSEXW wndclass; + WCHAR szBuffer[MAX_STRING_LEN]; + + hPrevWindow = FindWindowW(szClassName, NULL); + if (hPrevWindow) + { + BringWindowToFront(hPrevWindow); + return 0; + } + + ZeroMemory(&Globals, sizeof(Globals)); + Globals.hInstance = hInstance; + + ZeroMemory(&wndclass, sizeof(wndclass)); + wndclass.cbSize = sizeof(wndclass); + wndclass.lpfnWndProc = MainWndProc; + wndclass.hInstance = hInstance; + wndclass.hIcon = LoadIconW(hInstance, MAKEINTRESOURCEW(CLIP_ICON)); + wndclass.hCursor = LoadCursorW(0, IDC_ARROW); + wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + wndclass.lpszMenuName = MAKEINTRESOURCEW(MAIN_MENU); + wndclass.lpszClassName = szClassName; + + if (!RegisterClassExW(&wndclass)) + { + ShowLastWin32Error(NULL); + return 0; + } + + LoadStringW(hInstance, STRING_CLIPBOARD, szBuffer, ARRAYSIZE(szBuffer)); + Globals.hMainWnd = CreateWindowExW(WS_EX_CLIENTEDGE, + szClassName, + szBuffer, + WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + Globals.hInstance, + NULL); + if (!Globals.hMainWnd) + { + ShowLastWin32Error(NULL); + return 0; + } + + ShowWindow(Globals.hMainWnd, nCmdShow); + UpdateWindow(Globals.hMainWnd); + + hAccel = LoadAcceleratorsW(Globals.hInstance, MAKEINTRESOURCEW(ID_ACCEL)); + if (!hAccel) + { + ShowLastWin32Error(Globals.hMainWnd); + } + + while (GetMessageW(&msg, 0, 0, 0)) + { + if (!TranslateAcceleratorW(Globals.hMainWnd, hAccel, &msg)) + { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + } + + return (int)msg.wParam; +} diff --git a/reactos/base/applications/clipbrd/clipbrd.rc b/reactos/base/applications/clipbrd/clipbrd.rc new file mode 100644 index 00000000000..8c3c6cf52a0 --- /dev/null +++ b/reactos/base/applications/clipbrd/clipbrd.rc @@ -0,0 +1,26 @@ +#include +#include + +#include "resources.h" + +#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Clipboard Viewer" +#define REACTOS_STR_INTERNAL_NAME "clipbrd" +#define REACTOS_STR_ORIGINAL_FILENAME "clipbrd.exe" +#include + +CLIP_ICON ICON "res/clipbrd.ico" + +#include + +/* UTF-8 */ +#pragma code_page(65001) + +#ifdef LANGUAGE_DE_DE + #include "lang/de-DE.rc" +#endif +#ifdef LANGUAGE_EN_US + #include "lang/en-US.rc" +#endif +#ifdef LANGUAGE_FR_FR + #include "lang/fr-FR.rc" +#endif diff --git a/reactos/base/applications/clipbrd/cliputils.c b/reactos/base/applications/clipbrd/cliputils.c new file mode 100644 index 00000000000..a6a20a15b16 --- /dev/null +++ b/reactos/base/applications/clipbrd/cliputils.c @@ -0,0 +1,143 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Clipboard Viewer + * FILE: base/applications/clipbrd/cliputils.c + * PURPOSE: Clipboard helper functions. + * PROGRAMMERS: Ricardo Hanke + */ + +#include "precomp.h" + +int GetPredefinedClipboardFormatName(HINSTANCE hInstance, UINT uFormat, LPWSTR lpszFormat, UINT cch) +{ + switch (uFormat) + { + case CF_TEXT: + { + return LoadStringW(hInstance, STRING_CF_TEXT, lpszFormat, cch); + } + + case CF_BITMAP: + { + return LoadStringW(hInstance, STRING_CF_BITMAP, lpszFormat, cch); + } + + case CF_OEMTEXT: + { + return LoadStringW(hInstance, STRING_CF_OEMTEXT, lpszFormat, cch); + } + + case CF_UNICODETEXT: + { + return LoadStringW(hInstance, STRING_CF_UNICODETEXT, lpszFormat, cch); + } + + case CF_DIB: + { + return LoadStringW(hInstance, STRING_CF_DIB, lpszFormat, cch); + } + + case CF_LOCALE: + { + return LoadStringW(hInstance, STRING_CF_LOCALE, lpszFormat, cch); + } + + case CF_ENHMETAFILE: + { + return LoadStringW(hInstance, STRING_CF_ENHMETAFILE, lpszFormat, cch); + } + + case CF_METAFILEPICT: + { + return LoadStringW(hInstance, STRING_CF_METAFILEPICT, lpszFormat, cch); + } + + case CF_PALETTE: + { + return LoadStringW(hInstance, STRING_CF_PALETTE, lpszFormat, cch); + } + + case CF_DIBV5: + { + return LoadStringW(hInstance, STRING_CF_DIBV5, lpszFormat, cch); + } + + case CF_SYLK: + { + return LoadStringW(hInstance, STRING_CF_SYLK, lpszFormat, cch); + } + + case CF_DIF: + { + return LoadStringW(hInstance, STRING_CF_DIF, lpszFormat, cch); + } + + case CF_HDROP: + { + return LoadStringW(hInstance, STRING_CF_HDROP, lpszFormat, cch); + } + + default: + { + return 0; + } + } +} + +void RetrieveClipboardFormatName(HINSTANCE hInstance, UINT uFormat, LPWSTR lpszFormat, UINT cch) +{ + if (!GetPredefinedClipboardFormatName(hInstance, uFormat, lpszFormat, cch)) + { + if (!GetClipboardFormatName(uFormat, lpszFormat, cch)) + { + LoadStringW(hInstance, STRING_CF_UNKNOWN, lpszFormat, cch); + } + } +} + +void DeleteClipboardContent(void) +{ + if (!OpenClipboard(NULL)) + { + ShowLastWin32Error(Globals.hMainWnd); + return; + } + + if (!EmptyClipboard()) + { + ShowLastWin32Error(Globals.hMainWnd); + } + + if (!CloseClipboard()) + { + ShowLastWin32Error(Globals.hMainWnd); + } +} + +UINT GetAutomaticClipboardFormat(void) +{ + UINT uFormatList[] = {CF_UNICODETEXT, CF_ENHMETAFILE, CF_METAFILEPICT, CF_DIBV5, CF_DIB, CF_BITMAP}; + + return GetPriorityClipboardFormat(uFormatList, 6); +} + +BOOL IsClipboardFormatSupported(UINT uFormat) +{ + switch (uFormat) + { + case CF_UNICODETEXT: + case CF_BITMAP: + case CF_ENHMETAFILE: + case CF_METAFILEPICT: + case CF_DIB: + case CF_DIBV5: + { + return TRUE; + } + + default: + { + return FALSE; + } + } +} diff --git a/reactos/base/applications/clipbrd/cliputils.h b/reactos/base/applications/clipbrd/cliputils.h new file mode 100644 index 00000000000..904be569dae --- /dev/null +++ b/reactos/base/applications/clipbrd/cliputils.h @@ -0,0 +1,13 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Clipboard Viewer + * FILE: base/applications/clipbrd/cliputils.h + * PURPOSE: Clipboard helper functions. + * PROGRAMMERS: Ricardo Hanke + */ + +int GetPredefinedClipboardFormatName(HINSTANCE hInstance, UINT uFormat, LPWSTR lpszFormat, UINT cch); +void RetrieveClipboardFormatName(HINSTANCE hInstance, UINT uFormat, LPWSTR lpszFormat, UINT cch); +void DeleteClipboardContent(void); +UINT GetAutomaticClipboardFormat(void); +BOOL IsClipboardFormatSupported(UINT uFormat); diff --git a/reactos/base/applications/clipbrd/lang/de-DE.rc b/reactos/base/applications/clipbrd/lang/de-DE.rc new file mode 100644 index 00000000000..96932803cb0 --- /dev/null +++ b/reactos/base/applications/clipbrd/lang/de-DE.rc @@ -0,0 +1,61 @@ +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +ID_ACCEL ACCELERATORS +BEGIN + VK_DELETE, CMD_DELETE, VIRTKEY +END + +MAIN_MENU MENU +BEGIN + POPUP "&Datei" + BEGIN + MENUITEM "Ö&ffnen...", CMD_OPEN, GRAYED + MENUITEM "Speichern &unter...", CMD_SAVE_AS, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Beenden", CMD_EXIT + END + POPUP "&Bearbeiten" + BEGIN + MENUITEM "&Löschen\tEntf", CMD_DELETE + END + POPUP "&Anzeige" + BEGIN + MENUITEM "&Automatisch", CMD_AUTOMATIC + END + POPUP "&Hilfe" + BEGIN + MENUITEM "&Hilfethemen", CMD_HELP + MENUITEM SEPARATOR + MENUITEM "Inf&o", CMD_ABOUT + END +END + +STRINGTABLE +BEGIN + STRING_CLIPBOARD "Zwischenablage" + STRING_DELETE_MSG "Soll der Inhalt der Zwischenablage gelöscht werden?" + STRING_DELETE_TITLE "Zwischenablage löschen" +END + +STRINGTABLE +BEGIN + STRING_CF_UNKNOWN "Unbekanntes Format" + STRING_CF_TEXT "Text" + STRING_CF_BITMAP "Bitmap" + STRING_CF_OEMTEXT "OEM-Text" + STRING_CF_UNICODETEXT "Unicodetext" + STRING_CF_DIB "DIB-Bitmap" + STRING_CF_LOCALE "Gebietsschema" + STRING_CF_ENHMETAFILE "Erweiterte Metadatei" + STRING_CF_METAFILEPICT "Metadatei" + STRING_CF_PALETTE "Farbpalette" + STRING_CF_DIBV5 "DIB-Bitmap (Version 5)" + STRING_CF_SYLK "Symbolic Link Format" + STRING_CF_DIF "Data Interchange Format" + STRING_CF_HDROP "Drop-Daten" +END + +STRINGTABLE +BEGIN + ERROR_UNSUPPORTED_FORMAT "Die Daten in der Zwischenablage liegen in einem Format vor, welches nicht angezeigt werden kann." +END diff --git a/reactos/base/applications/clipbrd/lang/en-US.rc b/reactos/base/applications/clipbrd/lang/en-US.rc new file mode 100644 index 00000000000..02096416f69 --- /dev/null +++ b/reactos/base/applications/clipbrd/lang/en-US.rc @@ -0,0 +1,61 @@ +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +ID_ACCEL ACCELERATORS +BEGIN + VK_DELETE, CMD_DELETE, VIRTKEY +END + +MAIN_MENU MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&Open...", CMD_OPEN, GRAYED + MENUITEM "Save &as...", CMD_SAVE_AS, GRAYED + MENUITEM SEPARATOR + MENUITEM "E&xit", CMD_EXIT + END + POPUP "&Edit" + BEGIN + MENUITEM "&Delete\tDel", CMD_DELETE + END + POPUP "&Display" + BEGIN + MENUITEM "&Automatic", CMD_AUTOMATIC + END + POPUP "&Help" + BEGIN + MENUITEM "&Help Topics", CMD_HELP + MENUITEM SEPARATOR + MENUITEM "&About", CMD_ABOUT + END +END + +STRINGTABLE +BEGIN + STRING_CLIPBOARD "Clipboard" + STRING_DELETE_MSG "Clear contents of the Clipboard?" + STRING_DELETE_TITLE "Clear Clipboard" +END + +STRINGTABLE +BEGIN + STRING_CF_UNKNOWN "Unknown Format" + STRING_CF_TEXT "Text" + STRING_CF_BITMAP "Bitmap" + STRING_CF_OEMTEXT "OEM Text" + STRING_CF_UNICODETEXT "Unicode Text" + STRING_CF_DIB "DIB Bitmap" + STRING_CF_LOCALE "Locale Data" + STRING_CF_ENHMETAFILE "Enhanced Metafile" + STRING_CF_METAFILEPICT "Metafile" + STRING_CF_PALETTE "Color Palette" + STRING_CF_DIBV5 "DIB Bitmap (Version 5)" + STRING_CF_SYLK "Symbolic Link Format" + STRING_CF_DIF "Data Interchange Format" + STRING_CF_HDROP "Drop Data" +END + +STRINGTABLE +BEGIN + ERROR_UNSUPPORTED_FORMAT "The clipboard contains data in a format, that cannot be displayed." +END diff --git a/reactos/base/applications/clipbrd/lang/fr-FR.rc b/reactos/base/applications/clipbrd/lang/fr-FR.rc new file mode 100644 index 00000000000..87ec456fb45 --- /dev/null +++ b/reactos/base/applications/clipbrd/lang/fr-FR.rc @@ -0,0 +1,61 @@ +LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL + +ID_ACCEL ACCELERATORS +BEGIN + VK_DELETE, CMD_DELETE, VIRTKEY +END + +MAIN_MENU MENU +BEGIN + POPUP "&Fichier" + BEGIN + MENUITEM "&Ouvrir...", CMD_OPEN, GRAYED + MENUITEM "&Enregistrer sous...", CMD_SAVE_AS, GRAYED + MENUITEM SEPARATOR + MENUITEM "&Quitter", CMD_EXIT + END + POPUP "&Edition" + BEGIN + MENUITEM "&Supprimer\tSuppr", CMD_DELETE + END + POPUP "&Affichage" + BEGIN + MENUITEM "&Automatique", CMD_AUTOMATIC + END + POPUP "&Aide" + BEGIN + MENUITEM "&Rubriques d'aide", CMD_HELP + MENUITEM SEPARATOR + MENUITEM "&À propos...", CMD_ABOUT + END +END + +STRINGTABLE +BEGIN + STRING_CLIPBOARD "Presse-papiers" + STRING_DELETE_MSG "Voulez-vous effacer le contenu du Presse-papiers ?" + STRING_DELETE_TITLE "Effacer le Presse-papiers" +END + +STRINGTABLE +BEGIN + STRING_CF_UNKNOWN "Format inconnu" + STRING_CF_TEXT "Texte" + STRING_CF_BITMAP "Bitmap" + STRING_CF_OEMTEXT "Texte OEM" + STRING_CF_UNICODETEXT "Texte Unicode" + STRING_CF_DIB "DIB Bitmap" + STRING_CF_LOCALE "Locale Data" + STRING_CF_ENHMETAFILE "Enhanced Metafile" + STRING_CF_METAFILEPICT "Metafile" + STRING_CF_PALETTE "Color Palette" + STRING_CF_DIBV5 "DIB Bitmap (Version 5)" + STRING_CF_SYLK "Symbolic Link Format" + STRING_CF_DIF "Data Interchange Format" + STRING_CF_HDROP "Drop Data" +END + +STRINGTABLE +BEGIN + ERROR_UNSUPPORTED_FORMAT "Le Presse-Papiers contient des données dans un format qui ne peut être affiché." +END diff --git a/reactos/base/applications/clipbrd/precomp.h b/reactos/base/applications/clipbrd/precomp.h new file mode 100644 index 00000000000..9c8e1aec6aa --- /dev/null +++ b/reactos/base/applications/clipbrd/precomp.h @@ -0,0 +1,33 @@ +#ifndef _CLIPBRD_PCH_ +#define _CLIPBRD_PCH_ + +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "resources.h" +#include "cliputils.h" +#include "winutils.h" + +#define MAX_STRING_LEN 255 +#define DISPLAY_MENU_POS 2 +#define CF_NONE 0 + +typedef struct _CLIPBOARD_GLOBALS +{ + HINSTANCE hInstance; + HWND hMainWnd; + HWND hWndNext; + HMENU hMenu; + UINT uDisplayFormat; + UINT uCheckedItem; +} CLIPBOARD_GLOBALS; + +extern CLIPBOARD_GLOBALS Globals; + +#endif /* _CLIPBRD_PCH_ */ diff --git a/reactos/base/applications/clipbrd/res/clipbrd.ico b/reactos/base/applications/clipbrd/res/clipbrd.ico new file mode 100644 index 0000000000000000000000000000000000000000..6ee48f5665ab929f97e95585c94a1e2999455043 GIT binary patch literal 25214 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 < 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); + CloseClipboard(); +} + +void PlayMetaFileFromClipboard(HDC hdc, const RECT *lpRect) +{ + LPMETAFILEPICT mp; + HGLOBAL hGlobal; + + if (!OpenClipboard(NULL)) + return; + + hGlobal = GetClipboardData(CF_METAFILEPICT); + if (!hGlobal) + return; + + mp = (LPMETAFILEPICT)GlobalLock(hGlobal); + if (!mp) + return; + + SetMapMode(hdc, mp->mm); + SetViewportExtEx(hdc, lpRect->right, lpRect->bottom, NULL); + SetViewportOrgEx(hdc, lpRect->left, lpRect->top, NULL); + PlayMetaFile(hdc, mp->hMF); + GlobalUnlock(hGlobal); + CloseClipboard(); +} + +void PlayEnhMetaFileFromClipboard(HDC hdc, const RECT *lpRect) +{ + HENHMETAFILE hEmf; + + if (!OpenClipboard(NULL)) + return; + + hEmf = GetClipboardData(CF_ENHMETAFILE); + PlayEnhMetaFile(hdc, hEmf, lpRect); + CloseClipboard(); +} diff --git a/reactos/base/applications/clipbrd/winutils.h b/reactos/base/applications/clipbrd/winutils.h new file mode 100644 index 00000000000..1dde2e015d3 --- /dev/null +++ b/reactos/base/applications/clipbrd/winutils.h @@ -0,0 +1,17 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Clipboard Viewer + * FILE: base/applications/clipbrd/winutils.c + * PURPOSE: Miscellaneous helper functions. + * PROGRAMMERS: Ricardo Hanke + */ + +void ShowLastWin32Error(HWND hwndParent); +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); -- 2.17.1