📄 trackbar.c
字号:
SIZE text_ext;
SetTextColor (hdc, PIXEL_black);
SetBkMode (hdc, BM_TRANSPARENT);
TextOut (hdc, x + 1, y + (h>>1) - (sliderh>>1) - GAP_TIP_SLIDER,
pData->sStartTip);
GetTextExtent (hdc, pData->sEndTip, -1, &text_ext);
EndTipLen = text_ext.cx + 4;
TextOut (hdc, (EndTipLen > (w>>1) - 20 ? x + (w>>1) + 20 : x + w -EndTipLen),
y + (h>>1) - (sliderh>>1) - GAP_TIP_SLIDER, pData->sEndTip);
sprintf (sPos, "%d", pData->nPos);
GetTextExtent (hdc, sPos, -1, &text_ext);
TextOut (hdc, x + ((w - text_ext.cx) >> 1),
y + (h>>1) -(sliderh>>1) - GAP_TIP_SLIDER, sPos);
}
/* draw the focus frame. */
#ifdef _PC3D_WINDOW_STYLE
if (dwStyle & TBS_FOCUS) {
SetPenColor (hdc, PIXEL_lightwhite);
FocusRect (hdc, x, y, x + w - 1, y + h - 1);
}
#endif
}
#endif /* not _PHONE_WINDOW_STYLE */
static void TrackBarNormalizeParams (const CONTROL* pCtrl, TRACKBARDATA* pData, BOOL fNotify)
{
if (pData->nPos >= pData->nMax) {
if (fNotify) {
NotifyParent ((HWND)pCtrl, pCtrl->id, TBN_CHANGE);
NotifyParent ((HWND)pCtrl, pCtrl->id, TBN_REACHMAX);
}
pData->nPos = pData->nMax;
}
else if (pData->nPos <= pData->nMin) {
if (fNotify) {
NotifyParent ((HWND)pCtrl, pCtrl->id, TBN_CHANGE);
NotifyParent ((HWND)pCtrl, pCtrl->id, TBN_REACHMIN);
}
pData->nPos = pData->nMin;
}
else if (pData->nPos < pData->nMax && pData->nPos > pData->nMin) {
if (fNotify)
NotifyParent ((HWND)pCtrl, pCtrl->id, TBN_CHANGE);
}
}
static void SetSliderPos (const CONTROL* pCtrl, int new_pos)
{
TRACKBARDATA* pData = (TRACKBARDATA *)pCtrl->dwAddData2;
RECT rc_client, old_slider, new_slider;
if (pData->nPos == new_pos)
return;
GetClientRect ((HWND)pCtrl, &rc_client);
GetTrackbarRects (pData, pCtrl->dwStyle, &rc_client, NULL, &old_slider);
pData->nPos = new_pos;
TrackBarNormalizeParams (pCtrl, pData, pCtrl->dwStyle & TBS_NOTIFY);
GetTrackbarRects (pData, pCtrl->dwStyle, &rc_client, NULL, &new_slider);
if (pCtrl->dwStyle & TBS_TIP) {
InvalidateRect ((HWND)pCtrl, NULL, TRUE);
}
else if (!EqualRect (&old_slider, &new_slider)) {
InvalidateRect ((HWND)pCtrl, &old_slider, TRUE);
InvalidateRect ((HWND)pCtrl, &new_slider, TRUE);
}
}
static int NormalizeMousePos (HWND hwnd, TRACKBARDATA* pData, int mousepos)
{
RECT rcClient;
int w, h;
int len, pos;
GetClientRect (hwnd, &rcClient);
w = RECTW (rcClient);
h = RECTH (rcClient);
if (GetWindowStyle (hwnd) & TBS_VERTICAL) {
int blank = HEIGHT_VERT_SLIDER>>1;
len = RECTH (rcClient) - HEIGHT_VERT_SLIDER;
if (mousepos > rcClient.bottom - blank)
pos = 0;
else if (mousepos < blank)
pos = len;
else
pos = h - blank - mousepos;
} else {
int blank = WIDTH_HORZ_SLIDER>>1;
len = RECTW (rcClient) - WIDTH_HORZ_SLIDER;
if (mousepos < blank)
pos = 0;
else if (mousepos > rcClient.right - blank)
pos = len ;
else
pos = mousepos - blank;
}
return (int)((pData->nMax - pData->nMin) * pos / (float)len + 0.5) + pData->nMin;
}
static int TrackBarCtrlProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)
{
PCONTROL pCtrl;
TRACKBARDATA* pData;
pCtrl = Control (hwnd);
switch (message)
{
case MSG_CREATE:
if (!(pData = malloc (sizeof (TRACKBARDATA)))) {
fprintf(stderr, "Create trackbar control failure!\n");
return -1;
}
pData->nMax = 10;
pData->nMin = 0;
pData->nPos = 0;
pData->nLineSize = 1;
pData->nPageSize = 5;
strcpy (pData->sStartTip, "Start");
strcpy (pData->sEndTip, "End");
pData->nTickFreq = 1;
pCtrl->dwAddData2 = (DWORD)pData;
break;
case MSG_DESTROY:
free((void *)(pCtrl->dwAddData2));
break;
case MSG_NCPAINT:
return 0;
case MSG_GETTEXTLENGTH:
case MSG_GETTEXT:
case MSG_SETTEXT:
return -1;
case MSG_PAINT:
{
HDC hdc;
hdc = BeginPaint (hwnd);
TrackBarOnDraw (hwnd, hdc, (TRACKBARDATA *)pCtrl->dwAddData2, pCtrl->dwStyle);
EndPaint (hwnd, hdc);
return 0;
}
case TBM_SETRANGE:
{
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
if (wParam == lParam)
return -1;
pData->nMin = MIN (wParam, lParam);
pData->nMax = MAX (wParam, lParam);
if (pData->nPos > pData->nMax)
pData->nPos = pData->nMax;
if (pData->nPos < pData->nMin)
pData->nPos = pData->nMin;
SendMessage (hwnd, TBM_SETPOS, pData->nPos, 0);
return 0;
}
case TBM_GETMIN:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
return pData->nMin;
case TBM_GETMAX:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
return pData->nMax;
case TBM_SETMIN:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
if (wParam == pData->nMin || wParam >= pData->nMax)
return -1;
pData->nMin = wParam;
if (pData->nPos < pData->nMin)
pData->nPos = pData->nMin;
SendMessage (hwnd, TBM_SETPOS, pData->nPos, 0);
return 0;
case TBM_SETMAX:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
if (wParam == pData->nMax || wParam <= pData->nMin)
return -1;
pData->nMax = wParam;
if (pData->nPos > pData->nMax)
pData->nPos = pData->nMax;
SendMessage (hwnd, TBM_SETPOS, pData->nPos, 0);
return 0;
case TBM_SETLINESIZE:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
if (wParam > (pData->nMax - pData->nMin))
return -1;
pData->nLineSize = wParam;
return 0;
case TBM_GETLINESIZE:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
return pData->nLineSize;
case TBM_SETPAGESIZE:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
if (wParam > (pData->nMax - pData->nMin))
return -1;
pData->nPageSize = wParam;
return 0;
case TBM_GETPAGESIZE:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
return pData->nPageSize;
case TBM_SETPOS:
SetSliderPos (pCtrl, wParam);
return 0;
case TBM_GETPOS:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
return pData->nPos;
case TBM_SETTICKFREQ:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
if (wParam > (pData->nMax - pData->nMin))
return -1;
pData->nTickFreq = wParam;
InvalidateRect (hwnd, NULL, TRUE);
return 0;
case TBM_GETTICKFREQ:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
return pData->nTickFreq;
case TBM_SETTIP:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
if (wParam)
strncpy(pData->sStartTip, (char *) wParam, TBLEN_TIP);
if (lParam)
strncpy (pData->sEndTip, (char *) lParam, TBLEN_TIP);
InvalidateRect (hwnd, NULL, TRUE);
return 0;
case TBM_GETTIP:
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
if (wParam)
strcpy ((char *) wParam, pData->sStartTip);
if (lParam)
strcpy ((char *) lParam, pData->sEndTip);
return 0;
#ifdef _PC3D_WINDOW_STYLE
case MSG_SETFOCUS:
if (pCtrl->dwStyle & TBS_FOCUS)
break;
pCtrl->dwStyle |= TBS_FOCUS;
InvalidateRect (hwnd, NULL, TRUE);
break;
case MSG_KILLFOCUS:
pCtrl->dwStyle &= ~TBS_FOCUS;
InvalidateRect (hwnd, NULL, TRUE);
break;
#endif
case MSG_GETDLGCODE:
return DLGC_WANTARROWS;
case MSG_KEYDOWN:
printf ("TrackBar: %d\n", wParam);
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
switch (LOWORD (wParam)) {
case SCANCODE_CURSORBLOCKUP:
case SCANCODE_CURSORBLOCKRIGHT:
SetSliderPos (pCtrl, pData->nPos + pData->nLineSize);
break;
case SCANCODE_CURSORBLOCKDOWN:
case SCANCODE_CURSORBLOCKLEFT:
SetSliderPos (pCtrl, pData->nPos - pData->nLineSize);
break;
case SCANCODE_PAGEDOWN:
SetSliderPos (pCtrl, pData->nPos - pData->nPageSize);
break;
case SCANCODE_PAGEUP:
SetSliderPos (pCtrl, pData->nPos + pData->nPageSize);
break;
case SCANCODE_HOME:
pData->nPos = pData->nMin;
TrackBarNormalizeParams (pCtrl, pData, pCtrl->dwStyle & TBS_NOTIFY);
InvalidateRect (hwnd, NULL, TRUE);
break;
case SCANCODE_END:
pData->nPos = pData->nMax;
TrackBarNormalizeParams (pCtrl, pData, pCtrl->dwStyle & TBS_NOTIFY);
InvalidateRect (hwnd, NULL, TRUE);
break;
}
break;
case MSG_LBUTTONDOWN:
if (GetCapture() != hwnd) {
int mouseX = LOSWORD(lParam);
int mouseY = HISWORD(lParam);
SetCapture (hwnd);
NotifyParent ((HWND)pCtrl, pCtrl->id, TBN_STARTDRAG);
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
SetSliderPos (pCtrl, NormalizeMousePos (hwnd, pData,
(pCtrl->dwStyle & TBS_VERTICAL)?mouseY:mouseX));
}
break;
case MSG_MOUSEMOVE:
{
int mouseX = LOSWORD(lParam);
int mouseY = HISWORD(lParam);
if (GetCapture() == hwnd)
ScreenToClient (hwnd, &mouseX, &mouseY);
else
break;
pData = (TRACKBARDATA *)pCtrl->dwAddData2;
SetSliderPos (pCtrl, NormalizeMousePos (hwnd, pData,
(pCtrl->dwStyle & TBS_VERTICAL)?mouseY:mouseX));
}
break;
case MSG_LBUTTONUP:
if (GetCapture() == hwnd) {
ReleaseCapture ();
NotifyParent ((HWND)pCtrl, pCtrl->id, TBN_STOPDRAG);
}
break;
case MSG_FONTCHANGED:
InvalidateRect (hwnd, NULL, TRUE);
return 0;
default:
break;
}
return DefaultControlProc (hwnd, message, wParam, lParam);
}
#endif /* _CTRL_TRACKBAR */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -