📄 scrollview.c
字号:
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 + -