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

📄 trackwnd.c

📁 读取音乐光盘磁道为磁盘文件的DLL源码
💻 C
📖 第 1 页 / 共 3 页
字号:
    {
      x = lpe->hx[1] + 1;
      y = 6 + lpe->iHeaderHeight + i*(lpe->iTextHeight + 4);

      rc.left = x;
      rc.right = x + lpe->hw[1];
      rc.top = y;
      rc.bottom = y + lpe->iTextHeight;

      if ( (mx >= rc.left) && (mx <= rc.right) && (my >= rc.top) &&
           (my <= rc.bottom) )
        return i;
    }

  return -1;
}

/*
 * returns TRUE if the mouse click was on either a check box or a track name,
 * and will require a repaint
 */
BOOL HandleLMouseDown( HWND hWnd, LPTRACKWNDEXTRA lpe, LPARAM lParam )
{
  int i;

  SetFocus( hWnd );

  // determine if the click was on a check box
  i = CheckBoxHit( lpe, lParam );
  if ( i != -1 )
    {
      lpe->tracks[i].bChecked = !lpe->tracks[i].bChecked;
      UpdateStatusBar();
      return TRUE;
    }

  i = TrackNameHit( lpe, lParam );
  if ( i != -1 )
    {
      lpe->iSelected = i;
      return TRUE;
    }

  return FALSE;
}

/*
 * returns TRUE if the mouse click was on either a check box or a track name,
 * and will require a repaint
 */
BOOL HandleRMouseDown( HWND hWnd, LPTRACKWNDEXTRA lpe, LPARAM lParam )
{
  int i;

  SetFocus( hWnd );

  // did we hit a track name?
  i = TrackNameHit( lpe, lParam );
  if ( i != -1 )
    {
      lpe->iSelected = i;
      return TRUE;
    }

  return FALSE;
}


/*
 * if trackNo == -1, then check/uncheck all
 */
BOOL HandleCheckTrack( HWND hWnd, LPTRACKWNDEXTRA lpe, int trackNo, BOOL bChecked )
{
  int i;

  hWnd = hWnd;
  if ( trackNo == (int)ALLTRACKS )
    {
      for( i = 0; i < lpe->iNum; i++ )
        lpe->tracks[i].bChecked = bChecked;
      return TRUE;
    }

  if ( trackNo < 0 || trackNo >= lpe->iNum )
    return FALSE;

  lpe->tracks[trackNo].bChecked = bChecked;

  return TRUE;
}

/*
 * if trackNo == -1, then check/uncheck all
 */
BOOL HandleInvertCheck( HWND hWnd, LPTRACKWNDEXTRA lpe, int trackNo )
{
  int i;

  hWnd = hWnd;
  if ( trackNo == (int)ALLTRACKS )
    {
      for( i = 0; i < lpe->iNum; i++ )
        lpe->tracks[i].bChecked = !lpe->tracks[i].bChecked;
      return TRUE;
    }

  if ( trackNo < 0 || trackNo >= lpe->iNum )
    return FALSE;

  lpe->tracks[trackNo].bChecked = !lpe->tracks[trackNo].bChecked;

  return TRUE;
}


int doTrackContextMenu( HWND hParent, HWND hChild, LPARAM lParam )
{
  HMENU hMenu, hPopup;
  LPTRACKWNDEXTRA lpe;
  int i;
  POINT p;
  LPARAM lp2;

  p.x = (LONG)LOWORD(lParam);
  p.y = (LONG)HIWORD(lParam);
  ScreenToClient( hChild, &p );
  lp2 = MAKELPARAM( p.x, p.y );

  lpe = (LPTRACKWNDEXTRA)GetWindowLong( hChild, GWL_USERDATA);

  if ( p.y < lpe->iHeaderHeight )
    return 0;

  // if it hit a track name, then we need to pop up the track context menu
  // otherwise, we need a generic context menu
  i = TrackNameHit( lpe, lp2 );
  if ( i != -1 )
    {
      hMenu = LoadMenu( ghInstance, "trackPopupMenu" );
      if ( !hMenu )
        return 0;

      hPopup = GetSubMenu( hMenu, 0 );
      TrackPopupMenu( hPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON,
                      LOWORD(lParam), HIWORD(lParam), 0, hParent, NULL );
    }
  else
    {
      hMenu = LoadMenu( ghInstance, "genericPopupMenu" );
      if ( !hMenu )
        return 0;

      // pop up a more generic menu
      hPopup = GetSubMenu( hMenu, 0 );
      TrackPopupMenu( hPopup, TPM_LEFTALIGN | TPM_RIGHTBUTTON,
                      LOWORD(lParam), HIWORD(lParam), 0, hParent, NULL );
    }

  DestroyMenu( hMenu );

  return 1;
}



/*
 * Pops up a sub-classed single-line edit on top of track title.  Must ensure
 * that the selected track is visible.  Captures mouse input to catch when
 * user clicks elsewhere, and saves the text.
 */
BOOL RenameSelectedTrack( HWND hWnd, LPTRACKWNDEXTRA lpe )
{
  int hw[5];            // width of header items
  int hx[5];            // x offset of header items
  int i;
  RECT rc;
  //HWND hEdit;

  if ( bInEditTrack )
    return FALSE;

  bInEditTrack = TRUE;

  if ( (lpe->iSelected < 0) || (lpe->iSelected >= lpe->iNum) )
    return FALSE;

  /*
   * compute the offsets for each header section
   */
  ZeroMemory( hw, sizeof(int[5]) );
  ZeroMemory( hx, sizeof(int[5]) );
  for( i = 0; i < 3; i++ )
    {
      HD_ITEM hi;
      ZeroMemory( &hi, sizeof(hi) );
      hi.mask = HDI_WIDTH;
      SendMessage( lpe->hHeader, HDM_GETITEM, i, (LPARAM)&hi );
      hw[i] = hi.cxy;
      hx[i+1] = hx[i] + hw[i];
    }

  i = lpe->iSelected;
  rc.left = hx[1] + 5 - lpe->dx;
  rc.right = rc.left + hw[1] - 10;
  rc.top = 4 + (lpe->iHeaderHeight + i*(lpe->iTextHeight+4) ) - lpe->dy;
  rc.bottom = rc.top + 20;

  hEdit = CreateWindowEx( 0L, "EDIT", lpe->tracks[lpe->iSelected].name,
                          WS_BORDER | WS_CHILD | WS_VISIBLE
                          | ES_AUTOHSCROLL | ES_LEFT,
                          rc.left, rc.top,
                          rc.right - rc.left, rc.bottom - rc.top,
                          hWnd, (HMENU)++iCtlId, ghInstance, NULL );

  // Save old window proc
  SetWindowLong( hEdit, GWL_USERDATA, GetWindowLong( hEdit, GWL_WNDPROC ) );
  // Set new window proc
  SetWindowLong( hEdit, GWL_WNDPROC, (LONG)EditSubclassWndProc );

  SetFocus( hEdit );
  SendMessage( hEdit, EM_SETLIMITTEXT, (WPARAM)(MAX_PATH+1), 0L );
  SendMessage( hEdit, EM_SETSEL, 0, -1L );
  //SendMessage( hEdit, WM_STARTMOUSECAPTURE, 0, 0L );

  SetCapture( hEdit );

  return TRUE;
}


LRESULT processFindFirst( LPTRACKWNDEXTRA lpe, LPADDTRACK lpAddTrack )
{
  int i;

  if ( lpAddTrack == NULL )
    return -1L;

  for( i = 0; i < lpe->iNum; i++ )
    {
      if ( lpe->tracks[i].bChecked )
        {
          *lpAddTrack = lpe->tracks[i];
          lpe->iFound = i;
          return i;
        }
    }

  return -1L;
}


LRESULT processFindNext( LPTRACKWNDEXTRA lpe, LPADDTRACK lpAddTrack )
{
  int i;

  if ( lpAddTrack == NULL )
    return -1L;

  for( i = lpe->iFound + 1; i < lpe->iNum; i++ )
    {
      if ( lpe->tracks[i].bChecked )
        {
          *lpAddTrack = lpe->tracks[i];
          lpe->iFound = i;
          return i;
        }
    }

  return -1L;
}


BOOL setTrackStatus( LPTRACKWNDEXTRA lpe, int idx, LPCSTR s )
{
  if ( !lpe || !s )
    return FALSE;

  lstrcpyn( lpe->tracks[idx].status, s, 61 );
  return TRUE;
}


#ifndef WM_MOUSEHOVER
#define WM_MOUSEHOVER 0x2A1
#endif
#ifndef WM_MOUSELEAVE
#define WM_MOUSELEAVE 0x2A3
#endif
void logWindowsProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
#if 0
  char szMsg[40];
  static UINT filtered[] = {
    WM_MOUSEMOVE, WM_MOUSEHOVER, WM_MOUSELEAVE, WM_SETCURSOR, WM_NCHITTEST, 0
  };
  int i;

  hWnd = hWnd, wParam = wParam; lParam = lParam;

  for( i = 0; filtered[i]; i++ )
    if ( uMsg == filtered[i] )
      return;
  
  convertuMsg( uMsg, szMsg );
#else
  hWnd = hWnd; uMsg = uMsg; wParam = wParam; lParam = lParam;
#endif
}


void convertuMsg( UINT uMsg, char * s )
{
  switch( uMsg )
    {
    case WM_COMMAND: lstrcpy( s, "WM_COMMAND" ); break;
    case WM_INITDIALOG: lstrcpy( s, "WM_INITDIALOG" ); break;
    default:
      wsprintf( s, "%d", uMsg );
      break;
    }
}

LRESULT CALLBACK EditSubclassWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  WNDPROC lpfnWndProc;
  int x, y;
  RECT rc;

  lpfnWndProc = (WNDPROC)GetWindowLong( hWnd, GWL_USERDATA );

#if 0
  switch( uMsg )
    {
    case EM_CANUNDO: OutputDebugString( "EM_CANUNDO" ); break;
    case EM_CHARFROMPOS: OutputDebugString( "EM_CHARFROMPOS" ); break;
    case EM_EMPTYUNDOBUFFER: OutputDebugString( "EM_EMPTYUNDOBUFFER" ); break;
    case EM_GETFIRSTVISIBLELINE: OutputDebugString( "EM_GETFIRSTVISIBLELINE" ); break;
    case EM_GETLIMITTEXT: OutputDebugString( "EM_GETLIMITTEXT" ); break;
    case EM_GETLINE: OutputDebugString( "EM_GETLINE" ); break;
    case EM_GETMARGINS: OutputDebugString( "EM_GETMARGINS" ); break;
    case EM_GETMODIFY: OutputDebugString( "EM_GETMODIFY" ); break;
    case EM_GETRECT: OutputDebugString( "EM_GETRECT" ); break;
    case EM_GETSEL: OutputDebugString( "EM_GETSEL" ); break;
    case EM_LINELENGTH: OutputDebugString( "EM_LINELENGTH" ); break;
    case EM_POSFROMCHAR: OutputDebugString( "EM_POSFROMCHAR" ); break;
    case EM_REPLACESEL: OutputDebugString( "EM_REPLACESEL" ); break;
    case EM_SETLIMITTEXT: OutputDebugString( "EM_SETLIMITTEXT" ); break;
    case EM_SETMARGINS: OutputDebugString( "EM_SETMARGINS" ); break;
    case EM_SETMODIFY: OutputDebugString( "EM_SETMODIFY" ); break;
    case EM_SETREADONLY: OutputDebugString( "EM_SETREADONLY" ); break;
    case EM_SETSEL: OutputDebugString( "EM_SETSEL" ); break;
    case EM_UNDO: OutputDebugString( "EM_UNDO" ); break;
    case WM_COMMAND:
      switch( HIWORD(wParam) )
        {
        case EN_SETFOCUS: OutputDebugString( "EN_SETFOCUS: edit control" ); break;
        case EN_KILLFOCUS: OutputDebugString( "EN_KILLFOCUS: edit control" ); break;
        case EN_CHANGE: OutputDebugString( "EN_CHANGE" ); break;
        case EN_ERRSPACE: OutputDebugString( "EN_ERRSPACE" ); break;
        case EN_MAXTEXT: OutputDebugString( "EN_MAXTEXT" ); break;
        case EN_UPDATE: OutputDebugString( "EN_UPDATE" ); break;
        }
      break;
    }
#endif

  switch( uMsg )
    {
    case WM_LBUTTONDOWN:
    case WM_RBUTTONDOWN:
      GetClientRect( hWnd, &rc );
      x = (int)LOWORD( lParam );
      y = (int)HIWORD( lParam );
      if ( (x < 0) || ( y < 0) || (x > rc.right) || (y > rc.bottom) )
        {
          POINT p;

          SetTrackWndText( hWnd );
          ReleaseCapture();
          bInEditTrack = FALSE;
          p.x = x; p.y = y; MapWindowPoints( hWnd, GetParent(hWnd ), &p, 1 );
          SendMessage( GetParent(hWnd), uMsg, wParam,
                       (LPARAM)MAKELONG( p.x, p.y ) );
          DestroyWindow( hWnd );
          return 0L;
        }
      break;

    case WM_LBUTTONUP:
      break;

    case WM_KEYDOWN:
      if ( (int)wParam == 27 ) // escape key
        {
          //SetTrackWndText( hWnd );
	  bInEditTrack = FALSE;
          DestroyWindow( hWnd );
          return 0L;
        }
      break;

    case WM_CAPTURECHANGED:
      break;
    }

  return CallWindowProc( lpfnWndProc, hWnd, uMsg, wParam, lParam );
}


void SetTrackWndText( HWND hWnd )
{
  char buf[MAX_PATH+1];

  ZeroMemory( buf, MAX_PATH+1 );
  SendMessage( hWnd, WM_GETTEXT, MAX_PATH+1, (LPARAM)buf );
  SendMessage( GetParent( hWnd ), WM_SETSELTEXT, 0, (LPARAM)buf );
}


LRESULT CALLBACK FooWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  return DefWindowProc( hWnd, uMsg, wParam, lParam );
}


LRESULT numChecked( LPTRACKWNDEXTRA lpe )
{
  int i;
  LRESULT retVal = 0;

  for( i = 0; lpe && (i < lpe->iNum); i++ )
    if ( lpe->tracks[i].bChecked )
      retVal++;

  return retVal;
}

⌨️ 快捷键说明

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