[CLIPBRD]

- Add support for scrolling with the mouse wheel, by Ricardo Hanke.
- No need to check for CloseClipboard failure & display an error message if the clipboard was successfully opened just before.
- Use ARRAYSIZE macro instead of hardcoding the length of available clipboard format list.
CORE-10679

svn path=/trunk/; revision=70347
This commit is contained in:
Hermès Bélusca-Maïto
2015-12-14 22:55:55 +00:00
parent 2dbcc6fba0
commit a62f0ac81c
5 changed files with 93 additions and 7 deletions
+32 -1
View File
@@ -13,6 +13,20 @@ static const WCHAR szClassName[] = L"ClipBookWClass";
CLIPBOARD_GLOBALS Globals;
SCROLLSTATE Scrollstate;
static void UpdateLinesToScroll(void)
{
UINT uLinesToScroll;
if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &uLinesToScroll, 0))
{
Globals.uLinesToScroll = 3;
}
else
{
Globals.uLinesToScroll = uLinesToScroll;
}
}
static void SaveClipboardToFile(void)
{
OPENFILENAMEW sfn;
@@ -122,7 +136,7 @@ static void SetDisplayFormat(UINT uFormat)
}
else
{
Globals.uDisplayFormat = uFormat;
Globals.uDisplayFormat = uFormat;
}
if (Globals.hDspBmp)
@@ -344,6 +358,12 @@ static LRESULT WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP
break;
}
case WM_MOUSEWHEEL:
{
HandleMouseScrollEvents(hWnd, uMsg, wParam, lParam, &Scrollstate);
break;
}
case WM_HSCROLL:
{
HandleHorizontalScrollEvents(hWnd, uMsg, wParam, lParam, &Scrollstate);
@@ -475,6 +495,15 @@ static LRESULT WINAPI MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP
break;
}
case WM_SETTINGCHANGE:
{
if (wParam == SPI_SETWHEELSCROLLLINES)
{
UpdateLinesToScroll();
}
break;
}
default:
{
return DefWindowProc(hWnd, uMsg, wParam, lParam);
@@ -545,6 +574,8 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
ShowLastWin32Error(Globals.hMainWnd);
}
UpdateLinesToScroll();
while (GetMessageW(&msg, 0, 0, 0))
{
if (!TranslateAcceleratorW(Globals.hMainWnd, hAccel, &msg))
+10 -6
View File
@@ -108,17 +108,21 @@ void DeleteClipboardContent(void)
ShowLastWin32Error(Globals.hMainWnd);
}
if (!CloseClipboard())
{
ShowLastWin32Error(Globals.hMainWnd);
}
CloseClipboard();
}
UINT GetAutomaticClipboardFormat(void)
{
UINT uFormatList[] = {CF_UNICODETEXT, CF_ENHMETAFILE, CF_METAFILEPICT, CF_DIBV5, CF_DIB, CF_BITMAP};
static UINT uFormatList[] = {
CF_UNICODETEXT,
CF_ENHMETAFILE,
CF_METAFILEPICT,
CF_DIBV5,
CF_DIB,
CF_BITMAP
};
return GetPriorityClipboardFormat(uFormatList, 6);
return GetPriorityClipboardFormat(uFormatList, ARRAYSIZE(uFormatList));
}
BOOL IsClipboardFormatSupported(UINT uFormat)
@@ -3,6 +3,8 @@
// #pragma once
#include <limits.h>
#include <windef.h>
#include <winbase.h>
#include <winuser.h>
@@ -29,6 +31,7 @@ typedef struct _CLIPBOARD_GLOBALS
HMENU hMenu;
UINT uDisplayFormat;
UINT uCheckedItem;
UINT uLinesToScroll;
HBITMAP hDspBmp;
} CLIPBOARD_GLOBALS;
@@ -70,6 +70,53 @@ void HandleKeyboardScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lPar
}
}
void HandleMouseScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPSCROLLSTATE state)
{
SCROLLINFO si;
int Delta;
int NewPos;
si.cbSize = sizeof(si);
si.fMask = SIF_PAGE;
GetScrollInfo(hWnd, SB_VERT, &si);
if (Globals.uLinesToScroll == WHEEL_PAGESCROLL)
{
NewPos = si.nPage;
}
else
{
NewPos = Globals.uLinesToScroll * 5;
}
if (GET_WHEEL_DELTA_WPARAM(wParam) > 0)
{
NewPos = state->CurrentY - NewPos;
}
else
{
NewPos = state->CurrentY + NewPos;
}
NewPos = min(state->MaxY, max(0, NewPos));
if (NewPos == state->CurrentY)
{
return;
}
Delta = NewPos - state->CurrentY;
state->CurrentY = NewPos;
ScrollWindowEx(hWnd, 0, -Delta, NULL, NULL, NULL, NULL, SW_INVALIDATE);
si.cbSize = sizeof(si);
si.fMask = SIF_POS;
si.nPos = state->CurrentY;
SetScrollInfo(hWnd, SB_VERT, &si, TRUE);
}
void HandleHorizontalScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPSCROLLSTATE state)
{
SCROLLINFO si;
@@ -15,6 +15,7 @@ typedef struct _SCROLLSTATE
} SCROLLSTATE, *LPSCROLLSTATE;
void HandleKeyboardScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void HandleMouseScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPSCROLLSTATE state);
void HandleHorizontalScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPSCROLLSTATE state);
void HandleVerticalScrollEvents(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPSCROLLSTATE state);
void UpdateWindowScrollState(HWND hWnd, HBITMAP hBmp, LPSCROLLSTATE lpState);