174 lines
4.9 KiB
C
174 lines
4.9 KiB
C
|
/*-----------------------------------------------------------------------------+
|
||
|
| TRACK.C |
|
||
|
| |
|
||
|
| Contains the code which implements the track bar |
|
||
|
| |
|
||
|
| (C) Copyright Microsoft Corporation 1991. All rights reserved. |
|
||
|
| |
|
||
|
| Revision History |
|
||
|
| Oct-1992 MikeTri Ported to WIN32 / WIN16 common code |
|
||
|
| |
|
||
|
+-----------------------------------------------------------------------------*/
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <mmsystem.h>
|
||
|
#include <windowsx.h>
|
||
|
#include "mplayer.h"
|
||
|
#include "toolbar.h"
|
||
|
#include "tracki.h"
|
||
|
|
||
|
|
||
|
WNDPROC fnTrackbarWndProc = NULL;
|
||
|
|
||
|
|
||
|
/* TB_OnKey
|
||
|
*
|
||
|
* Handles WM_KEYDOWN and WM_KEYUP messages.
|
||
|
*
|
||
|
* If the shift key is pressed while we're playing or scrolling
|
||
|
* treat it as a start selection. End the selection on the key-up
|
||
|
* message.
|
||
|
*
|
||
|
* Clear any selection if the escape key is pressed.
|
||
|
*
|
||
|
*/
|
||
|
void TB_OnKey(HWND hwnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)
|
||
|
{
|
||
|
int cmd = -1;
|
||
|
|
||
|
switch(vk)
|
||
|
{
|
||
|
case VK_SHIFT:
|
||
|
/* Check that the key wasn't already down:
|
||
|
*/
|
||
|
if (fDown && !(flags & 0x4000))
|
||
|
{
|
||
|
if(((gwStatus == MCI_MODE_PLAY) || gfScrollTrack)
|
||
|
&&(toolbarStateFromButton(ghwndMark, BTN_MARKIN, TBINDEX_MARK)
|
||
|
!= BTNST_GRAYED))
|
||
|
SendMessage(hwnd, WM_COMMAND, IDT_MARKIN, 0);
|
||
|
}
|
||
|
|
||
|
/* If !fDown, it must be fUp:
|
||
|
*/
|
||
|
else if (!fDown)
|
||
|
{
|
||
|
if (SendMessage(ghwndTrackbar, TBM_GETSELSTART, 0, 0) != -1)
|
||
|
SendMessage(hwnd, WM_COMMAND, IDT_MARKOUT, 0);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case VK_ESCAPE:
|
||
|
SendMessage(ghwndTrackbar, TBM_CLEARSEL, (WPARAM)TRUE, 0);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
if (fDown)
|
||
|
{
|
||
|
// Don't do this, because the common-control trackbar sends us
|
||
|
// WM_HSCROLL in response to this, which causes us to increment twice:
|
||
|
// FORWARD_WM_KEYDOWN(hwnd, vk, cRepeat, flags, fnTrackbarWndProc);
|
||
|
|
||
|
switch (vk)
|
||
|
{
|
||
|
case VK_HOME:
|
||
|
cmd = TB_TOP;
|
||
|
break;
|
||
|
|
||
|
case VK_END:
|
||
|
cmd = TB_BOTTOM;
|
||
|
break;
|
||
|
|
||
|
case VK_PRIOR:
|
||
|
cmd = TB_PAGEUP;
|
||
|
break;
|
||
|
|
||
|
case VK_NEXT:
|
||
|
cmd = TB_PAGEDOWN;
|
||
|
break;
|
||
|
|
||
|
case VK_LEFT:
|
||
|
case VK_UP:
|
||
|
cmd = TB_LINEUP;
|
||
|
break;
|
||
|
|
||
|
case VK_RIGHT:
|
||
|
case VK_DOWN:
|
||
|
cmd = TB_LINEDOWN;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
FORWARD_WM_KEYUP(hwnd, vk, cRepeat, flags, fnTrackbarWndProc);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (cmd != -1)
|
||
|
SendMessage(GetParent(hwnd), WM_HSCROLL, MAKELONG(cmd, 0), (LPARAM)hwnd);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/* Subclass the window so that we can handle the key presses
|
||
|
* we're interested in.
|
||
|
*/
|
||
|
|
||
|
|
||
|
/* TBWndProc() */
|
||
|
|
||
|
|
||
|
LONG_PTR FAR PASCAL
|
||
|
SubClassedTrackbarWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
switch (message)
|
||
|
{
|
||
|
HANDLE_MSG(hwnd, WM_KEYDOWN, TB_OnKey);
|
||
|
HANDLE_MSG(hwnd, WM_KEYUP, TB_OnKey);
|
||
|
|
||
|
/* HACK ALERT
|
||
|
*
|
||
|
* This is to get around a bug in the Chicago common control trackbar,
|
||
|
* which is sending too many TB_ENDTRACK notifications.
|
||
|
* It sends one when it receives WM_CAPTURECHANGED, even if it called
|
||
|
* ReleaseCapture itself.
|
||
|
* So, if we're not currently scrolling, ignore it.
|
||
|
*/
|
||
|
case WM_CAPTURECHANGED:
|
||
|
if (!gfScrollTrack)
|
||
|
return 0;
|
||
|
|
||
|
case TBM_SHOWTICS:
|
||
|
/* If we're hiding the ticks, we want a chiseled thumb,
|
||
|
* so make it TBS_BOTH as well as TBS_NOTICKS.
|
||
|
*/
|
||
|
if (wParam == TRUE)
|
||
|
SetWindowLongPtr(hwnd, GWL_STYLE,
|
||
|
(GetWindowLongPtr(hwnd, GWL_STYLE) & ~(TBS_NOTICKS | TBS_BOTH)));
|
||
|
else
|
||
|
SetWindowLongPtr(hwnd, GWL_STYLE,
|
||
|
(GetWindowLongPtr(hwnd, GWL_STYLE) | TBS_NOTICKS | TBS_BOTH));
|
||
|
|
||
|
if (lParam == TRUE)
|
||
|
InvalidateRect(hwnd, NULL, TRUE);
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
return CallWindowProc(fnTrackbarWndProc, hwnd, message, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
|
||
|
void SubClassTrackbarWindow()
|
||
|
{
|
||
|
if (!fnTrackbarWndProc)
|
||
|
fnTrackbarWndProc = (WNDPROC)GetWindowLongPtr(ghwndTrackbar, GWLP_WNDPROC);
|
||
|
if (ghwndTrackbar)
|
||
|
SetWindowLongPtr(ghwndTrackbar, GWLP_WNDPROC, (LONG_PTR)SubClassedTrackbarWndProc);
|
||
|
}
|