📄 scrolbar.c
字号:
pScrolbar->Value -= vo;
} else if (pScrolbar->Status & CTRL_SCROLLBAR_RIGHT_DOWN) {
if (pScrolbar->Value < pScrolbar->Max)
pScrolbar->Value += vo;
} else {
return;
}
if (pScrolbar->Value < 0) pScrolbar->Value = 0;
if (pScrolbar->Value > pScrolbar->Max) pScrolbar->Value = pScrolbar->Max;
scrollOff -= pScrolbar->Value;
if (scrollOff != 0) {
RECT r;
if (pScrolbar->pOnScroll != NULL) {
(*(pScrolbar->pOnScroll))(pScrolbar->pView, scrollOff);
}
GetScrolbarTrackRect(pScrolbar, &r);
UpdateViewRect(pScrolbar->pView, &r);
}
}
static CBOOL _cdecl_ ScrollbarViewProc(VMSG *pMsg)
{
SCROLLBAR *pScrolbar = OBJ_FROM_VIEW(pMsg->pView);
int xSize, x;
long val;
MOUSE_INF mi;
KEY_INF ki;
RECT r, r0, r1;
xSize = GetScrollSize(pScrolbar);
x = GetScrolbarPos(pScrolbar);
switch (pMsg->MsgID) {
case TIMERM_OUT:
if (pScrolbar->Status & (CTRL_FOCUSSED)) {
WINDOW *pWin = GetParentWin(pMsg->pView);
if (pWin != NULL) InformView(pWin->pClientView, pMsg);
}
pScrolbar->Timer ++;
if (pScrolbar->Timer >= CTRL_SCROLLBAR_TIME) {
pScrolbar->Timer = 0;
ScrollbarBtn(pScrolbar);
}
return (true);
case VMSG_GETFOCUS:
if ((pScrolbar->Status & (CTRL_FOCUSSED)) == 0) {
WINDOW *pWin = GetParentWin(pMsg->pView);
if ((pWin->Status & WIN_FOCUSSED) == 0) {
VMSG msg;
msg.pView = pWin->pMainView;
msg.MsgID = VMSG_GETFOCUS;
SendViewMsg(msg.pView, &msg);
}
pScrolbar->Status |= CTRL_FOCUSSED;
}
return (true);
case VMSG_LOSTFOCUS:
pScrolbar->Status &= ~(CTRL_FOCUSSED|CTRL_MOUSE_CATCH); return (true);
case MSM_LB_DOWN:
if ((pScrolbar->Status & CTRL_FOCUSSED)) {
pScrolbar->Status |= CTRL_MOUSE_ENTER;
GetScrolbarR(pScrolbar, &r);
GetScrolbarR0(pScrolbar, &r0);
GetScrolbarR1(pScrolbar, &r1);
if (IsInRect(pMsg->pt.x, pMsg->pt.y, &r) == true) {
pScrolbar->Status |= CTRL_MOUSE_CATCH;
pScrolbar->Status |= CTRL_CATCH_MOVE;
pScrolbar->ptCatch.x = pMsg->pt.x-r.left;
pScrolbar->ptCatch.y = pMsg->pt.y-r.top;
/* UpdateViewRect(pMsg->pView, &r); */
} else if (IsInRect(pMsg->pt.x, pMsg->pt.y, &r0) == true) {
pScrolbar->Status |= CTRL_MOUSE_CATCH;
pScrolbar->Status |= CTRL_SCROLLBAR_LEFT_UP;
ScrollbarBtn(pScrolbar);
UpdateViewRect(pMsg->pView, &r0);
} else if (IsInRect(pMsg->pt.x, pMsg->pt.y, &r1) == true) {
pScrolbar->Status |= CTRL_MOUSE_CATCH;
pScrolbar->Status |= CTRL_SCROLLBAR_RIGHT_DOWN;
ScrollbarBtn(pScrolbar);
UpdateViewRect(pMsg->pView, &r1);
}
}
return (true);
case MSM_LB_UP:
pScrolbar->Status &= ~(CTRL_MOUSE_CATCH|CTRL_CATCH_MOVE);
if (pScrolbar->Status & (CTRL_SCROLLBAR_LEFT_UP|CTRL_SCROLLBAR_RIGHT_DOWN)) {
pScrolbar->Status &= ~(CTRL_SCROLLBAR_LEFT_UP|CTRL_SCROLLBAR_RIGHT_DOWN);
UpdateView(pMsg->pView);
}
if (pScrolbar->Status & (CTRL_FOCUSSED)) {
VMSG msg;
msg.MsgID = WINM_SCROLL;
InformView(pScrolbar->pView->pParent, &msg);
}
return (true);
case MSM_MS_ENTER:
SetMouseCursor(ARROW);
pScrolbar->Status |= CTRL_MOUSE_ENTER;
return (true);
case MSM_MS_LEAVE:
pScrolbar->Status &= ~(CTRL_MOUSE_ENTER);
if (pScrolbar->Status & (CTRL_SCROLLBAR_LEFT_UP|CTRL_SCROLLBAR_RIGHT_DOWN)) {
pScrolbar->Status &= ~(CTRL_SCROLLBAR_LEFT_UP|CTRL_SCROLLBAR_RIGHT_DOWN);
UpdateView(pMsg->pView);
}
return (true);
case MSM_MS_MOVE:
mi.raw = pMsg->vParam;
if ((pScrolbar->Status & CTRL_MOUSE_CATCH) && (mi.inf.lbtn != 0)) {
if (xSize <= 0) return (true);
if (pScrolbar->Status & CTRL_CATCH_MOVE) {
int dx, dy, scrollOff;
GetScrolbarR(pScrolbar, &r);
dx = pMsg->pt.x - pScrolbar->ptCatch.x-r.left;
dy = pMsg->pt.y - pScrolbar->ptCatch.y-r.top;
if (pScrolbar->Align & CTRL_ALIGN_VCENTER) x += dy;
else x += dx;
if (x < 0) x = 0;
else if (x > xSize) x = xSize;
val = x;
val = (val*(pScrolbar->Max)+((xSize+1)>>1));
val /= xSize;
if (val < 0) val = 0;
if (val > pScrolbar->Max) val = pScrolbar->Max;
scrollOff = pScrolbar->Value-((int)val);
if (scrollOff != 0) {
pScrolbar->Value = (int)val;
if (pScrolbar->pOnScroll != NULL) {
(*(pScrolbar->pOnScroll))(pScrolbar->pView, scrollOff);
}
GetScrolbarTrackRect(pScrolbar, &r);
UpdateViewRect(pMsg->pView, &r);
}
} else {
GetScrolbarR0(pScrolbar, &r0);
GetScrolbarR1(pScrolbar, &r1);
if (IsInRect(pMsg->pt.x, pMsg->pt.y, &r0) == true) {
pScrolbar->Status |= CTRL_SCROLLBAR_LEFT_UP;
UpdateViewRect(pMsg->pView, &r0);
} else {
pScrolbar->Status &= ~CTRL_SCROLLBAR_LEFT_UP;
UpdateViewRect(pMsg->pView, &r0);
}
if (IsInRect(pMsg->pt.x, pMsg->pt.y, &r1) == true) {
pScrolbar->Status |= CTRL_SCROLLBAR_RIGHT_DOWN;
UpdateViewRect(pMsg->pView, &r1);
} else {
pScrolbar->Status &= ~CTRL_SCROLLBAR_RIGHT_DOWN;
UpdateViewRect(pMsg->pView, &r1);
}
}
}
return (true);
case KEYM_KEY_DOWN:
ki.raw = pMsg->vParam;
switch (ki.inf.scan) {
case SCANCODE_CURSORBLOCKLEFT:
case SCANCODE_CURSORLEFT:
if (pScrolbar->Align & CTRL_ALIGN_HCENTER) {
pScrolbar->Status |= CTRL_SCROLLBAR_LEFT_UP;
ScrollbarBtn(pScrolbar);
}
return (true);
case SCANCODE_CURSORBLOCKUP:
case SCANCODE_CURSORUP:
if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
pScrolbar->Status |= CTRL_SCROLLBAR_LEFT_UP;
ScrollbarBtn(pScrolbar);
}
return (true);
case SCANCODE_CURSORBLOCKRIGHT:
case SCANCODE_CURSORRIGHT:
if (pScrolbar->Align & CTRL_ALIGN_HCENTER) {
pScrolbar->Status |= CTRL_SCROLLBAR_RIGHT_DOWN;
ScrollbarBtn(pScrolbar);
}
return (true);
case SCANCODE_CURSORBLOCKDOWN:
case SCANCODE_CURSORDOWN:
if (pScrolbar->Align & CTRL_ALIGN_VCENTER) {
pScrolbar->Status |= CTRL_SCROLLBAR_RIGHT_DOWN;
ScrollbarBtn(pScrolbar);
}
return (true);
default:
InformView(pScrolbar->pView->pParent, pMsg);
return (true);
}
case KEYM_KEY_UP:
pScrolbar->Status &= ~(CTRL_SCROLLBAR_LEFT_UP|CTRL_SCROLLBAR_RIGHT_DOWN);
UpdateView(pMsg->pView);
return (true);
default:
return CtrlViewProc(pMsg, ScrolbarPaint, &(pScrolbar->Status));
}
}
SCROLLBAR* CreateScrollbar(VIEW* pParent, PSCROLL pOnScroll, CWORD Style)
{
VIEW *pView;
SCROLLBAR *pScrolbar;
if (pParent == NULL)
return (NULL);
pView = CreateControl(0, 0, BOX_W, BOX_H, pParent, (VS_MOVABLE|VS_RESIZABLE),
ScrollbarViewProc, sizeof(SCROLLBAR));
if (pView == NULL) return (NULL);
pScrolbar = OBJ_FROM_VIEW(pView);
pScrolbar->pView = pView;
pScrolbar->ObjColor = ScrollbarColor;
pScrolbar->pOnScroll = pOnScroll;
pScrolbar->ptCatch.x = 0; pScrolbar->ptCatch.y = 0;
pScrolbar->Status = 0;
if (Style & CTRL_ALIGN_VCENTER)
pScrolbar->Align = CTRL_ALIGN_VCENTER;
else
pScrolbar->Align = CTRL_ALIGN_HCENTER;
pScrolbar->Value = 0;
pScrolbar->Page = 1;
pScrolbar->Max = 1;
pScrolbar->sliderSize = 0;
pScrolbar->btnSize = 0;
pScrolbar->Timer = 0;
return (pScrolbar);
}
void DeleteScrollbar(SCROLLBAR *pScrolbar)
{
if (pScrolbar == NULL) return;
DeleteView(pScrolbar->pView);
}
/*
*******************************************************************************
* *
*******************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -