⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 select.c

📁 frasr200的win 版本源码(18.21),使用make文件,使用的vc版本较低,在我的环境下编译有问题! 很不错的分形程序代码!
💻 C
字号:
/****************************************************************************

    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"

extern BOOL bTrack, bMove, bMoving;

/****************************************************************************

    FUNCTION: StartSelection(HWND, POINT, LPRECT, int)

    PURPOSE: Begin selection of region

****************************************************************************/


POINT Center, DragPoint, ZoomDim;

void FAR PASCAL StartSelection(hWnd, ptCurrent, lpSelectRect, fFlags)
HWND hWnd;
POINT 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;
        Center = ptCurrent;
    }
    SetCapture(hWnd);
}

extern int xdots, ydots;

/****************************************************************************

    FUNCTION: UpdateSelection(HWND, POINT, LPRECT, int) - update selection area

    PURPOSE: Update selection

****************************************************************************/

void FAR PASCAL UpdateSelection(hWnd, ptCurrent, lpSelectRect, fFlags)
HWND hWnd;
POINT ptCurrent;
LPRECT lpSelectRect;
int fFlags;
{
    HDC hDC;
    short OldROP;
    POINT NewDim, NewPoint;
    unsigned ScaledY;

    hDC = GetDC(hWnd);

    switch (fFlags & SL_TYPE) {

	case SL_BOX:
 	    OldROP = SetROP2(hDC, R2_NOTXORPEN);
	    MoveTo(hDC, lpSelectRect->left, lpSelectRect->top);
	    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;

        /* MCP 6-3-92 */
        case (SL_ZOOM):
	   OldROP = SetROP2(hDC, R2_NOTXORPEN);
	   MoveTo(hDC, lpSelectRect->left, lpSelectRect->top);
	   LineTo(hDC, lpSelectRect->right, lpSelectRect->top);
	   LineTo(hDC, lpSelectRect->right, lpSelectRect->bottom);
	   LineTo(hDC, lpSelectRect->left, lpSelectRect->bottom);
	   LineTo(hDC, lpSelectRect->left, lpSelectRect->top);

           if(bTrack)
           {
              NewPoint = ptCurrent;

              NewDim.x = Center.x - NewPoint.x;
              if(NewDim.x < 0)
                 NewDim.x = -NewDim.x;

              NewDim.y = Center.y - NewPoint.y;
              if(NewDim.y < 0)
                 NewDim.y = -NewDim.y;

              ScaledY = (unsigned)(((long)NewDim.y) * xdots / ydots);
              if(NewDim.x < ScaledY)
                 NewDim.x = ScaledY;
              else
                 NewDim.y = (unsigned)(((long)NewDim.x) * ydots / xdots);

              if(NewDim.x < 2)
                 NewDim.x = 2;
              if(NewDim.y < 2)
                 NewDim.y = 2;

              ZoomDim = NewDim;
           }
           else if(bMoving)
           {
              Center.x += ptCurrent.x - DragPoint.x;
              Center.y += ptCurrent.y - DragPoint.y;
              DragPoint = ptCurrent;
           }

           if (bTrack || bMoving) {
              lpSelectRect->left   = Center.x - ZoomDim.x;
              lpSelectRect->right  = Center.x + ZoomDim.x;
              lpSelectRect->bottom = Center.y + ZoomDim.y;
              lpSelectRect->top    = Center.y - ZoomDim.y;

     	      MoveTo(hDC, lpSelectRect->left, lpSelectRect->top);
	      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);
           ReleaseDC(hWnd, hDC);
           return;
    }
    lpSelectRect->right = ptCurrent.x;
    lpSelectRect->bottom = ptCurrent.y;
    ReleaseDC(hWnd, hDC);
}

/****************************************************************************

    FUNCTION: EndSelection(POINT, LPRECT)

    PURPOSE: End selection of region, release capture of mouse movement

****************************************************************************/

void FAR PASCAL EndSelection(ptCurrent, lpSelectRect)
POINT ptCurrent;
LPRECT lpSelectRect;
{
    if(!bMove)
    {
       lpSelectRect->right = ptCurrent.x;
       lpSelectRect->bottom = ptCurrent.y;
    }
    ReleaseCapture();
}

/****************************************************************************

    FUNCTION: ClearSelection(HWND, LPRECT, int) - clear selection area

    PURPOSE: Clear the current selection

****************************************************************************/

void FAR PASCAL ClearSelection(hWnd, lpSelectRect, fFlags)
HWND hWnd;
LPRECT lpSelectRect;
int fFlags;
{
    HDC hDC;
    short OldROP;

    hDC = GetDC(hWnd);
    switch (fFlags & SL_TYPE) {

        /* MCP 6-3-92 */
        case (SL_ZOOM):
	case SL_BOX:
	    OldROP = SetROP2(hDC, R2_NOTXORPEN);
	    MoveTo(hDC, lpSelectRect->left, lpSelectRect->top);
	    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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -