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

📄 scrollview.c

📁 在ADS环境下MiniGUI的源码
💻 C
📖 第 1 页 / 共 2 页
字号:

SVITEM_DRAWFUNC
scrollview_set_itemdraw (PSVDATA psvdata, SVITEM_DRAWFUNC draw_func)
{
    SVITEM_DRAWFUNC oldfn;

    oldfn = mglist_set_itemdraw((MgList *)&psvdata->svlist, draw_func);
    scrollview_refresh_content (psvdata);

    return oldfn;
}

void scrollview_reset_content (HWND hWnd, PSVDATA psvdata)
{
    /* delete all svlist content */
    svlist_reset_content (hsvwnd, &psvdata->svlist);

    if (psvscr->sbPolicy != SB_POLICY_ALWAYS) {
        ShowScrollBar (hWnd, SB_HORZ, FALSE);
        ShowScrollBar (hWnd, SB_VERT, FALSE);
    }

    /* reset content and viewport size */
    scrolled_init_contsize (hWnd, psvscr);
    /* reset svlist window */
    //scrollview_set_svlist (hWnd, psvscr);
    /* reset viewport window */
    scrolled_set_visible (hWnd, psvscr);

    scrolled_set_hscrollinfo (hWnd, psvscr);
    scrolled_set_vscrollinfo (hWnd, psvscr);

    //FIXME
    //scrollview_refresh_content (psvdata);
    InvalidateRect (hWnd, NULL, TRUE);
}

/* -------------------------------------------------------------------------- */

/* adjust the position and size of the svlist window */
void scrollview_set_svlist (HWND hWnd, PSCRDATA pscrdata, BOOL visChanged)
{
    PSVDATA psvdata = (PSVDATA) GetWindowAdditionalData2 (hWnd);

    if (visChanged)
        InvalidateRect (hWnd, NULL, TRUE);
    else {
        //should be ScrollWindow ?
        scrollview_refresh_content (psvdata);
    }
}

static int svlist_init (HWND hWnd, PSVLIST psvlist)
{
    mglist_init((MgList *)psvlist, hWnd);

    psvlist->nDefItemHeight = SV_DEF_ITEMHEIGHT;

    ((MgList *)psvlist)->iop.getRect = scrollview_get_item_rect;
    ((MgList *)psvlist)->iop.isInItem = isInItem;

    return 0;
}

/*
 * initialize scrollview internal structure
 */
static int svInitData (HWND hWnd, PSVDATA psvdata)
{
    RECT rcWnd;

    GetClientRect (hWnd, &rcWnd);
    scrolled_init (hWnd, psvscr, 
                    RECTW(rcWnd) - SV_LEFTMARGIN - SV_RIGHTMARGIN,
                    RECTH(rcWnd) - SV_TOPMARGIN - SV_BOTTOMMARGIN);
    scrolled_init_margins (psvscr, SV_LEFTMARGIN, SV_TOPMARGIN, 
                           SV_RIGHTMARGIN, SV_BOTTOMMARGIN);

    svlist_init (hWnd, &psvdata->svlist);

    psvscr->move_content = scrollview_set_svlist; 
    //psvdata->flags = 0;

    return 0;
}

/* 
 * shoulded be called before scrollview is used
 * hWnd: the scrolled window
 */
int scrollview_init (HWND hWnd, PSVDATA psvdata)
{
    if (!psvdata)
        return -1;

    SetWindowAdditionalData2 (hWnd, 0);
    ShowScrollBar (hWnd, SB_HORZ, FALSE);
    ShowScrollBar (hWnd, SB_VERT, FALSE);

    svInitData (hWnd, psvdata);
    SetWindowAdditionalData2 (hWnd, (DWORD) psvdata);

    /* set scrollbar status */
    scrolled_set_hscrollinfo (hWnd, psvscr);
    scrolled_set_vscrollinfo (hWnd, psvscr);

    return 0;
}

/*
 * destroy a scrollview
 */
void scrollview_destroy (PSVDATA psvdata)
{
    svlist_reset_content (hsvwnd, &psvdata->svlist);
}

/* --------------------------------------------------------------------------------- */
int ScrollViewCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
    PSVDATA psvdata = NULL;
    PSVLIST psvlist = NULL;

    if (message != MSG_CREATE) {
        psvdata = (PSVDATA) GetWindowAdditionalData2 (hWnd);
        psvlist = &psvdata->svlist;
    }

    switch (message) {

    case MSG_CREATE:
    {
        psvdata = (PSVDATA) malloc(sizeof (SVDATA));
        if (!psvdata)
            return -1;
        scrollview_init (hWnd, psvdata);
        if (GetWindowStyle(hWnd) & SVS_AUTOSORT) {
            scrollview_set_autosort (psvdata);
        }
        break;
    }

    case MSG_DESTROY:
        scrollview_destroy (psvdata);
        free (psvdata);
        break;
    
    case MSG_GETDLGCODE:
        return DLGC_WANTARROWS;

    case MSG_KEYDOWN:
    {
        HSVITEM hsvi = 0, curHilighted;

        curHilighted = (HSVITEM) mglist_get_hilighted_item((MgList *)&psvdata->svlist);

        if (wParam == SCANCODE_CURSORBLOCKDOWN) {
            hsvi = scrollview_get_next_item(psvdata, curHilighted);
            if (GetWindowStyle(hWnd) & SVS_LOOP && !hsvi) {
                hsvi = scrollview_get_next_item(psvdata, 0);
            }
        }
        else if (wParam == SCANCODE_CURSORBLOCKUP) {
            hsvi = scrollview_get_prev_item(psvdata, curHilighted);
            if (GetWindowStyle(hWnd) & SVS_LOOP && !hsvi) {
                hsvi = scrollview_get_prev_item(psvdata, 0);
            }
        }
        else if (wParam == SCANCODE_HOME) {
            hsvi = scrollview_get_next_item(psvdata, 0);
        }
        else if (wParam == SCANCODE_END) {
            hsvi = scrollview_get_prev_item(psvdata, 0);
        }

        /* skip the invisible items */
        while ( hsvi && ((PSVITEMDATA)hsvi)->nItemHeight <= 0 ) {
            hsvi = (wParam == SCANCODE_CURSORBLOCKDOWN || wParam == SCANCODE_HOME) ? 
                   scrollview_get_next_item(psvdata, hsvi) : scrollview_get_prev_item(psvdata, hsvi);
        }

        if (hsvi) {
            if (hsvi != curHilighted) {
                scrollview_hilight_item (psvdata, hsvi);
                NotifyParentEx (hWnd, GetDlgCtrlID(hWnd), SVN_SELCHANGED, (DWORD)hsvi);
            }
            scrollview_make_item_visible (psvdata, hsvi);
        }
        break;
    }

//FIXME, moved to listmode.c
    case MSG_PAINT:
    {
        HDC hdc = BeginPaint (hWnd);
        list_t *me;
        PSVITEMDATA pci;
        RECT rcDraw;
        int h = 0;
        RECT rcVis;

        rcDraw.left = 0;
        rcDraw.top = 0;
        rcDraw.right = psvscr->nContWidth;
        rcDraw.bottom = psvscr->nContHeight;

        scrolled_content_to_window (psvscr, &rcDraw.left, &rcDraw.top);
        scrolled_content_to_window (psvscr, &rcDraw.right, &rcDraw.bottom);

        scrolled_get_visible_rect (psvscr, &rcVis);
        ClipRectIntersect (hdc, &rcVis);

        mglist_for_each (me, psvlist) {
            pci = (PSVITEMDATA)mglist_entry (me);
            rcDraw.top += h;
            rcDraw.bottom = rcDraw.top + pci->nItemHeight;
            if (rcDraw.bottom < rcVis.top) {
                h = pci->nItemHeight;
                continue;
            }
            if (rcDraw.top > rcVis.bottom)
                break;
            if (((MgList *)psvlist)->iop.drawItem && pci->nItemHeight > 0) {
                ((MgList *)psvlist)->iop.drawItem (hWnd, (HSVITEM)pci, hdc, &rcDraw);
            }
            h = pci->nItemHeight;
        }

        EndPaint (hWnd, hdc);
        return 0;
    }

    case SVM_ADDITEM:
    {
        int idx;
        HSVITEM hsvi;

        hsvi = scrollview_add_item (hWnd, psvdata, 0, (PSVITEMINFO)lParam, &idx);
        if (wParam)
            *(HSVITEM *)wParam = hsvi;
        return idx;
    }

    case SVM_DELITEM:
        scrollview_del_item (hWnd, psvdata, wParam, (HSVITEM)lParam);
        return 0;

    case SVM_RESETCONTENT:
        scrollview_reset_content (hWnd, psvdata);
        return 0;

    case SVM_SETITEMHEIGHT:
    {
        int nItem = (int)wParam;
        int new_h = (int)lParam;
        HSVITEM hsvi;

        hsvi = scrollview_get_item_by_index (psvdata, nItem);
        scrollview_set_item_height (hWnd, hsvi, new_h);
        return 0;
    }


    }/* end switch */

    //return DefaultScrolledProc (hWnd, message, wParam, lParam);
    return DefaultItemViewProc (hWnd, message, wParam, lParam, 
                                psvscr, (MgList *)&psvdata->svlist);
}

BOOL RegisterScrollViewControl (void)
{
    WNDCLASS WndClass;

    WndClass.spClassName = CTRL_SCROLLVIEW;
    WndClass.dwStyle     = WS_NONE;
    WndClass.dwExStyle   = WS_EX_NONE;
    WndClass.hCursor     = GetSystemCursor (IDC_ARROW);
    WndClass.iBkColor    = GetWindowElementColor (BKC_CONTROL_DEF);
    WndClass.WinProc     = ScrollViewCtrlProc;

    return AddNewControlClass (&WndClass) == ERR_OK;
}

#endif /* _CTRL_SCROLLVIEW */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -