📄 scrolled.c
字号:
svVScroll (vscroll, newpos);
}
int scrolled_set_cont_width (HWND hWnd, PSCRDATA pscrdata, int cont_w)
{
int oldval = pscrdata->nContWidth;
if (cont_w < 0)
return 0;
pscrdata->nContWidth = cont_w < pscrdata->visibleWidth ? pscrdata->visibleWidth : cont_w;
if (pscrdata->nContWidth == oldval)
return 0;
if (pscrdata->nContX > pscrdata->nContWidth - pscrdata->visibleWidth)
pscrdata->nContX = pscrdata->nContWidth - pscrdata->visibleWidth;
scrolled_set_hscrollinfo (hWnd, pscrdata);
//move content
scrolled_set_content (hWnd, pscrdata, FALSE);
return pscrdata->nContWidth;
}
int scrolled_set_cont_height (HWND hWnd, PSCRDATA pscrdata, int cont_h)
{
int oldval = pscrdata->nContHeight;
if (cont_h < 0)
return 0;
pscrdata->nContHeight = cont_h < pscrdata->visibleHeight ? pscrdata->visibleHeight : cont_h;
if (pscrdata->nContHeight == oldval)
return 0;
if (pscrdata->nContY > pscrdata->nContHeight - pscrdata->visibleHeight)
pscrdata->nContY = pscrdata->nContHeight - pscrdata->visibleHeight;
scrolled_set_vscrollinfo (hWnd, pscrdata);
//move content
scrolled_set_content (hWnd, pscrdata, FALSE);
return pscrdata->nContHeight;
}
/*
int scrolled_SetVisibleWidth (HWND hWnd, PSCRDATA pscrdata, int vis_w)
{
int oldval = pscrdata->visibleWidth;
if (vis_w < 0)
return 0;
pscrdata->visibleWidth = vis_w < pscrdata->nContWidth ? vis_w : pscrdata->nContWidth;
if (pscrdata->visibleWidth = oldval)
return 0;
scrolled_set_hscrollinfo (hWnd, pscrdata);
return pscrdata->visibleWidth;
}
*/
void scrolled_set_scrollval (PSCRDATA pscrdata, int hval, int vval)
{
if (hval > 0)
pscrdata->hScrollVal = hval;
if (vval > 0)
pscrdata->vScrollVal = vval;
}
void scrolled_set_scrollpageval (PSCRDATA pscrdata, int hval, int vval)
{
if (hval > 0)
pscrdata->hScrollPageVal = hval;
if (vval > 0)
pscrdata->vScrollPageVal = vval;
}
void scrolled_set_margins (PSCRDATA pscrdata, RECT *rc)
{
RECT rcWnd;
if (!rc)
return;
if (rc->left >= 0)
pscrdata->leftMargin = rc->left;
if (rc->right >= 0)
pscrdata->rightMargin = rc->right;
if (rc->top >= 0)
pscrdata->topMargin = rc->top;
if (rc->bottom >= 0)
pscrdata->bottomMargin = rc->bottom;
GetClientRect (pscrdata->hSV, &rcWnd);
scrolled_recalc_areas (pscrdata->hSV, pscrdata,
RECTW(rcWnd) - pscrdata->leftMargin - pscrdata->rightMargin,
RECTH(rcWnd) - pscrdata->topMargin - pscrdata->bottomMargin);
}
void scrolled_refresh_rect (PSCRDATA pscrdata, RECT *rc)
{
RECT rcUpdate;
memcpy (&rcUpdate, rc, sizeof(RECT));
scrolled_content_to_window (pscrdata, NULL, &rcUpdate.top);
rcUpdate.bottom = rcUpdate.top + RECTHP(rc);
if (rcUpdate.right == 0) {
rcUpdate.left = 0;
scrolled_content_to_window (pscrdata, &rcUpdate.left, NULL);
rcUpdate.right = rcUpdate.left + pscrdata->visibleWidth;
/*
rcUpdate.left = pscrdata->leftMargin;
rcUpdate.right = pscrdata->leftMargin + pscrdata->visibleWidth;
*/
}
InvalidateRect ( pscrdata->hSV, &rcUpdate, TRUE);
}
void scrolled_init_contsize (HWND hWnd, PSCRDATA pscrdata)
{
pscrdata->nContX = 0;
pscrdata->nContY = 0;
pscrdata->nContWidth = pscrdata->visibleWidth;
pscrdata->nContHeight = pscrdata->visibleHeight;
}
void scrolled_init_margins (PSCRDATA pscrdata, int left, int top,
int right, int bottom)
{
pscrdata->leftMargin = left;
pscrdata->topMargin = top;
pscrdata->rightMargin = right;
pscrdata->bottomMargin = bottom;
}
/* set initial content size and viewport size */
int scrolled_init (HWND hWnd, PSCRDATA pscrdata, int w, int h)
{
RECT rcWnd;
/* new added */
pscrdata->leftMargin = 0;
pscrdata->topMargin = 0;
pscrdata->rightMargin = 0;
pscrdata->bottomMargin = 0;
pscrdata->nContX = 0;
pscrdata->nContY = 0;
if (w > 0 && h > 0) {
pscrdata->visibleWidth = w;
pscrdata->visibleHeight = h;
}
else {
GetClientRect (hWnd, &rcWnd);
pscrdata->visibleWidth = RECTW(rcWnd);
pscrdata->visibleHeight = RECTH(rcWnd);
}
pscrdata->nContWidth = pscrdata->visibleWidth;
pscrdata->nContHeight = pscrdata->visibleHeight;
pscrdata->sbPolicy = SB_POLICY_AUTOMATIC;
pscrdata->hScrollVal = HSCROLL;
pscrdata->vScrollVal = VSCROLL;
pscrdata->hScrollPageVal = pscrdata->visibleWidth;
pscrdata->vScrollPageVal = pscrdata->visibleHeight;
pscrdata->hSV = hWnd;
return 0;
}
int DefaultScrolledProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
PSCRDATA pscrdata = NULL;
if (message != MSG_CREATE)
pscrdata = (PSCRDATA) GetWindowAdditionalData2 (hWnd);
switch (message) {
case MSG_HSCROLL:
scrolled_hscroll (hWnd, pscrdata, wParam, lParam);
break;
case MSG_VSCROLL:
scrolled_vscroll (hWnd, pscrdata, wParam, lParam);
break;
/*
* three cases:
* 1. move window; 2. set content range; 3. show scrollbar
*/
case MSG_SIZECHANGED:
{
RECT *rcClient = (RECT*)lParam;
//default case : the whole client area is the visible area
//scrollwnd control is this case
//scrollview control is different
if (!pscrdata)
return 0;
//scrolled_recalc_areas (hWnd, pscrdata, RECTWP(rcClient), RECTHP(rcClient));
scrolled_recalc_areas (hWnd, pscrdata,
RECTWP(rcClient) - pscrdata->leftMargin - pscrdata->rightMargin,
RECTHP(rcClient) - pscrdata->topMargin - pscrdata->bottomMargin);
return 0;
}
case MSG_KEYDOWN:
{
if (wParam == SCANCODE_PAGEDOWN) {
SendMessage (hWnd, MSG_VSCROLL, SB_PAGEDOWN, 0);
}
else if (wParam == SCANCODE_PAGEUP)
SendMessage (hWnd, MSG_VSCROLL, SB_PAGEUP, 0);
else if (wParam == SCANCODE_CURSORBLOCKLEFT)
SendMessage (hWnd, MSG_HSCROLL, SB_PAGELEFT, 0);
else if (wParam == SCANCODE_CURSORBLOCKRIGHT)
SendMessage (hWnd, MSG_HSCROLL, SB_PAGERIGHT, 0);
break;
}
case SVM_SETCONTRANGE:
scrolled_set_cont_width (hWnd, pscrdata, wParam);
scrolled_set_cont_height (hWnd, pscrdata, lParam);
return 0;
case SVM_SETCONTWIDTH:
return scrolled_set_cont_width (hWnd, pscrdata, wParam);
case SVM_SETCONTHEIGHT:
return scrolled_set_cont_height (hWnd, pscrdata, wParam);
case SVM_GETHSCROLLVAL:
return pscrdata->hScrollVal;
case SVM_GETVSCROLLVAL:
return pscrdata->vScrollVal;
case SVM_GETHSCROLLPAGEVAL:
return pscrdata->hScrollPageVal;
case SVM_GETVSCROLLPAGEVAL:
return pscrdata->vScrollPageVal;
case SVM_SETSCROLLVAL:
{
scrolled_set_scrollval (pscrdata, wParam, lParam);
return 0;
}
case SVM_SETSCROLLPAGEVAL:
{
scrolled_set_scrollpageval (pscrdata, wParam, lParam);
return 0;
}
case SVM_SETCONTPOS:
{
scrolled_set_cont_pos (hWnd, pscrdata, wParam, lParam);
return 0;
}
/* get scrolled size information */
case SVM_GETCONTWIDTH:
return pscrdata->nContWidth;
case SVM_GETCONTHEIGHT:
return pscrdata->nContHeight;
case SVM_GETCONTENTX:
return pscrdata->nContX;
case SVM_GETCONTENTY:
return pscrdata->nContY;
case SVM_GETVISIBLEWIDTH:
return pscrdata->visibleWidth;
case SVM_GETVISIBLEHEIGHT:
return pscrdata->visibleHeight;
case SVM_GETMARGINS:
{
RECT *rc = (RECT *)lParam;
if (rc)
scrolled_get_margins (pscrdata, rc);
return 0;
}
case SVM_GETLEFTMARGIN:
return pscrdata->leftMargin;
case SVM_GETRIGHTMARGIN:
return pscrdata->rightMargin;
case SVM_GETTOPMARGIN:
return pscrdata->topMargin;
case SVM_GETBOTTOMMARGIN:
return pscrdata->bottomMargin;
case SVM_SETMARGINS:
{
RECT *rc = (RECT *)lParam;
if (rc)
scrolled_set_margins (pscrdata, rc);
return 0;
}
case SVM_MAKEPOSVISIBLE:
scrolled_make_pos_visible (hWnd, pscrdata, wParam, lParam);
return 0;
}/* end switch */
return DefaultControlProc (hWnd, message, wParam, lParam);
}
#endif /* _CTRL_SCROLLVIEW */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -