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

📄 scrollview.c

📁 有了操作系统、TCP/IP协议栈、文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/*** $Id: scrollview.c,v 1.71 2005/02/05 03:36:10 snig Exp $**** scrollview.c: a scrollview control**** Copyright (C) 2004 Feynman Software.** ** Current maintainer: Zhong Shuyi (zhongsy@minigui.org).**** Create date: 2004/03/01*//*** This program is free software; you can redistribute it and/or modify** it under the terms of the GNU General Public License as published by** the Free Software Foundation; either version 2 of the License, or** (at your option) any later version.**** This program is distributed in the hope that it will be useful,** but WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the** GNU General Public License for more details.**** You should have received a copy of the GNU General Public License** along with this program; if not, write to the Free Software** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include "common.h"#include "minigui.h"#include "gdi.h"#include "window.h"#include "ctrl/ctrlhelper.h"#include "ctrl/scrollview.h"#include "cliprect.h"#include "internals.h"#include "ctrlclass.h"#ifdef _CTRL_SCROLLVIEW#include "ctrlmisc.h"#include "scrolled.h"#include "scrollview_impl.h"/* ------------------------------------ svlist --------------------------- */static PSVITEMDATA svlistItemAdd (PSVLIST psvlist, PSVITEMDATA preitem,                 PSVITEMDATA nextitem, PSVITEMINFO pii, int *idx){    PSVITEMDATA ci;    int ret;    ci = (PSVITEMDATA) malloc (sizeof(SVITEMDATA));    if (!ci)        return NULL;    if (pii) {        ci->nItemHeight = pii->nItemHeight;        ((MgItem *)ci)->addData = pii->addData;    }    else {        ci->nItemHeight = psvlist->nDefItemHeight;        ((MgItem *)ci)->addData = 0;    }    ret = mglist_add_item ( (MgList *)psvlist, (MgItem *)ci, (MgItem *)preitem,                       (MgItem *)nextitem, pii->nItem, idx );    if (ret < 0) {        free (ci);        return NULL;    }    return ci;}static int svlistItemDel (PSVLIST psvlist, PSVITEMDATA pci){    mglist_del_item ((MgList *)psvlist, (MgItem *)pci);    free (pci);    return 0;}static void svlist_reset_content (HWND hWnd, PSVLIST psvlist){    PSVITEMDATA pci;    while (!mglist_empty((MgList *)psvlist)) {        pci = (PSVITEMDATA)mglist_first_item ((MgList *)psvlist);        svlistItemDel (psvlist, pci);    }    ((MgList *)psvlist)->nTotalItemH = 0;}//FIXME, to be moved to listmodel.cstatic int isInItem (MgList *mglst, int mouseX, int mouseY,                      MgItem **pRet, int *item_y){    //PSVLIST psvlist = (PSVLIST)mglst;    int ret = 0;    PSVITEMDATA pci = NULL;    int h = 0;    list_t *me;    if (mouseY < 0 || mouseY >= mglst->nTotalItemH)        return -1;    mglist_for_each (me, mglst) {        pci = (PSVITEMDATA)mglist_entry (me);        h += pci->nItemHeight;        if (h > mouseY)            break;        ret++;    }    if (pRet)        *pRet = (MgItem *)pci;    if (item_y)        *item_y = h - pci->nItemHeight;    return ret;}int scrollview_is_in_item (PSVDATA psvdata, int mousey, HSVITEM *phsvi, int *itemy){    return isInItem ((MgList *)&psvdata->svlist, 0, mousey, (MgItem **)phsvi, itemy);}/* ---------------------------------------------------------------------------- */HSVITEM scrollview_add_item (HWND hWnd, PSVDATA psvdata, HSVITEM prehsvi, PSVITEMINFO pii, int *idx){    PSVLIST psvlist = &psvdata->svlist;    PSVITEMDATA pci;    int index;    if ( (pci =svlistItemAdd (psvlist, (PSVITEMDATA)prehsvi, NULL, pii, &index)) ) {        mglist_adjust_items_height (hWnd, (MgList *)psvlist, psvscr, pci->nItemHeight);    }    if (idx)        *idx = index;    return (HSVITEM)pci;}//FIXMEHSVITEM scrollview_add_item_ex (HWND hWnd, PSVDATA psvdata, HSVITEM prehsvi,                 HSVITEM nexthsvi, PSVITEMINFO pii, int *idx){    PSVLIST psvlist = &psvdata->svlist;    PSVITEMDATA pci;    int index;    if ( (pci =svlistItemAdd (psvlist, (PSVITEMDATA)prehsvi,                       (PSVITEMDATA)nexthsvi, pii, &index)) ) {        mglist_adjust_items_height (hWnd, (MgList *)psvlist, psvscr, pci->nItemHeight);    }    if (idx)        *idx = index;    return (HSVITEM)pci;}int scrollview_move_item (PSVDATA psvdata, HSVITEM hsvi, HSVITEM prehsvi){    PSVITEMDATA pci, preitem;    if (!hsvi)        return -1;    pci = (PSVITEMDATA)hsvi;    preitem = (PSVITEMDATA)prehsvi;    mglist_move_item ((MgList *)&psvdata->svlist, (MgItem *)pci, (MgItem *)preitem);    scrollview_refresh_content (psvdata);    return 0;}int scrollview_del_item (HWND hWnd, PSVDATA psvdata, int nItem, HSVITEM hsvi){    PSVLIST psvlist = &psvdata->svlist;    PSVITEMDATA pci;    int del_h;    if (hsvi)        pci = (PSVITEMDATA)hsvi;    else {        if ( !(pci=(PSVITEMDATA)mglist_getitem_byindex((MgList *)psvlist, nItem)) )            return -1;    }    del_h = pci->nItemHeight;    if (svlistItemDel (psvlist, pci) >= 0) {        mglist_adjust_items_height (hWnd, (MgList *)psvlist, psvscr, -del_h);    }    return 0;}DWORD scrollview_get_item_adddata (HSVITEM hsvi){    return mglist_get_item_adddata (hsvi);}   int scrollview_get_item_index (HWND hWnd, HSVITEM hsvi){    PSVDATA psvdata = (PSVDATA)GetWindowAdditionalData2(hWnd);    return mglist_get_item_index ((MgList *)&psvdata->svlist, (MgItem *)hsvi);}int scrollview_is_item_hilight (HWND hWnd, HSVITEM hsvi){    PSVDATA psvdata = (PSVDATA)GetWindowAdditionalData2(hWnd);    return (int)mglist_is_item_hilight ((MgList *)&psvdata->svlist, (MgItem *)hsvi);}int scrollview_is_item_selected (HSVITEM hsvi){    return mglist_is_item_selected ((MgItem *)hsvi);}static int svGetItemRect (PSVDATA psvdata, HSVITEM hsvi, RECT *rcItem, BOOL bConv){    PSVITEMDATA pci = (PSVITEMDATA)hsvi;    if (!rcItem || !hsvi)        return -1;    rcItem->top = scrollview_get_item_ypos (psvdata, hsvi);    if (bConv)        scrolled_content_to_window ((PSCRDATA)psvdata, NULL, &rcItem->top);    rcItem->bottom = rcItem->top + pci->nItemHeight;    //rcItem->left = psvscr->leftMargin;    rcItem->left = 0;    if (bConv)        scrolled_content_to_window ((PSCRDATA)psvdata, &rcItem->left, NULL);//FIXME    //rcItem->right = rcItem->left + psvscr->visibleWidth;    rcItem->right = rcItem->left + psvscr->nContWidth;    /* only y position is important */    return 1;}int scrollview_get_item_rect (HWND hWnd, HITEM hsvi, RECT *rcItem, BOOL bConv){    PSVDATA psvdata = (PSVDATA)GetWindowAdditionalData2(hWnd);    return svGetItemRect (psvdata, hsvi, rcItem, bConv);}int scrollview_get_item_ypos (PSVDATA psvdata, HSVITEM hsvi){    PSVLIST psvlist = &psvdata->svlist;    PSVITEMDATA ci = (PSVITEMDATA)hsvi, pci;    list_t *me;    int h = 0;    mglist_for_each (me, psvlist) {        pci = (PSVITEMDATA)mglist_entry (me);        if (pci == ci)            return h;        h += pci->nItemHeight;    }    return -1;}int scrollview_set_item_height (HWND hWnd, HSVITEM hsvi, int height){    PSVDATA psvdata = (PSVDATA)GetWindowAdditionalData2(hWnd);    PSVITEMDATA pci = (PSVITEMDATA)hsvi;    int diff;    if (!psvdata || !pci || height < 0 || height == pci->nItemHeight) return -1;    diff = height - pci->nItemHeight;    pci->nItemHeight = height;    mglist_adjust_items_height (hWnd, (MgList *)&psvdata->svlist, psvscr, diff);    return height - diff;}SVITEM_DRAWFUNC

⌨️ 快捷键说明

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