📄 ebtrackbar.c
字号:
if (dwStyle & ETBS_VERTICAL) {
TickStart = y + LfRtBlankWidth;
TickGap = (h - (LfRtBlankWidth<<1)) / (float)(max - min) * TickFreq;
TickEnd = y + h - LfRtBlankWidth;
for (Tick = TickStart; Tick < TickEnd; Tick += TickGap) {
MoveTo (hdc, x + (w>>1) + (sliderw>>1) + TickSliderGap, (int) Tick);
LineTo (hdc, x + (w>>1) + (sliderw>>1) + TickSliderGap + TickLength, (int) Tick);
}
MoveTo (hdc, x + (w>>1) + (sliderw>>1) + TickSliderGap, TickEnd);
LineTo (hdc, x + (w>>1) + (sliderw>>1) + TickSliderGap + TickLength, TickEnd);
} else {
TickStart = x + LfRtBlankWidth;
TickGap = (w - (LfRtBlankWidth<<1)) / (float)(max - min) * TickFreq;
TickEnd = x + w - LfRtBlankWidth;
for (Tick = TickStart; Tick < TickEnd; Tick += TickGap) {
MoveTo (hdc, (int)Tick, y + (h>>1) + (sliderh>>1) + TickSliderGap);
LineTo (hdc, (int)Tick, y + (h>>1) + (sliderh>>1) + TickSliderGap + TickLength);
}
MoveTo (hdc, TickEnd, y + (h>>1) + (sliderh>>1) + TickSliderGap);
LineTo (hdc, TickEnd, y + (h>>1) + (sliderh>>1) + TickSliderGap + TickLength);
}
}
//画出焦点框; draw the focus frame.
if (pData->state & ETBS_FOCUS) {
SetPenColor (hdc, PIXEL_lightwhite);
FocusRect (hdc, x + 1, y + 1, x + w - 1, y + h - 1);
}
}
static void EBTrackBarNormalizeParams (const HWND pCtrl,
EBTRACKBARDATA* pData, BOOL fNotify)
{
int id = GetDlgCtrlID (pCtrl);
if (pData->nPos >= pData->nMax) {
if (fNotify) {
NotifyParent ((HWND)pCtrl, id, ETBN_CHANGE);
NotifyParent ((HWND)pCtrl, id, ETBN_REACHMAX);
}
pData->nPos = pData->nMax;
return;
}
if (pData->nPos <= pData->nMin) {
if (fNotify) {
NotifyParent ((HWND)pCtrl, id, ETBN_CHANGE);
NotifyParent ((HWND)pCtrl, id, ETBN_REACHMIN);
}
pData->nPos = pData->nMin;
return;
}
if (pData->nPos < pData->nMax && pData->nPos > pData->nMin) {
if (fNotify)
NotifyParent ((HWND)pCtrl, id, ETBN_CHANGE);
return;
}
}
static int EBTrackBarCtrlProc (HWND hwnd, int message, WPARAM wParam, LPARAM lParam)
{
PEBTRACKBARDATA pData =(PEBTRACKBARDATA)GetWindowAdditionalData2 (hwnd);
int id = GetDlgCtrlID (hwnd);
DWORD dwStyle = GetWindowStyle (hwnd);
switch (message)
{
case MSG_CREATE:
{
if (!(pData = malloc (sizeof (EBTRACKBARDATA)))) {
fprintf(stderr, "Create trackbar control failure!\n");
return -1;
}
pData->state = 0;
pData->nMax = 10;
pData->nMin = 0;
pData->nPos = 3;
pData->nLineSize = 1;
pData->nPageSize = 5;
pData->nTbBorder = 2;
pData->nSliderImage = 0;
strncpy (pData->sStartTip, "Start", TipLen - 1);
pData->sStartTip[TipLen - 1] = '\0';
strncpy (pData->sEndTip, "End", TipLen - 1);
pData->sEndTip[TipLen - 1] = '\0';
pData->nTickFreq = 1;
pData->nFgndColor = PIXEL_black;
pData->nImage = GetWindowAdditionalData (hwnd);
if(pData->nImage)
{
switch(dwStyle & ETBS_IDTNTYPE)
{
case ETBS_IDTNBITMAP:
{
pData->nSliderImage = (DWORD)(((PBITMAP*)(pData->nImage))[0]);
}
break;
case ETBS_IDTNBMPFILE:
{
PBITMAP pbmp;
char bmpfile[MAX_PATH+1];
char * pbmpfile;
pbmpfile = &bmpfile[0];
if(pbmp = malloc (sizeof (BITMAP)))
{
memset(pbmp,0,sizeof(BITMAP));
PrefixFileName((const char *)(pData->nImage),"pt",pbmpfile,MAX_PATH);
if(!LoadBitmap( HDC_SCREEN, pbmp, pbmpfile))
{
pData->nSliderImage = (DWORD)pbmp;
}
else
{
free((void *)(pbmp));
}
}
}
}
}
SetWindowAdditionalData2 (hwnd, (DWORD)pData);
}
break;
case MSG_DESTROY:
{
if(pData)
free((void *)(pData));
}
break;
case MSG_NCPAINT:
return 0;
case MSG_GETDLGCODE:
return DLGC_STATIC;
case MSG_GETTEXTLENGTH:
case MSG_GETTEXT:
case MSG_SETTEXT:
return -1;
case ETBM_SETFGNDCOLOR:
{
}
break;
case ETBM_GETFGNDCOLOR:
{
}
break;
case ETBM_SETTBBORDER:
{
}
break;
case ETBM_GETTBBORDER:
{
}
break;
case MSG_PAINT:
{
RECT rcClient;
HDC hdc, mem_dc;
GetClientRect (hwnd, &rcClient);
hdc = BeginPaint (hwnd);
mem_dc = CreateCompatibleDC (hdc);
EBTrackBarOnDraw (hwnd, mem_dc, (EBTRACKBARDATA *)pData, dwStyle);
BitBlt (mem_dc, 0, 0, rcClient.right, rcClient.bottom, hdc, 0, 0, 0);
DeleteCompatibleDC (mem_dc);
EndPaint (hwnd, hdc);
}
break;
case ETBM_SETRANGE:
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, ETBM_SETPOS, pData->nPos, 0);
break;
case ETBM_GETMIN:
return pData->nMin;
case ETBM_GETMAX:
return pData->nMax;
case ETBM_SETMIN:
if (wParam > pData->nMax)
pData->nMin = pData->nMax;
pData->nMin = wParam;
if (pData->nPos < pData->nMin)
pData->nPos = pData->nMin;
SendMessage (hwnd, ETBM_SETPOS, pData->nPos, 0);
break;
case ETBM_SETMAX:
if (wParam < pData->nMin)
pData->nMax = pData->nMin;
pData->nMax = wParam;
if (pData->nPos > pData->nMax)
pData->nPos = pData->nMax;
SendMessage (hwnd, ETBM_SETPOS, pData->nPos, 0);
break;
case ETBM_SETLINESIZE:
pData->nLineSize = wParam;
break;
case ETBM_GETLINESIZE:
return pData->nLineSize;
case ETBM_SETPAGESIZE:
pData->nPageSize = wParam;
break;
case ETBM_GETPAGESIZE:
return pData->nPageSize;
case ETBM_SETPOS:
if (pData->nPos == wParam)
break;
pData->nPos = wParam;
EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);
InvalidateRect (hwnd, NULL, FALSE);
break;
case ETBM_GETPOS:
return pData->nPos;
break;
case ETBM_SETTICKFREQ:
if (wParam > (pData->nMax - pData->nMin))
break;
pData->nTickFreq = wParam;
InvalidateRect (hwnd, NULL, FALSE);
break;
case ETBM_GETTICKFREQ:
return pData->nTickFreq;
break;
case ETBM_SETSTARTTIP:
if ( wParam != 0 )
strncpy(pData->sStartTip, (char *) wParam, TipLen - 1);
InvalidateRect (hwnd, NULL, FALSE);
break;
case ETBM_SETENDTIP:
if ( lParam != 0 )
strncpy (pData->sEndTip, (char *) wParam, TipLen - 1);
InvalidateRect (hwnd, NULL, FALSE);
break;
case ETBM_GETTIP:
if ( wParam != 0)
strcpy ((char *) wParam, pData->sStartTip);
if ( lParam != 0)
strcpy ((char *) lParam, pData->sEndTip);
break;
case MSG_SETFOCUS:
if (pData->state & ETBS_FOCUS)
break;
pData->state |= ETBS_FOCUS;
InvalidateRect (hwnd, NULL, FALSE);
break;
case MSG_KILLFOCUS:
pData->state &= ~ETBS_FOCUS;
InvalidateRect (hwnd, NULL, FALSE);
break;
case MSG_KEYDOWN:
switch (LOWORD (wParam)) {
case SCANCODE_CURSORBLOCKUP:
case SCANCODE_CURSORBLOCKRIGHT:
pData->nPos += pData->nLineSize;
EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);
InvalidateRect (hwnd, NULL, FALSE);
break;
case SCANCODE_CURSORBLOCKDOWN:
case SCANCODE_CURSORBLOCKLEFT:
pData->nPos -= pData->nLineSize;
EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);
InvalidateRect (hwnd, NULL, FALSE);
break;
case SCANCODE_PAGEDOWN:
pData->nPos -= pData->nPageSize;
EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);
InvalidateRect (hwnd, NULL, FALSE);
break;
case SCANCODE_PAGEUP:
pData->nPos += pData->nPageSize;
EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);
InvalidateRect (hwnd, NULL, FALSE);
break;
case SCANCODE_HOME:
pData->nPos = pData->nMin;
EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);
InvalidateRect (hwnd, NULL, FALSE);
break;
case SCANCODE_END:
pData->nPos = pData->nMax;
EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);
InvalidateRect (hwnd, NULL, FALSE);
break;
default:
return 0;
}
break;
case MSG_LBUTTONDOWN:
{
RECT rcClient;
int x, y, w, h;
int len, pos, max, min;
int mouseX, mouseY;
GetClientRect (hwnd, &rcClient);
pData->state |= ETBS_MOUSEDOWN;
pData->state &= ~ETBS_DRAGGED;
x = rcClient.left;
y = rcClient.top;
w = RECTW (rcClient);
h = RECTH (rcClient);
mouseX = LOSWORD(lParam);
mouseY = HISWORD(lParam);
if (GetCapture() != hwnd)
SetCapture (hwnd);
if (dwStyle & ETBS_VERTICAL) {
len = RECTH (rcClient) - (LfRtBlankWidth<<1);
if (mouseX < x + UpDnBlankWidth || mouseX > x + w - UpDnBlankWidth)
break;
if ( mouseY > rcClient.bottom - LfRtBlankWidth )
pos = 0;
else if (mouseX < rcClient.top + LfRtBlankWidth )
pos = len;
else
pos = y + h - LfRtBlankWidth - mouseY;
} else {
len = RECTW (rcClient) - (LfRtBlankWidth<<1);
if (mouseY < y+UpDnBlankWidth || mouseY > y+h-UpDnBlankWidth)
break;
if ( mouseX > rcClient.right - LfRtBlankWidth )
pos = len ;
else if (mouseX < rcClient.left + LfRtBlankWidth )
pos = 0;
else
pos = mouseX - x - LfRtBlankWidth ;
}
max = pData->nMax;
min = pData->nMin;
pData->nPos = (int)((max - min) * pos / (float)len + 0.5) + min;
EBTrackBarNormalizeParams (hwnd, pData, dwStyle & ETBS_NOTIFY);
InvalidateRect (hwnd, NULL, FALSE);
}
break;
case MSG_MOUSEMOVE:
{
int mouseX = LOSWORD(lParam);
int mouseY = HISWORD(lParam);
if (pData->state & ETBS_MOUSEDOWN)
pData->state |= ETBS_DRAGGED;
ScreenToClient (hwnd, &mouseX, &mouseY);
if (dwStyle & ETBS_VERTICAL)
pData->mousepos = mouseY;
else
pData->mousepos = mouseX;
InvalidateRect (hwnd, NULL, FALSE);
}
break;
case MSG_LBUTTONUP:
pData->state &= ~ETBS_MOUSEDOWN;
pData->state &= ~ETBS_DRAGGED;
if (GetCapture() == hwnd)
ReleaseCapture ();
EBTrackBarNormalizeParams (hwnd, pData, dwStyle &ETBS_NOTIFY);
InvalidateRect (hwnd, NULL, FALSE);
break;
case MSG_FONTCHANGED:
InvalidateRect (hwnd, NULL, FALSE);
return 0;
default:
break;
}
return DefaultControlProc (hwnd, message, wParam, lParam);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -