📄 trackwnd.c
字号:
{
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 + -