Windows2000/private/windows/shell/accesory/ole2pbsh/sizewp.c
2020-09-30 17:12:32 +02:00

182 lines
4.4 KiB
C

/****************************Module*Header******************************\
* Module Name: sizewp.c *
* Created: 1989 *
* Copyright (c) 1987 - 1991 Microsoft Corporation *
* A general description of how the module is used goes here. *
* Additional information such as restrictions, limitations, or special *
* algorithms used if they are externally visible or effect proper use *
* of the module. *
*/
#include <windows.h>
#include <port1632.h>
#include "oleglue.h"
#include "pbrush.h"
static HBITMAP hArrow;
extern HWND pbrushWnd[];
extern int theSize;
extern POINT aspect;
extern struct csstat CursorStat;
int SizeTable[] = { 1, 2, 3, 4, 5, 7, 9, 11 };
int YPosTable[] = { 8, 13, 19, 26, 34, 43, 54, 67, 200 };
int PRIVATE
Pos2Index(int pos)
{
int i;
if (SizeTable[7] < pos)
return 7;
for (i = 0; SizeTable[i] < pos; ++i)
;
return i;
}
void PRIVATE
InitDC(HDC hDC)
{
RECT client;
/* setup mapping mode to give consistent logical coordinates */
SetMapMode(hDC, MM_ANISOTROPIC);
MSetWindowExt(hDC, SIZE_EXTX, SIZE_EXTY);
GetClientRect(pbrushWnd[SIZEid], &client);
MSetViewportExt(hDC, 1 + client.right - client.left,
1 + client.bottom - client.top);
MSetViewportOrg(hDC, 0, 0);
}
void PRIVATE
PaintSize(HDC hDC)
{
int i, index;
HDC hDCMem;
SHORTPARM oldBltMode;
BITMAP hbits;
RECT rect;
HBRUSH hBrush;
InitDC(hDC);
/* draw the line widths */
rect.left = 19;
rect.right = 51;
hBrush = GetStockObject(BLACK_BRUSH);
for (i = 0; i < NUM_SIZES; ++i) {
rect.top = YPosTable[i];
rect.bottom = rect.top + SizeTable[i];
FillRect(hDC, &rect, hBrush);
}
/* draw the arrow */
hDCMem = CreateCompatibleDC(hDC);
if (hDCMem) {
SetROP2(hDC, R2_COPYPEN);
oldBltMode = SetStretchBltMode(hDC, COLORONCOLOR);
GetObject(hArrow, sizeof(hbits), (LPVOID) &hbits);
SelectObject(hDCMem, hArrow);
index = Pos2Index(theSize);
StretchBlt(hDC, 4, YPosTable[index] +
((SizeTable[index] - (int)(hbits.bmHeight)) / 2),
hbits.bmWidth, hbits.bmHeight, hDCMem, 0, 0,
hbits.bmWidth, hbits.bmHeight,
SRCCOPY);
SetStretchBltMode(hDC, oldBltMode);
DeleteDC(hDCMem);
}
}
int PRIVATE
LocateSize(POINT pt)
{
HDC hDC;
int i;
hDC = GetDisplayDC(pbrushWnd[SIZEid]);
i = 0;
if (hDC) {
InitDC(hDC);
DPtoLP(hDC, &pt, 1);
for (; pt.y >= YPosTable[i] + SizeTable[i]; ++i)
;
ReleaseDC(pbrushWnd[SIZEid], hDC);
}
return SizeTable[min(NUM_SIZES - 1, i)];
}
LONG FAR PASCAL
SizeWP(HWND hWnd, UINT message, WPARAM wParam, LONG lParam)
{
int newSize;
PAINTSTRUCT ps;
POINT pt;
LONG2POINT(lParam,pt);
switch (message) {
case WM_CREATE:
hArrow = LoadBitmap(hInst, TEXT("pArrow"));
/* if we couldn't load resource terminate the app */
if (!hArrow)
return -1L;
break;
case WM_DESTROY:
if(hArrow)
DeleteObject(hArrow);
break;
case WM_MOUSEMOVE:
if (SetCursorOn())
SendMessage(pbrushWnd[PAINTid], WM_HIDECURSOR, 0, 0L);
return DefWindowProc(hWnd, message, wParam, lParam);
case WM_PAINT:
BeginPaint(hWnd, &ps);
if (!gfInvisible)
PaintSize(ps.hdc);
EndPaint(hWnd, &ps);
break;
/* change drawing size */
case WM_LBUTTONDOWN:
newSize = LocateSize(pt);
if (newSize != theSize)
{
/* erase old and paint new size indicators */
theSize = newSize;
GetAspct(theSize, (PINT)&aspect.x, (PINT)&aspect.y);
if (!CursorStat.captured)
CursorStat.noted = FALSE;
InvalidateRect(pbrushWnd[SIZEid], NULL, TRUE);
if (theTool != TEXTtool) {
DOUTR(L"sizewp LBUTTONDOWN: sending WM_TERMINATE");
SendMessage(pbrushWnd[PAINTid], WM_TERMINATE, 0, 0L);
}
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0L;
}