2025-11-28 00:35:46 +09:00

201 lines
6.2 KiB
C

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved.
/****************************************************************************
PROGRAM: Select.c
PURPOSE: Contains library routines for selecting a region
FUNCTIONS:
StartSelection(HWND, POINT, LPRECT, int) - begin selection area
UpdateSelection(HWND, POINT, LPRECT, int) - update selection area
EndSelection(POINT, LPRECT) - end selection area
ClearSelection(HWND, LPRECT, int) - clear selection area
*******************************************************************************/
#include "windows.h"
#include "select.h"
/****************************************************************************
FUNCTION: DllMain(HANDLE, DWORD, LPVOID)
PURPOSE: DllMain is called by Windows when
the DLL is initialized, Thread Attached, and other times.
Refer to SDK documentation, as to the different ways this
may be called.
The DllMain function should perform additional initialization
tasks required by the DLL. In this example, no initialization
tasks are required. DllMain should return a value of 1 if
the initialization is successful.
*******************************************************************************/
BOOL APIENTRY DllMain(HANDLE hInst, DWORD ul_reason_being_called, LPVOID lpReserved)
{
return 1;
UNREFERENCED_PARAMETER(hInst);
UNREFERENCED_PARAMETER(ul_reason_being_called);
UNREFERENCED_PARAMETER(lpReserved);
}
/****************************************************************************
FUNCTION: StartSelection(HWND, POINT, LPRECT, int)
PURPOSE: Begin selection of region
****************************************************************************/
INT APIENTRY StartSelection(
HWND hWnd,
MPOINT ptCurrent,
LPRECT lpSelectRect,
INT fFlags)
{
if (lpSelectRect->left != lpSelectRect->right ||
lpSelectRect->top != lpSelectRect->bottom)
ClearSelection(hWnd, lpSelectRect, fFlags);
lpSelectRect->right = ptCurrent.x;
lpSelectRect->bottom = ptCurrent.y;
/* If you are extending the box, then invert the current rectangle */
if ((fFlags & SL_SPECIAL) == SL_EXTEND)
ClearSelection(hWnd, lpSelectRect, fFlags);
/* Otherwise, set origin to current location */
else {
lpSelectRect->left = ptCurrent.x;
lpSelectRect->top = ptCurrent.y;
}
SetCapture(hWnd);
return 1;
}
/****************************************************************************
FUNCTION: UpdateSelection(HWND, POINT, LPRECT, int) - update selection area
PURPOSE: Update selection
****************************************************************************/
INT APIENTRY UpdateSelection(
HWND hWnd,
MPOINT ptCurrent,
LPRECT lpSelectRect,
INT fFlags)
{
HDC hDC;
SHORT OldROP;
hDC = GetDC(hWnd);
switch (fFlags & SL_TYPE) {
case SL_BOX:
OldROP = (SHORT)SetROP2(hDC, R2_NOTXORPEN);
MoveToEx(hDC, lpSelectRect->left, lpSelectRect->top, NULL);
LineTo(hDC, lpSelectRect->right, lpSelectRect->top);
LineTo(hDC, lpSelectRect->right, lpSelectRect->bottom);
LineTo(hDC, lpSelectRect->left, lpSelectRect->bottom);
LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
LineTo(hDC, ptCurrent.x, lpSelectRect->top);
LineTo(hDC, ptCurrent.x, ptCurrent.y);
LineTo(hDC, lpSelectRect->left, ptCurrent.y);
LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
SetROP2(hDC, OldROP);
break;
case SL_BLOCK:
PatBlt(hDC,
lpSelectRect->left,
lpSelectRect->bottom,
lpSelectRect->right - lpSelectRect->left,
ptCurrent.y - lpSelectRect->bottom,
DSTINVERT);
PatBlt(hDC,
lpSelectRect->right,
lpSelectRect->top,
ptCurrent.x - lpSelectRect->right,
ptCurrent.y - lpSelectRect->top,
DSTINVERT);
break;
}
lpSelectRect->right = ptCurrent.x;
lpSelectRect->bottom = ptCurrent.y;
ReleaseDC(hWnd, hDC);
return 1;
}
/****************************************************************************
FUNCTION: EndSelection(POINT, LPRECT)
PURPOSE: End selection of region, release capture of mouse movement
****************************************************************************/
INT APIENTRY EndSelection(
MPOINT ptCurrent,
LPRECT lpSelectRect)
{
lpSelectRect->right = ptCurrent.x;
lpSelectRect->bottom = ptCurrent.y;
ReleaseCapture();
return 1;
}
/****************************************************************************
FUNCTION: ClearSelection(HWND, LPRECT, int) - clear selection area
PURPOSE: Clear the current selection
****************************************************************************/
INT APIENTRY ClearSelection(
HWND hWnd,
LPRECT lpSelectRect,
INT fFlags)
{
HDC hDC;
INT2DWORD OldROP;
hDC = GetDC(hWnd);
switch (fFlags & SL_TYPE) {
case SL_BOX:
OldROP = SetROP2(hDC, R2_NOTXORPEN);
MoveToEx(hDC, lpSelectRect->left, lpSelectRect->top, NULL);
LineTo(hDC, lpSelectRect->right, lpSelectRect->top);
LineTo(hDC, lpSelectRect->right, lpSelectRect->bottom);
LineTo(hDC, lpSelectRect->left, lpSelectRect->bottom);
LineTo(hDC, lpSelectRect->left, lpSelectRect->top);
SetROP2(hDC, OldROP);
break;
case SL_BLOCK:
PatBlt(hDC,
lpSelectRect->left,
lpSelectRect->top,
lpSelectRect->right - lpSelectRect->left,
lpSelectRect->bottom - lpSelectRect->top,
DSTINVERT);
break;
}
ReleaseDC(hWnd, hDC);
return 1;
}