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

📄 scrollview.c

📁 有了操作系统、TCP/IP协议栈、文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
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);}/* -------------------------------------------------------------------------- */void scrollview_draw (HWND hWnd, HDC hdc, PSVDATA psvdata){    list_t *me;    PSVITEMDATA pci;    RECT rcDraw;    int h = 0;    RECT rcVis;    PSVLIST psvlist = &psvdata->svlist;    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;    }}/* 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);        scrollview_draw (hWnd, hdc, psvdata);        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 + -