⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scrolled.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -