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