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

📄 rangeslider.c

📁 读取音乐光盘磁道为磁盘文件的DLL源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <windows.h>
#include "rangeslider.h"
#include "globals.h"


#define HEIGHTSLIDER 13

typedef struct {
  DWORD min;
  DWORD max;
  DWORD start;
  DWORD finish;
  int xOfsStart;        // possibly useless
  SHORT xStart;         // x-offset of starting position
  SHORT yStart;         // y-offset of starting position
  int which;
  RECT rc;
  BOOL bInDrag;
  HDC hCompDC;
  HBITMAP hBmp;
  HBITMAP hTop;
  HBITMAP hBottom;
  HPEN hDkGreyPen;
  HPEN hLtGreyPen;
  HPEN hBlackPen;
  HPEN hWhitePen;
  HBRUSH hBackground;
  HBRUSH hGreenBrush;
  int numTics;
  DWORD tic[100];
} RANGESLIDERSTRUCT, FAR *LPRANGESLIDERSTRUCT;


void PaintRangeSliderWnd( HWND hWnd, LPRANGESLIDERSTRUCT lpr );
LRESULT CALLBACK RangeSliderBarProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
void CreateSliderBitmaps( HDC hDC, LPRANGESLIDERSTRUCT lpr );
BOOL SliderHitTest( HWND hWnd, int which, LPARAM lParam, LPRANGESLIDERSTRUCT lpr );
BOOL sliderHandleLButtonDown( HWND hWnd, LPRANGESLIDERSTRUCT lpr, LPARAM lParam );
BOOL sliderHandleLButtonUp( HWND hWnd, LPRANGESLIDERSTRUCT lpr, LPARAM lParam );
BOOL sliderHandleMouseMove( HWND hWnd, LPRANGESLIDERSTRUCT lpr, LPARAM lParam );
BOOL sliderHandleSnap( HWND hWnd, WPARAM wParam, BOOL bRight, LPRANGESLIDERSTRUCT lpr );
BOOL SliderLeftHitTest( HWND hWnd, int which, LPARAM lParam,
			 LPRANGESLIDERSTRUCT lpr );
BOOL SliderRightHitTest( HWND hWnd, int which, LPARAM lParam,
			 LPRANGESLIDERSTRUCT lpr );
BOOL SendSliderNotifyChanging( HWND hWnd, LPRANGESLIDERSTRUCT lpr, DWORD dwNew );
BOOL SendSliderNotifyChanged( HWND hWnd, LPRANGESLIDERSTRUCT lpr );


static char szRangeSliderClass[] = "ak_rangeslider";


int InitRangeSliderClass( void )
{
  WNDCLASSEX wc;
  
  ZeroMemory( &wc, sizeof(wc) );
  wc.cbSize          = sizeof(wc);
  wc.style           = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc     = (WNDPROC)RangeSliderBarProc;
  wc.hInstance       = ghInstance;
  wc.hCursor         = LoadCursor( NULL, IDC_ARROW );
  wc.hbrBackground   = (HBRUSH)(COLOR_BTNFACE+1);
  wc.lpszClassName   = szRangeSliderClass;

  if ( !RegisterClassEx( &wc ) )
    return 0;

  return -1;
}


/*
 * Implements a sliding range bar control.  The control is used to select
 * a range using two slide controls -- one on top and one on bottom.
 *
 * Message          wParam      lParam
 * ---------------- ----------- ------------------------------------------
 * RSB_SETMIN       bRepaint    minimum allowed value
 * RSB_SETMAX       bRepaint    maxiumum allowed value
 * RSB_GETMIN       0           0
 * RSB_GETMAX       0           0
 * RSB_RESET        0           0
 * RSB_SETSTART     bRepaint    starting position of selected range
 * RSB_SETFINISH    bRepaint    ending position of selected range
 * RSB_SNAP         top/bottom  0 = left, 1 = right
 */
LRESULT CALLBACK RangeSliderBarProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  LPRANGESLIDERSTRUCT lpr;
  DWORD dwTmp;

  lpr = (LPRANGESLIDERSTRUCT)GetWindowLong( hWnd, GWL_USERDATA );
  if ( !lpr && (uMsg != WM_CREATE) )
    return DefWindowProc( hWnd, uMsg, wParam, lParam );

  switch( uMsg )
    {
    case WM_CREATE:
      dwTmp = sizeof(*lpr);
      lpr = (LPRANGESLIDERSTRUCT)GlobalAlloc( GPTR, sizeof(*lpr) );
      lpr->min = 0;
      lpr->max = 100;
      lpr->start = 0;
      lpr->finish = 0;
      lpr->hTop = (HBITMAP)LoadBitmap( ghInstance, "SliderTop" );
      lpr->hBottom = (HBITMAP)LoadBitmap( ghInstance, "SliderBottom" );
      lpr->hWhitePen = (HPEN)GetStockObject( WHITE_PEN );
      lpr->hBlackPen = (HPEN)GetStockObject( BLACK_PEN );
      lpr->hDkGreyPen = CreatePen( PS_SOLID, 1, RGB( 128, 128, 128 ) );
      lpr->hLtGreyPen = CreatePen( PS_SOLID, 1, RGB( 192, 192, 192 ) );
      lpr->hBackground = CreateSolidBrush( GetSysColor( COLOR_MENU ) );
      lpr->hGreenBrush = CreateSolidBrush( RGB( 0, 255, 0 ) );
      GetClientRect( hWnd, &lpr->rc );
      SetWindowLong( hWnd, GWL_USERDATA, (LONG)lpr );
      break;

    case WM_DESTROY:
      DeleteObject( lpr->hTop );
      DeleteObject( lpr->hBottom );
      DeleteObject( lpr->hDkGreyPen );
      DeleteObject( lpr->hLtGreyPen );
      DeleteObject( lpr->hBackground );
      DeleteObject( lpr->hGreenBrush );
      if ( lpr->hCompDC )
	ReleaseDC( hWnd, lpr->hCompDC );
      if ( lpr->hBmp )
	DeleteObject( lpr->hBmp );
      GlobalFree( (HGLOBAL)lpr );
      break;

    case WM_PAINT:
      PaintRangeSliderWnd( hWnd, lpr );
      break;

    case WM_LBUTTONDOWN:
      if ( sliderHandleLButtonDown( hWnd, lpr, lParam ) )
	{
	  InvalidateRect( hWnd, &lpr->rc, FALSE );
	  UpdateWindow( hWnd );
	}
      break;

    case WM_LBUTTONUP:
      if ( sliderHandleLButtonUp( hWnd, lpr, lParam ) )
	{
	  InvalidateRect( hWnd, &lpr->rc, FALSE );
	  UpdateWindow( hWnd );
	}
      break;

    case WM_MOUSEMOVE:
      if ( sliderHandleMouseMove( hWnd, lpr, lParam ) )
	{
	  InvalidateRect( hWnd, &lpr->rc, FALSE );
	  UpdateWindow( hWnd );
	}
      break;

    case WM_SETFOCUS:
      break;

    case RSB_SETMIN:
      dwTmp = (DWORD)lParam;
      if ( dwTmp >= lpr->max )
	dwTmp = lpr->max - 1;
      lpr->min = dwTmp;
      break;

    case RSB_SETMAX:
      dwTmp = (DWORD)lParam;
      if ( dwTmp <= lpr->min )
	dwTmp = lpr->min + 1;
      lpr->max = dwTmp;
      break;

    case RSB_SETSTART:
      dwTmp = (DWORD)lParam;
      if ( dwTmp < lpr->min )
	dwTmp = lpr->min;
      else if ( dwTmp >= lpr->max )
	dwTmp = lpr->max-1;
      lpr->start = dwTmp;
      if ( wParam )
	{
	  InvalidateRect( hWnd, &lpr->rc, FALSE );
	  UpdateWindow( hWnd );
	}
      break;

    case RSB_SETFINISH:
      dwTmp = (DWORD)lParam;
      if ( dwTmp <= lpr->min )
	dwTmp = lpr->min + 1;
      else if ( dwTmp > lpr->max )
	dwTmp = lpr->max;
      lpr->finish = dwTmp;
      if ( wParam )
	{
	  InvalidateRect( hWnd, &lpr->rc, FALSE );
	  UpdateWindow( hWnd );
	}
      break;

    case RSB_GETMIN:
      return (LRESULT)lpr->min;

    case RSB_GETMAX:
      return (LRESULT)lpr->max;

    case RSB_GETSTART:
      return (LRESULT)lpr->start;

    case RSB_GETFINISH:
      return (LRESULT)lpr->finish;

    case RSB_SETTIC:
      if ( lpr->numTics < 100 )
	lpr->tic[lpr->numTics++] = (DWORD)lParam;
      break;

    case RSB_SNAP:
      if ( sliderHandleSnap( hWnd, wParam, (BOOL)lParam, lpr ) )
	{
	  InvalidateRect( hWnd, &lpr->rc, FALSE );
	  UpdateWindow( hWnd );
	}
      break;

    default:
      return DefWindowProc( hWnd, uMsg, wParam, lParam );
    }

  return 0L;
}


BOOL SliderHitTest( HWND hWnd, int which, LPARAM lParam,
		    LPRANGESLIDERSTRUCT lpr )
{
  int xOfs;
  POINTS pt;

  pt = MAKEPOINTS( lParam );

  switch( which )
    {
    case TOPSLIDER:
      xOfs = (lpr->rc.right-7) * lpr->start / (lpr->max - lpr->min);
      if ( (pt.x >= xOfs) && (pt.x <= (xOfs + 7)) &&
	   (pt.y >= 0) && (pt.y <= 14) )
	{
	  OutputDebugString( "SliderHitTest: TOPSLIDER hit!" );
	  return TRUE;
	}
      break;

    case BOTTOMSLIDER:
      xOfs = (lpr->rc.right-7) * lpr->finish / (lpr->max - lpr->min);
      if ( (pt.x >= xOfs) && (pt.x <= (xOfs + 7)) &&
	   (pt.y >= 25+HEIGHTSLIDER) && (pt.y <= 39+HEIGHTSLIDER) )
	{
	  OutputDebugString( "SliderHitTest: BOTTOMSLIDER hit!" );
	  return TRUE;
	}
      break;
    }

  OutputDebugString( "SliderHitTest: no slider hit..." );
  return FALSE;
}


BOOL SliderLeftHitTest( HWND hWnd, int which, LPARAM lParam,
			LPRANGESLIDERSTRUCT lpr )
{
  int xOfs;
  POINTS pt;

  pt = MAKEPOINTS( lParam );

  switch( which )
    {
    case TOPSLIDER:
      xOfs = (lpr->rc.right-7) * lpr->start / (lpr->max - lpr->min);
      if ( (pt.x < xOfs) && (pt.y >= 0) && (pt.y <= 14) )
	{
	  return TRUE;
	}
      break;

    case BOTTOMSLIDER:
      xOfs = (lpr->rc.right-7) * lpr->finish / (lpr->max - lpr->min);
      if ( (pt.x < xOfs) && (pt.y >= 25+HEIGHTSLIDER) && (pt.y <= 39+HEIGHTSLIDER) )
	{
	  return TRUE;
	}
      break;
    }

  return FALSE;
}


BOOL SliderRightHitTest( HWND hWnd, int which, LPARAM lParam,
			 LPRANGESLIDERSTRUCT lpr )
{
  int xOfs;
  POINTS pt;

  pt = MAKEPOINTS( lParam );

  switch( which )
    {
    case TOPSLIDER:
      xOfs = (lpr->rc.right-7) * lpr->start / (lpr->max - lpr->min);
      if ( (pt.x > xOfs+7) && (pt.y >= 0) && (pt.y <= 14) )
	{
	  return TRUE;
	}
      break;

    case BOTTOMSLIDER:
      xOfs = (lpr->rc.right-7) * lpr->finish / (lpr->max - lpr->min);
      if ( (pt.x > xOfs+7) && (pt.y >= 25+HEIGHTSLIDER) && (pt.y <= 39+HEIGHTSLIDER) )
	{
	  return TRUE;
	}
      break;
    }

  return FALSE;
}


#define HEIGHTSLIDER 13
void PaintRangeSliderWnd( HWND hWnd, LPRANGESLIDERSTRUCT lpr )
{
  PAINTSTRUCT p;
  RECT rc;
  HDC hDC, hCompDC;
  HBITMAP hBmp;
  POINT pt[10];
  int w, h, xOfs, i;

  hDC = BeginPaint( hWnd, &p );
  rc = lpr->rc;

⌨️ 快捷键说明

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