From: Hermès Bélusca-Maïto Date: Sat, 14 Nov 2015 16:45:41 +0000 (+0000) Subject: [CLIPBRD] X-Git-Tag: ReactOS-0.4.0~170 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=1ec8189e8737fb688810de89c49cb472cc06a59f [CLIPBRD] - Change SetDIBitsToDeviceFromClipboard to correctly use the requested format instead of always using CF_DIBV5 - Enable/Disable the menu point "Save as..." dynamically - Remove unneeded import libraries - Add WS_EX_ACCEPTFILES window style and handle WM_DROPFILES - Add some defines and structures for handling clipboard files (work in progress) - Add Open and Save dialogs Patch by Ricardo Hanke. CORE-10520 svn path=/trunk/; revision=69890 --- diff --git a/reactos/base/applications/clipbrd/CMakeLists.txt b/reactos/base/applications/clipbrd/CMakeLists.txt index 7ad25aaf942..2816174063b 100644 --- a/reactos/base/applications/clipbrd/CMakeLists.txt +++ b/reactos/base/applications/clipbrd/CMakeLists.txt @@ -3,10 +3,11 @@ list(APPEND SOURCE clipbrd.c cliputils.c winutils.c + fileutils.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_importlibs(clipbrd hhctrl user32 gdi32 comdlg32 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 index 633cb87c93a..e86ce26aae2 100644 --- a/reactos/base/applications/clipbrd/clipbrd.c +++ b/reactos/base/applications/clipbrd/clipbrd.c @@ -12,6 +12,103 @@ static const WCHAR szClassName[] = L"ClipBookWClass"; CLIPBOARD_GLOBALS Globals; +static void SaveClipboardToFile(void) +{ + OPENFILENAMEW sfn; + WCHAR szFileName[MAX_PATH]; + WCHAR szFilterMask[MAX_STRING_LEN + 10]; + LPWSTR c; + + ZeroMemory(&szFilterMask, sizeof(szFilterMask)); + c = szFilterMask + LoadStringW(Globals.hInstance, STRING_FORMAT_NT, szFilterMask, MAX_STRING_LEN) + 1; + wcscpy(c, L"*.clp"); + + ZeroMemory(&szFileName, sizeof(szFileName)); + ZeroMemory(&sfn, sizeof(sfn)); + sfn.lStructSize = sizeof(sfn); + sfn.hwndOwner = Globals.hMainWnd; + sfn.hInstance = Globals.hInstance; + sfn.lpstrFilter = szFilterMask; + sfn.lpstrFile = szFileName; + sfn.nMaxFile = ARRAYSIZE(szFileName); + sfn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; + sfn.lpstrDefExt = L"clp"; + + if (!GetSaveFileNameW(&sfn)) + return; + + if (!OpenClipboard(NULL)) + { + ShowLastWin32Error(Globals.hMainWnd); + return; + } + + WriteClipboardFile(szFileName); + + CloseClipboard(); +} + +static void LoadClipboardFromFile(void) +{ + OPENFILENAMEW ofn; + WCHAR szFileName[MAX_PATH]; + WCHAR szFilterMask[MAX_STRING_LEN + 10]; + LPWSTR c; + + ZeroMemory(&szFilterMask, sizeof(szFilterMask)); + c = szFilterMask + LoadStringW(Globals.hInstance, STRING_FORMAT_GEN, szFilterMask, MAX_STRING_LEN) + 1; + wcscpy(c, L"*.clp"); + + ZeroMemory(&szFileName, sizeof(szFileName)); + ZeroMemory(&ofn, sizeof(ofn)); + ofn.lStructSize = sizeof(ofn); + ofn.hwndOwner = Globals.hMainWnd; + ofn.hInstance = Globals.hInstance; + ofn.lpstrFilter = szFilterMask; + ofn.lpstrFile = szFileName; + ofn.nMaxFile = ARRAYSIZE(szFileName); + ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_FILEMUSTEXIST; + + if (!GetOpenFileNameW(&ofn)) + return; + + if (!OpenClipboard(NULL)) + { + ShowLastWin32Error(Globals.hMainWnd); + return; + } + + if (MessageBoxRes(Globals.hMainWnd, Globals.hInstance, STRING_DELETE_MSG, STRING_DELETE_TITLE, MB_ICONWARNING | MB_YESNO) == IDYES) + { + EmptyClipboard(); + ReadClipboardFile(szFileName); + } + + CloseClipboard(); +} + +static void LoadClipboardFromDrop(HDROP hDrop) +{ + WCHAR szFileName[MAX_PATH]; + + DragQueryFileW(hDrop, 0, szFileName, ARRAYSIZE(szFileName)); + DragFinish(hDrop); + + if (!OpenClipboard(NULL)) + { + ShowLastWin32Error(Globals.hMainWnd); + return; + } + + if (MessageBoxRes(Globals.hMainWnd, Globals.hInstance, STRING_DELETE_MSG, STRING_DELETE_TITLE, MB_ICONWARNING | MB_YESNO) == IDYES) + { + EmptyClipboard(); + ReadClipboardFile(szFileName); + } + + CloseClipboard(); +} + static void SetDisplayFormat(UINT uFormat) { CheckMenuItem(Globals.hMenu, Globals.uCheckedItem, MF_BYCOMMAND | MF_UNCHECKED); @@ -33,15 +130,17 @@ static void SetDisplayFormat(UINT uFormat) static void InitMenuPopup(HMENU hMenu, LPARAM index) { - if (GetMenuItemID(hMenu, 0) == CMD_DELETE) + if ((GetMenuItemID(hMenu, 0) == CMD_DELETE) || (GetMenuItemID(hMenu, 1) == CMD_SAVE_AS)) { if (CountClipboardFormats() == 0) { EnableMenuItem(hMenu, CMD_DELETE, MF_GRAYED); + EnableMenuItem(hMenu, CMD_SAVE_AS, MF_GRAYED); } else { EnableMenuItem(hMenu, CMD_DELETE, MF_ENABLED); + EnableMenuItem(hMenu, CMD_SAVE_AS, MF_ENABLED); } } @@ -51,7 +150,7 @@ static void InitMenuPopup(HMENU hMenu, LPARAM index) void UpdateDisplayMenu(void) { UINT uFormat; - WCHAR szFormatName[MAX_STRING_LEN]; + WCHAR szFormatName[MAX_FMT_NAME_LEN + 1]; HMENU hMenu; hMenu = GetSubMenu(Globals.hMenu, DISPLAY_MENU_POS); @@ -93,6 +192,18 @@ static int ClipboardCommandHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l { switch (LOWORD(wParam)) { + case CMD_OPEN: + { + LoadClipboardFromFile(); + break; + } + + case CMD_SAVE_AS: + { + SaveClipboardToFile(); + break; + } + case CMD_EXIT: { PostMessageW(Globals.hMainWnd, WM_CLOSE, 0, 0); @@ -280,6 +391,12 @@ static LRESULT WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP break; } + case WM_DROPFILES: + { + LoadClipboardFromDrop((HDROP)wParam); + break; + } + default: { return DefWindowProc(hWnd, uMsg, wParam, lParam); @@ -323,7 +440,7 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi } LoadStringW(hInstance, STRING_CLIPBOARD, szBuffer, ARRAYSIZE(szBuffer)); - Globals.hMainWnd = CreateWindowExW(WS_EX_CLIENTEDGE, + Globals.hMainWnd = CreateWindowExW(WS_EX_CLIENTEDGE | WS_EX_ACCEPTFILES, szClassName, szBuffer, WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL, diff --git a/reactos/base/applications/clipbrd/fileutils.c b/reactos/base/applications/clipbrd/fileutils.c new file mode 100644 index 00000000000..0ac45868869 --- /dev/null +++ b/reactos/base/applications/clipbrd/fileutils.c @@ -0,0 +1,21 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Clipboard Viewer + * FILE: base/applications/clipbrd/fileutils.c + * PURPOSE: Clipboard file format helper functions. + * PROGRAMMERS: Ricardo Hanke + */ + +#include "precomp.h" + +void ReadClipboardFile(LPCWSTR lpFileName) +{ + MessageBoxW(Globals.hMainWnd, L"This function is currently not implemented.", L"Clipboard", MB_OK | MB_ICONINFORMATION); + return; +} + +void WriteClipboardFile(LPCWSTR lpFileName) +{ + MessageBoxW(Globals.hMainWnd, L"This function is currently not implemented.", L"Clipboard", MB_OK | MB_ICONINFORMATION); + return; +} diff --git a/reactos/base/applications/clipbrd/fileutils.h b/reactos/base/applications/clipbrd/fileutils.h new file mode 100644 index 00000000000..5acd98b091c --- /dev/null +++ b/reactos/base/applications/clipbrd/fileutils.h @@ -0,0 +1,29 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Clipboard Viewer + * FILE: base/applications/clipbrd/fileutils.c + * PURPOSE: Clipboard file format helper functions. + * PROGRAMMERS: Ricardo Hanke + */ + +#define CLIPBOARD_FORMAT_31 0xC350 +#define CLIPBOARD_FORMAT_NT 0xC351 +#define CLIPBOARD_FORMAT_BK 0xC352 +#define MAX_FMT_NAME_LEN 79 + +typedef struct _CLIPBOARDFILEHEADER +{ + WORD wFileIdentifier; + WORD wFormatCount; +} CLIPBOARDFILEHEADER; + +typedef struct _CLIPBOARDFORMATHEADER +{ + DWORD dwFormatID; + DWORD dwLenData; + DWORD dwOffData; + WCHAR szName[MAX_FMT_NAME_LEN]; +} CLIPBOARDFORMATHEADER; + +void ReadClipboardFile(LPCWSTR lpFileName); +void WriteClipboardFile(LPCWSTR lpFileName); diff --git a/reactos/base/applications/clipbrd/lang/de-DE.rc b/reactos/base/applications/clipbrd/lang/de-DE.rc index 96932803cb0..b6a81608364 100644 --- a/reactos/base/applications/clipbrd/lang/de-DE.rc +++ b/reactos/base/applications/clipbrd/lang/de-DE.rc @@ -9,8 +9,8 @@ MAIN_MENU MENU BEGIN POPUP "&Datei" BEGIN - MENUITEM "Ö&ffnen...", CMD_OPEN, GRAYED - MENUITEM "Speichern &unter...", CMD_SAVE_AS, GRAYED + MENUITEM "Ö&ffnen...", CMD_OPEN + MENUITEM "Speichern &unter...", CMD_SAVE_AS MENUITEM SEPARATOR MENUITEM "&Beenden", CMD_EXIT END @@ -35,6 +35,8 @@ BEGIN STRING_CLIPBOARD "Zwischenablage" STRING_DELETE_MSG "Soll der Inhalt der Zwischenablage gelöscht werden?" STRING_DELETE_TITLE "Zwischenablage löschen" + STRING_FORMAT_NT "Zwischenablagedateien für ReactOS (*.clp)" + STRING_FORMAT_GEN "Zwischenablagedateien (*.clp)" END STRINGTABLE diff --git a/reactos/base/applications/clipbrd/lang/en-US.rc b/reactos/base/applications/clipbrd/lang/en-US.rc index 02096416f69..f648c066541 100644 --- a/reactos/base/applications/clipbrd/lang/en-US.rc +++ b/reactos/base/applications/clipbrd/lang/en-US.rc @@ -9,8 +9,8 @@ MAIN_MENU MENU BEGIN POPUP "&File" BEGIN - MENUITEM "&Open...", CMD_OPEN, GRAYED - MENUITEM "Save &as...", CMD_SAVE_AS, GRAYED + MENUITEM "&Open...", CMD_OPEN + MENUITEM "Save &as...", CMD_SAVE_AS MENUITEM SEPARATOR MENUITEM "E&xit", CMD_EXIT END @@ -35,6 +35,8 @@ BEGIN STRING_CLIPBOARD "Clipboard" STRING_DELETE_MSG "Clear contents of the Clipboard?" STRING_DELETE_TITLE "Clear Clipboard" + STRING_FORMAT_NT "Clipboard files for ReactOS (*.clp)" + STRING_FORMAT_GEN "Clipboard files (*.clp)" END STRINGTABLE @@ -57,5 +59,5 @@ END STRINGTABLE BEGIN - ERROR_UNSUPPORTED_FORMAT "The clipboard contains data in a format, that cannot be displayed." + 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 index 87ec456fb45..45513fc7b2c 100644 --- a/reactos/base/applications/clipbrd/lang/fr-FR.rc +++ b/reactos/base/applications/clipbrd/lang/fr-FR.rc @@ -9,8 +9,8 @@ MAIN_MENU MENU BEGIN POPUP "&Fichier" BEGIN - MENUITEM "&Ouvrir...", CMD_OPEN, GRAYED - MENUITEM "&Enregistrer sous...", CMD_SAVE_AS, GRAYED + MENUITEM "&Ouvrir...", CMD_OPEN + MENUITEM "&Enregistrer sous...", CMD_SAVE_AS MENUITEM SEPARATOR MENUITEM "&Quitter", CMD_EXIT END @@ -35,6 +35,8 @@ BEGIN STRING_CLIPBOARD "Presse-papiers" STRING_DELETE_MSG "Voulez-vous effacer le contenu du Presse-papiers ?" STRING_DELETE_TITLE "Effacer le Presse-papiers" + STRING_FORMAT_NT "Fichiers du Presse-papiers ReactOS (*.clp)" + STRING_FORMAT_GEN "Fichiers du Presse-papiers (*.clp)" END STRINGTABLE @@ -57,5 +59,5 @@ END STRINGTABLE BEGIN - ERROR_UNSUPPORTED_FORMAT "Le Presse-Papiers contient des données dans un format qui ne peut être affiché." + 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 index f36a67ea324..8b7103bb36b 100644 --- a/reactos/base/applications/clipbrd/precomp.h +++ b/reactos/base/applications/clipbrd/precomp.h @@ -9,9 +9,11 @@ #include #include #include +#include #include "resources.h" #include "cliputils.h" +#include "fileutils.h" #include "winutils.h" #define MAX_STRING_LEN 255 diff --git a/reactos/base/applications/clipbrd/resources.h b/reactos/base/applications/clipbrd/resources.h index ca073f3d497..49f4a52df8d 100644 --- a/reactos/base/applications/clipbrd/resources.h +++ b/reactos/base/applications/clipbrd/resources.h @@ -16,6 +16,8 @@ #define STRING_CLIPBOARD 100 #define STRING_DELETE_MSG 101 #define STRING_DELETE_TITLE 102 +#define STRING_FORMAT_NT 103 +#define STRING_FORMAT_GEN 104 #define STRING_CF_UNKNOWN 200 #define STRING_CF_TEXT 201 diff --git a/reactos/base/applications/clipbrd/winutils.c b/reactos/base/applications/clipbrd/winutils.c index 9afdc1bee9e..8d20cc83697 100644 --- a/reactos/base/applications/clipbrd/winutils.c +++ b/reactos/base/applications/clipbrd/winutils.c @@ -118,7 +118,7 @@ void SetDIBitsToDeviceFromClipboard(UINT uFormat, HDC hdc, int XDest, int YDest, if (!OpenClipboard(NULL)) return; - hGlobal = GetClipboardData(CF_DIBV5); + hGlobal = GetClipboardData(uFormat); if (!hGlobal) return;