mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 19:26:32 +00:00
[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:
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user