2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Clipboard Viewer
4 * FILE: base/applications/clipbrd/clipbrd.c
5 * PURPOSE: Provides a view of the contents of the ReactOS clipboard.
6 * PROGRAMMERS: Ricardo Hanke
11 static const WCHAR szClassName
[] = L
"ClipBookWClass";
13 CLIPBOARD_GLOBALS Globals
;
15 static void SetDisplayFormat(UINT uFormat
)
17 CheckMenuItem(Globals
.hMenu
, Globals
.uCheckedItem
, MF_BYCOMMAND
| MF_UNCHECKED
);
18 Globals
.uCheckedItem
= uFormat
+ CMD_AUTOMATIC
;
19 CheckMenuItem(Globals
.hMenu
, Globals
.uCheckedItem
, MF_BYCOMMAND
| MF_CHECKED
);
23 Globals
.uDisplayFormat
= GetAutomaticClipboardFormat();
27 Globals
.uDisplayFormat
= uFormat
;
30 InvalidateRect(Globals
.hMainWnd
, NULL
, TRUE
);
31 UpdateWindow(Globals
.hMainWnd
);
34 static void InitMenuPopup(HMENU hMenu
, LPARAM index
)
36 if (GetMenuItemID(hMenu
, 0) == CMD_DELETE
)
38 if (CountClipboardFormats() == 0)
40 EnableMenuItem(hMenu
, CMD_DELETE
, MF_GRAYED
);
44 EnableMenuItem(hMenu
, CMD_DELETE
, MF_ENABLED
);
48 DrawMenuBar(Globals
.hMainWnd
);
51 void UpdateDisplayMenu(void)
54 WCHAR szFormatName
[MAX_STRING_LEN
];
57 hMenu
= GetSubMenu(Globals
.hMenu
, DISPLAY_MENU_POS
);
59 while (GetMenuItemCount(hMenu
) > 1)
61 DeleteMenu(hMenu
, 1, MF_BYPOSITION
);
64 if (CountClipboardFormats() == 0)
67 if (!OpenClipboard(NULL
))
70 AppendMenuW(hMenu
, MF_SEPARATOR
, 0, NULL
);
72 uFormat
= EnumClipboardFormats(0);
75 RetrieveClipboardFormatName(Globals
.hInstance
, uFormat
, szFormatName
, ARRAYSIZE(szFormatName
));
77 if (!IsClipboardFormatSupported(uFormat
))
79 AppendMenuW(hMenu
, MF_STRING
| MF_GRAYED
, 0, szFormatName
);
83 AppendMenuW(hMenu
, MF_STRING
, CMD_AUTOMATIC
+ uFormat
, szFormatName
);
86 uFormat
= EnumClipboardFormats(uFormat
);
92 static int ClipboardCommandHandler(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
94 switch (LOWORD(wParam
))
98 PostMessageW(Globals
.hMainWnd
, WM_CLOSE
, 0, 0);
104 if (MessageBoxRes(Globals
.hMainWnd
, Globals
.hInstance
, STRING_DELETE_MSG
, STRING_DELETE_TITLE
, MB_ICONWARNING
| MB_YESNO
) == IDYES
)
106 DeleteClipboardContent();
119 HtmlHelpW(Globals
.hMainWnd
, L
"clipbrd.chm", 0, 0);
125 WCHAR szTitle
[MAX_STRING_LEN
];
126 LoadStringW(Globals
.hInstance
, STRING_CLIPBOARD
, szTitle
, ARRAYSIZE(szTitle
));
127 ShellAboutW(Globals
.hMainWnd
, szTitle
, 0, NULL
);
139 static void ClipboardPaintHandler(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
145 hdc
= BeginPaint(hWnd
, &ps
);
146 GetClientRect(hWnd
, &rc
);
148 switch (Globals
.uDisplayFormat
)
157 DrawTextFromClipboard(hdc
, &rc
, DT_LEFT
);
163 BitBltFromClipboard(hdc
, rc
.left
, rc
.top
, rc
.right
, rc
.bottom
, 0, 0, SRCCOPY
);
169 SetDIBitsToDeviceFromClipboard(CF_DIB
, hdc
, rc
.left
, rc
.top
, 0, 0, 0, DIB_RGB_COLORS
);
175 SetDIBitsToDeviceFromClipboard(CF_DIBV5
, hdc
, rc
.left
, rc
.top
, 0, 0, 0, DIB_RGB_COLORS
);
181 PlayEnhMetaFileFromClipboard(hdc
, &rc
);
185 case CF_METAFILEPICT
:
187 PlayMetaFileFromClipboard(hdc
, &rc
);
194 DrawTextFromResource(Globals
.hInstance
, ERROR_UNSUPPORTED_FORMAT
, hdc
, &rc
, DT_CENTER
| DT_WORDBREAK
);
202 static LRESULT WINAPI
MainWndProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
208 ClipboardPaintHandler(hWnd
, uMsg
, wParam
, lParam
);
214 InvalidateRect(hWnd
, NULL
, TRUE
);
221 Globals
.hMenu
= GetMenu(hWnd
);
222 Globals
.hWndNext
= SetClipboardViewer(hWnd
);
236 ChangeClipboardChain(hWnd
, Globals
.hWndNext
);
241 case WM_CHANGECBCHAIN
:
243 if ((HWND
)wParam
== Globals
.hWndNext
)
245 Globals
.hWndNext
= (HWND
)lParam
;
247 else if (Globals
.hWndNext
!= NULL
)
249 SendMessageW(Globals
.hWndNext
, uMsg
, wParam
, lParam
);
255 case WM_DRAWCLIPBOARD
:
260 SendMessageW(Globals
.hWndNext
, uMsg
, wParam
, lParam
);
266 if ((LOWORD(wParam
) > CMD_AUTOMATIC
))
268 SetDisplayFormat(LOWORD(wParam
) - CMD_AUTOMATIC
);
272 ClipboardCommandHandler(hWnd
, uMsg
, wParam
, lParam
);
277 case WM_INITMENUPOPUP
:
279 InitMenuPopup((HMENU
)wParam
, lParam
);
285 return DefWindowProc(hWnd
, uMsg
, wParam
, lParam
);
291 int WINAPI
wWinMain(HINSTANCE hInstance
, HINSTANCE hPrevInstance
, LPWSTR lpCmdLine
, int nCmdShow
)
296 WNDCLASSEXW wndclass
;
297 WCHAR szBuffer
[MAX_STRING_LEN
];
299 hPrevWindow
= FindWindowW(szClassName
, NULL
);
302 BringWindowToFront(hPrevWindow
);
306 ZeroMemory(&Globals
, sizeof(Globals
));
307 Globals
.hInstance
= hInstance
;
309 ZeroMemory(&wndclass
, sizeof(wndclass
));
310 wndclass
.cbSize
= sizeof(wndclass
);
311 wndclass
.lpfnWndProc
= MainWndProc
;
312 wndclass
.hInstance
= hInstance
;
313 wndclass
.hIcon
= LoadIconW(hInstance
, MAKEINTRESOURCEW(CLIP_ICON
));
314 wndclass
.hCursor
= LoadCursorW(0, IDC_ARROW
);
315 wndclass
.hbrBackground
= (HBRUSH
)(COLOR_WINDOW
+ 1);
316 wndclass
.lpszMenuName
= MAKEINTRESOURCEW(MAIN_MENU
);
317 wndclass
.lpszClassName
= szClassName
;
319 if (!RegisterClassExW(&wndclass
))
321 ShowLastWin32Error(NULL
);
325 LoadStringW(hInstance
, STRING_CLIPBOARD
, szBuffer
, ARRAYSIZE(szBuffer
));
326 Globals
.hMainWnd
= CreateWindowExW(WS_EX_CLIENTEDGE
,
329 WS_OVERLAPPEDWINDOW
| WS_HSCROLL
| WS_VSCROLL
,
338 if (!Globals
.hMainWnd
)
340 ShowLastWin32Error(NULL
);
344 ShowWindow(Globals
.hMainWnd
, nCmdShow
);
345 UpdateWindow(Globals
.hMainWnd
);
347 hAccel
= LoadAcceleratorsW(Globals
.hInstance
, MAKEINTRESOURCEW(ID_ACCEL
));
350 ShowLastWin32Error(Globals
.hMainWnd
);
353 while (GetMessageW(&msg
, 0, 0, 0))
355 if (!TranslateAcceleratorW(Globals
.hMainWnd
, hAccel
, &msg
))
357 TranslateMessage(&msg
);
358 DispatchMessageW(&msg
);
362 return (int)msg
.wParam
;