📄 trackbar.c
字号:
return 0;
}
static LRESULT
TRACKBAR_KillFocus (TRACKBAR_INFO *infoPtr, HWND hwndGetFocus)
{
TRACE("\n");
infoPtr->bFocussed = FALSE;
TRACKBAR_InvalidateAll(infoPtr);
return 0;
}
static LRESULT
TRACKBAR_LButtonDown (TRACKBAR_INFO *infoPtr, DWORD fwKeys, INT x, INT y)
{
POINT clickPoint;
clickPoint.x = x;
clickPoint.y = y;
SetFocus(infoPtr->hwndSelf);
if (PtInRect(&infoPtr->rcThumb, clickPoint)) {
infoPtr->flags |= TB_DRAG_MODE;
SetCapture (infoPtr->hwndSelf);
TRACKBAR_UpdateToolTip (infoPtr);
TRACKBAR_ActivateToolTip (infoPtr, TRUE);
TRACKBAR_InvalidateThumb(infoPtr, infoPtr->lPos);
} else {
LONG dir = TRACKBAR_GetAutoPageDirection(infoPtr, clickPoint);
if (dir == 0) return 0;
infoPtr->flags |= (dir < 0) ? TB_AUTO_PAGE_LEFT : TB_AUTO_PAGE_RIGHT;
TRACKBAR_AutoPage (infoPtr, clickPoint);
SetCapture (infoPtr->hwndSelf);
SetTimer(infoPtr->hwndSelf, TB_REFRESH_TIMER, TB_REFRESH_DELAY, 0);
}
return 0;
}
static LRESULT
TRACKBAR_LButtonUp (TRACKBAR_INFO *infoPtr, DWORD fwKeys, INT x, INT y)
{
if (infoPtr->flags & TB_DRAG_MODE) {
notify_with_scroll (infoPtr, TB_THUMBPOSITION | (infoPtr->lPos<<16));
notify_with_scroll (infoPtr, TB_ENDTRACK);
infoPtr->flags &= ~TB_DRAG_MODE;
ReleaseCapture ();
notify(infoPtr, NM_RELEASEDCAPTURE);
TRACKBAR_ActivateToolTip(infoPtr, FALSE);
TRACKBAR_InvalidateThumb(infoPtr, infoPtr->lPos);
}
if (infoPtr->flags & TB_AUTO_PAGE) {
KillTimer (infoPtr->hwndSelf, TB_REFRESH_TIMER);
infoPtr->flags &= ~TB_AUTO_PAGE;
notify_with_scroll (infoPtr, TB_ENDTRACK);
ReleaseCapture ();
notify(infoPtr, NM_RELEASEDCAPTURE);
}
return 0;
}
static LRESULT
TRACKBAR_CaptureChanged (TRACKBAR_INFO *infoPtr)
{
notify_with_scroll (infoPtr, TB_ENDTRACK);
return 0;
}
static LRESULT
TRACKBAR_Paint (TRACKBAR_INFO *infoPtr, HDC hdc)
{
if (hdc) {
TRACKBAR_Refresh(infoPtr, hdc);
} else {
PAINTSTRUCT ps;
hdc = BeginPaint (infoPtr->hwndSelf, &ps);
TRACKBAR_Refresh (infoPtr, hdc);
EndPaint (infoPtr->hwndSelf, &ps);
}
return 0;
}
static LRESULT
TRACKBAR_SetFocus (TRACKBAR_INFO *infoPtr, HWND hwndLoseFocus)
{
TRACE("\n");
infoPtr->bFocussed = TRUE;
TRACKBAR_InvalidateAll(infoPtr);
return 0;
}
static LRESULT
TRACKBAR_Size (TRACKBAR_INFO *infoPtr, DWORD fwSizeType, INT nWidth, INT nHeight)
{
TRACKBAR_InitializeThumb (infoPtr);
TRACKBAR_AlignBuddies (infoPtr);
return 0;
}
static LRESULT
TRACKBAR_Timer (TRACKBAR_INFO *infoPtr, INT wTimerID, TIMERPROC *tmrpc)
{
if (infoPtr->flags & TB_AUTO_PAGE) {
POINT pt;
if (GetCursorPos(&pt))
if (ScreenToClient(infoPtr->hwndSelf, &pt))
TRACKBAR_AutoPage(infoPtr, pt);
}
return 0;
}
/* update theme after a WM_THEMECHANGED message */
static LRESULT theme_changed (TRACKBAR_INFO* infoPtr)
{
HTHEME theme = GetWindowTheme (infoPtr->hwndSelf);
CloseThemeData (theme);
theme = OpenThemeData (infoPtr->hwndSelf, themeClass);
return 0;
}
static LRESULT
TRACKBAR_MouseMove (TRACKBAR_INFO *infoPtr, DWORD fwKeys, INT x, INT y)
{
DWORD dwStyle = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
INT clickPlace = (dwStyle & TBS_VERT) ? y : x;
LONG dragPos, oldPos = infoPtr->lPos;
TRACE("(x=%d. y=%d)\n", x, y);
if (infoPtr->flags & TB_AUTO_PAGE) {
POINT pt;
pt.x = x;
pt.y = y;
TRACKBAR_AutoPage (infoPtr, pt);
return TRUE;
}
if (!(infoPtr->flags & TB_DRAG_MODE))
{
if (GetWindowTheme (infoPtr->hwndSelf))
{
DWORD oldFlags = infoPtr->flags;
POINT pt;
pt.x = x;
pt.y = y;
if (PtInRect (&infoPtr->rcThumb, pt))
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof( tme );
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = infoPtr->hwndSelf;
TrackMouseEvent( &tme );
infoPtr->flags |= TB_THUMB_HOT;
}
else
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof( tme );
tme.dwFlags = TME_CANCEL;
tme.hwndTrack = infoPtr->hwndSelf;
TrackMouseEvent( &tme );
infoPtr->flags &= ~TB_THUMB_HOT;
}
if (oldFlags != infoPtr->flags) InvalidateRect (infoPtr->hwndSelf, &infoPtr->rcThumb, FALSE);
}
return TRUE;
}
dragPos = TRACKBAR_ConvertPlaceToPosition (infoPtr, clickPlace,
dwStyle & TBS_VERT);
if (dragPos == oldPos) return TRUE;
infoPtr->lPos = dragPos;
infoPtr->flags |= TB_THUMBPOSCHANGED;
notify_with_scroll (infoPtr, TB_THUMBTRACK | (infoPtr->lPos<<16));
TRACKBAR_InvalidateThumbMove(infoPtr, oldPos, dragPos);
UpdateWindow (infoPtr->hwndSelf);
return TRUE;
}
static BOOL
TRACKBAR_KeyDown (TRACKBAR_INFO *infoPtr, INT nVirtKey, DWORD lKeyData)
{
DWORD style = GetWindowLongW (infoPtr->hwndSelf, GWL_STYLE);
BOOL downIsLeft = style & TBS_DOWNISLEFT;
BOOL vert = style & TBS_VERT;
LONG pos = infoPtr->lPos;
TRACE("%x\n", nVirtKey);
switch (nVirtKey) {
case VK_UP:
if (!vert && downIsLeft) TRACKBAR_LineDown(infoPtr);
else TRACKBAR_LineUp(infoPtr);
break;
case VK_LEFT:
if (vert && downIsLeft) TRACKBAR_LineDown(infoPtr);
else TRACKBAR_LineUp(infoPtr);
break;
case VK_DOWN:
if (!vert && downIsLeft) TRACKBAR_LineUp(infoPtr);
else TRACKBAR_LineDown(infoPtr);
break;
case VK_RIGHT:
if (vert && downIsLeft) TRACKBAR_LineUp(infoPtr);
else TRACKBAR_LineDown(infoPtr);
break;
case VK_NEXT:
if (!vert && downIsLeft) TRACKBAR_PageUp(infoPtr);
else TRACKBAR_PageDown(infoPtr);
break;
case VK_PRIOR:
if (!vert && downIsLeft) TRACKBAR_PageDown(infoPtr);
else TRACKBAR_PageUp(infoPtr);
break;
case VK_HOME:
if (infoPtr->lPos == infoPtr->lRangeMin) return FALSE;
infoPtr->lPos = infoPtr->lRangeMin;
notify_with_scroll (infoPtr, TB_TOP);
break;
case VK_END:
if (infoPtr->lPos == infoPtr->lRangeMax) return FALSE;
infoPtr->lPos = infoPtr->lRangeMax;
notify_with_scroll (infoPtr, TB_BOTTOM);
break;
}
if (pos != infoPtr->lPos) {
infoPtr->flags |=TB_THUMBPOSCHANGED;
TRACKBAR_InvalidateThumbMove (infoPtr, pos, infoPtr->lPos);
}
return TRUE;
}
inline static BOOL
TRACKBAR_KeyUp (TRACKBAR_INFO *infoPtr, INT nVirtKey, DWORD lKeyData)
{
switch (nVirtKey) {
case VK_LEFT:
case VK_UP:
case VK_RIGHT:
case VK_DOWN:
case VK_NEXT:
case VK_PRIOR:
case VK_HOME:
case VK_END:
notify_with_scroll (infoPtr, TB_ENDTRACK);
}
return TRUE;
}
static LRESULT WINAPI
TRACKBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
TRACKBAR_INFO *infoPtr = (TRACKBAR_INFO *)GetWindowLongPtrW (hwnd, 0);
TRACE("hwnd=%p msg=%x wparam=%x lparam=%lx\n", hwnd, uMsg, wParam, lParam);
if (!infoPtr && (uMsg != WM_CREATE))
return DefWindowProcW (hwnd, uMsg, wParam, lParam);
switch (uMsg)
{
case TBM_CLEARSEL:
return TRACKBAR_ClearSel (infoPtr, (BOOL)wParam);
case TBM_CLEARTICS:
return TRACKBAR_ClearTics (infoPtr, (BOOL)wParam);
case TBM_GETBUDDY:
return (LRESULT)(wParam ? infoPtr->hwndBuddyLA : infoPtr->hwndBuddyRB);
case TBM_GETCHANNELRECT:
return TRACKBAR_GetChannelRect (infoPtr, (LPRECT)lParam);
case TBM_GETLINESIZE:
return infoPtr->lLineSize;
case TBM_GETNUMTICS:
return TRACKBAR_GetNumTics (infoPtr);
case TBM_GETPAGESIZE:
return infoPtr->lPageSize;
case TBM_GETPOS:
return infoPtr->lPos;
case TBM_GETPTICS:
return (LRESULT)infoPtr->tics;
case TBM_GETRANGEMAX:
return infoPtr->lRangeMax;
case TBM_GETRANGEMIN:
return infoPtr->lRangeMin;
case TBM_GETSELEND:
return infoPtr->lSelMax;
case TBM_GETSELSTART:
return infoPtr->lSelMin;
case TBM_GETTHUMBLENGTH:
return infoPtr->uThumbLen;
case TBM_GETTHUMBRECT:
return CopyRect((LPRECT)lParam, &infoPtr->rcThumb);
case TBM_GETTIC:
return TRACKBAR_GetTic (infoPtr, (INT)wParam);
case TBM_GETTICPOS:
return TRACKBAR_GetTicPos (infoPtr, (INT)wParam);
case TBM_GETTOOLTIPS:
return (LRESULT)infoPtr->hwndToolTip;
case TBM_GETUNICODEFORMAT:
return infoPtr->bUnicode;
case TBM_SETBUDDY:
return (LRESULT) TRACKBAR_SetBuddy(infoPtr, (BOOL)wParam, (HWND)lParam);
case TBM_SETLINESIZE:
return TRACKBAR_SetLineSize (infoPtr, (LONG)lParam);
case TBM_SETPAGESIZE:
return TRACKBAR_SetPageSize (infoPtr, (LONG)lParam);
case TBM_SETPOS:
return TRACKBAR_SetPos (infoPtr, (BOOL)wParam, (LONG)lParam);
case TBM_SETRANGE:
return TRACKBAR_SetRange (infoPtr, (BOOL)wParam, (LONG)lParam);
case TBM_SETRANGEMAX:
return TRACKBAR_SetRangeMax (infoPtr, (BOOL)wParam, (LONG)lParam);
case TBM_SETRANGEMIN:
return TRACKBAR_SetRangeMin (infoPtr, (BOOL)wParam, (LONG)lParam);
case TBM_SETSEL:
return TRACKBAR_SetSel (infoPtr, (BOOL)wParam, (LONG)lParam);
case TBM_SETSELEND:
return TRACKBAR_SetSelEnd (infoPtr, (BOOL)wParam, (LONG)lParam);
case TBM_SETSELSTART:
return TRACKBAR_SetSelStart (infoPtr, (BOOL)wParam, (LONG)lParam);
case TBM_SETTHUMBLENGTH:
return TRACKBAR_SetThumbLength (infoPtr, (UINT)wParam);
case TBM_SETTIC:
return TRACKBAR_SetTic (infoPtr, (LONG)lParam);
case TBM_SETTICFREQ:
return TRACKBAR_SetTicFreq (infoPtr, (WORD)wParam);
case TBM_SETTIPSIDE:
return TRACKBAR_SetTipSide (infoPtr, (INT)wParam);
case TBM_SETTOOLTIPS:
return TRACKBAR_SetToolTips (infoPtr, (HWND)wParam);
case TBM_SETUNICODEFORMAT:
return TRACKBAR_SetUnicodeFormat (infoPtr, (BOOL)wParam);
case WM_CAPTURECHANGED:
return TRACKBAR_CaptureChanged (infoPtr);
case WM_CREATE:
return TRACKBAR_Create (hwnd, (LPCREATESTRUCTW)lParam);
case WM_DESTROY:
return TRACKBAR_Destroy (infoPtr);
/* case WM_ENABLE: */
case WM_ERASEBKGND:
return 0;
case WM_GETDLGCODE:
return DLGC_WANTARROWS;
case WM_KEYDOWN:
return TRACKBAR_KeyDown (infoPtr, (INT)wParam, (DWORD)lParam);
case WM_KEYUP:
return TRACKBAR_KeyUp (infoPtr, (INT)wParam, (DWORD)lParam);
case WM_KILLFOCUS:
return TRACKBAR_KillFocus (infoPtr, (HWND)wParam);
case WM_LBUTTONDOWN:
return TRACKBAR_LButtonDown (infoPtr, wParam, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
case WM_LBUTTONUP:
return TRACKBAR_LButtonUp (infoPtr, wParam, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
case WM_MOUSELEAVE:
infoPtr->flags &= ~TB_THUMB_HOT;
InvalidateRect (infoPtr->hwndSelf, &infoPtr->rcThumb, FALSE);
return 0;
case WM_MOUSEMOVE:
return TRACKBAR_MouseMove (infoPtr, wParam, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
case WM_PRINTCLIENT:
case WM_PAINT:
return TRACKBAR_Paint (infoPtr, (HDC)wParam);
case WM_SETFOCUS:
return TRACKBAR_SetFocus (infoPtr, (HWND)wParam);
case WM_SIZE:
return TRACKBAR_Size (infoPtr, wParam, LOWORD(lParam), HIWORD(lParam));
case WM_THEMECHANGED:
return theme_changed (infoPtr);
case WM_TIMER:
return TRACKBAR_Timer (infoPtr, (INT)wParam, (TIMERPROC *)lParam);
case WM_WININICHANGE:
return TRACKBAR_InitializeThumb (infoPtr);
default:
if ((uMsg >= WM_USER) && (uMsg < WM_APP))
ERR("unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam, lParam);
return DefWindowProcW (hwnd, uMsg, wParam, lParam);
}
}
void TRACKBAR_Register (void)
{
WNDCLASSW wndClass;
ZeroMemory (&wndClass, sizeof(WNDCLASSW));
wndClass.style = CS_GLOBALCLASS;
wndClass.lpfnWndProc = TRACKBAR_WindowProc;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = sizeof(TRACKBAR_INFO *);
wndClass.hCursor = LoadCursorW (0, (LPWSTR)IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wndClass.lpszClassName = TRACKBAR_CLASSW;
RegisterClassW (&wndClass);
}
void TRACKBAR_Unregister (void)
{
UnregisterClassW (TRACKBAR_CLASSW, NULL);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -