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

📄 listview.c

📁 libminigui-1.3.0.tar.gz。 miniGUI的库函数源代码!
💻 C
📖 第 1 页 / 共 4 页
字号:
		if (GetCapture() != hwnd)		    break;                ScreenToClient (hwnd, &mouseX, &mouseY);                p1 = plvdata->pHdrClicked;		LV_GET_HDR_RECT(p1, rc);		if (PtInRect(&rc, mouseX, mouseY)) {		    if (!(LVSTATUS(hwnd) & LVST_INHEAD)) {			LVSTATUS(hwnd) |= LVST_INHEAD;			InvalidateRect (hwnd, &rc, FALSE);		    }		}		else if (LVSTATUS(hwnd) & LVST_INHEAD) {		        rc.left -= 1;		        rc.right += 1;			LVSTATUS(hwnd) &= ~LVST_INHEAD;			InvalidateRect (hwnd, &rc, FALSE);		}	    }	    //in border dragged status	    else if (LVSTATUS(hwnd) & LVST_BDDRAG)		lvBorderDrag (hwnd, mouseX, mouseY);            break;        }        case MSG_LBUTTONDOWN:        {            int mouseX = LOSWORD (lParam);            int mouseY = HISWORD (lParam);            int nCols, nRows;            RECT rect, rcClient;            PLSTHDR p1;            PITEMDATA p2;            GetClientRect (hwnd, &rcClient);            nCols = isInListViewHead (mouseX, mouseY, &p1, plvdata);            if (nCols > 0)  // clicks on the header            {		if (GetCapture() == hwnd)		    break;		SetCapture (hwnd);		LVSTATUS(hwnd) |= LVST_HEADCLICK;		LVSTATUS(hwnd) |= LVST_INHEAD;                plvdata->pHdrClicked = p1;		SetRect (&rect, p1->x - plvdata->nOriginalX, LV_HDR_TOP, 				p1->x - plvdata->nOriginalX+ p1->width, 				LV_HDR_TOP + LV_HDR_HEIGHT);                InvalidateRect (hwnd, &rect, FALSE);            }            else            {                if ((nCols = lvInWhichHeadBorder (mouseX, mouseY, &p1, plvdata)) > 0)                {		    LVSTATUS(hwnd) |= LVST_BDDRAG;                    plvdata->nItemDraged = nCols;                    SetCapture (hwnd);                }                else if ((nRows = isInLVItem (mouseX, mouseY, &p2, plvdata)) > 0)                {            	    lvSelectItem (hwnd, nRows, plvdata);	            lvMakeItemVisible (hwnd, plvdata, nRows);                    NotifyParent (hwnd, GetDlgCtrlID(hwnd), LVN_SELCHANGE);                }            }                        break;        }        case MSG_LBUTTONUP:        {            PLSTHDR p1;	    int nCols;            int mouseX = LOSWORD (lParam);            int mouseY = HISWORD (lParam);	    if (LVSTATUS(hwnd) & LVST_HEADCLICK)            {		if (GetCapture() != hwnd)		    break;		ReleaseCapture ();		LVSTATUS(hwnd) &= ~LVST_HEADCLICK;		LVSTATUS(hwnd) &= ~LVST_INHEAD;		ScreenToClient (hwnd, &mouseX, &mouseY);                nCols = isInListViewHead (mouseX, mouseY, NULL, plvdata);		p1 = lvGetHdrByCol (plvdata, nCols);                if (p1 != plvdata->pHdrClicked)	            break;		lvToggleSortStatus(p1);		lvSortItem (NULL, nCols, p1->sort, plvdata);                plvdata->nItemSelected = sGetItemSeq (plvdata);                InvalidateRect (hwnd, NULL, FALSE);            }	    else if (LVSTATUS(hwnd) & LVST_BDDRAG)            {                ReleaseCapture ();                lstSetHScrollInfo (plvdata);		LVSTATUS(hwnd) &= ~LVST_BDDRAG;                InvalidateRect (hwnd, NULL, FALSE);            }                        break;        }	/* listview defined messages */        case LVM_COLSORT:        {	    int nCols = (int)wParam;            if (lvSortItem (NULL, nCols, LOSORTED, plvdata) == 0) {                plvdata->nItemSelected = sGetItemSeq (plvdata);                InvalidateRect (hwnd, NULL, FALSE);		return LV_OKAY;	    }	    return LV_ERR;        }	case LVM_SORTITEMS:	{	    //PLVSORTDATA sortData = (PLVSORTDATA)wParam;	    PFNLVCOMPARE pfn = (PFNLVCOMPARE)lParam;            if (lvSortItem (pfn, 0, LOSORTED, plvdata) == 0) {                plvdata->nItemSelected = sGetItemSeq (plvdata);                InvalidateRect (hwnd, NULL, FALSE);		return LV_OKAY;	    }	    return LV_ERR;	}	case LVM_SETITEMHEIGHT:	{	    int height = (int)wParam;             plvdata->nItemHeight = height;	    if (height < LV_ITEMH_DEF(hwnd))                plvdata->nItemHeight = LV_ITEMH_DEF(hwnd);            lstSetVScrollInfo (plvdata);            InvalidateRect (hwnd, NULL, FALSE);            return TRUE;	}	case LVM_SETHEADHEIGHT:	{	    int height = (int)wParam;             plvdata->nHeadHeight = height;	    if (height < LV_HDRH_DEF(hwnd))                plvdata->nHeadHeight = LV_HDRH_DEF(hwnd);            lstSetVScrollInfo (plvdata);            InvalidateRect (hwnd, NULL, FALSE);            return TRUE;	}	        case LVM_ADDITEM:        {            PLVITEM p1;	    PITEMDATA pnew;	    int index;            p1 = (PLVITEM) lParam;    	    pnew = itemNew (plvdata->nCols);	    pnew->addData = p1->itemData;            index = sAddItemToList (p1->nItem, pnew, plvdata);             lstSetVScrollInfo (plvdata);            InvalidateRect (hwnd, NULL, FALSE);	    return index;        }        case LVM_SETSUBITEMCOLOR:        {            PLVSUBITEM p1;            RECT rect;                        p1 = (PLVSUBITEM) lParam;            lvSetSubItemTextColor(p1->nItem, p1->subItem, p1->nTextColor, plvdata);     	    LV_GET_SUBITEM_RECT(p1->nItem, p1->subItem, rect);            InvalidateRect (hwnd, &rect, FALSE);	    return 0;        }        case LVM_SETSUBITEMTEXT:        {            PLVSUBITEM p1;            RECT rect;                        p1 = (PLVSUBITEM) lParam;                        if (lvFillSubItem(p1->nItem, p1->subItem, p1->pszText, plvdata) < 0)                return LV_ERR;    	    LV_GET_SUBITEM_RECT(p1->nItem, p1->subItem, rect);            InvalidateRect (hwnd, &rect, FALSE);	    return LV_OKAY;        }        case LVM_FILLSUBITEM:        case LVM_SETSUBITEM:	{            PLVSUBITEM p1;            RECT rect;                        p1 = (PLVSUBITEM) lParam;	    if ( (lvSetSubItem(p1, plvdata)) < 0 )		return LV_ERR;    	    LV_GET_SUBITEM_RECT(p1->nItem, p1->subItem, rect);            InvalidateRect (hwnd, &rect, FALSE);	    return LV_OKAY;	}	case LVM_GETITEM:	{            PLVITEM p1;	    PITEMDATA pitem;                        p1 = (PLVITEM) lParam;	    pitem = lvGetItemByRow (plvdata, p1->nItem);	    if (!pitem)		return LV_ERR;	    p1->itemData = pitem->addData;	    return LV_OKAY;	}        case LVM_GETITEMCOUNT:        {            return plvdata->nRows;        }        case LVM_GETSELECTEDITEM:        {            return plvdata->nItemSelected;        }	case LVM_GETCOLUMN:	{	    int col = (int)wParam;	    PLVCOLUMN pcol = (PLVCOLUMN)lParam;	    PLSTHDR ph = lvGetHdrByCol(plvdata, col);	    if (!ph)	        return -1;	    pcol->width = ph->width;	    strncpy (pcol->pszHeadText, ph->pTitle, pcol->nTextMax);	    pcol->pszHeadText[pcol->nTextMax] = 0;	    pcol->image = ph->Image;	    pcol->pfnCompare = ph->pfnCmp;	    pcol->colFlags = ph->flags;	}	case LVM_GETCOLUMNWIDTH:        {	    int col = (int)wParam;	    PLSTHDR ph = lvGetHdrByCol(plvdata, col);	    if (ph)                return ph->width;	    else	        return -1;        }        case LVM_GETCOLUMNCOUNT:        {            return plvdata->nCols;        }        case LVM_GETSUBITEMLEN:        {            PLVSUBITEM p1;            PSUBITEMDATA p2;            p1 = (PLVSUBITEM) lParam;            p2 = lvGetSubItem (p1->nItem, p1->subItem, plvdata);            if (p2 == NULL || p2->pszInfo == NULL)                return LV_ERR;            return strlen (p2->pszInfo);        }        case LVM_GETSUBITEMTEXT:        {            PLVSUBITEM p1;            PSUBITEMDATA p2;            p1 = (PLVSUBITEM) lParam;            p2 = lvGetSubItem (p1->nItem, p1->subItem, plvdata);            strcpy (p1->pszText, p2->pszInfo);            return 0;        }        case LVM_ADDCOLUMN:        {            PLVCOLUMN p1;            if ( !(p1 = (PLVCOLUMN)lParam) )		return LV_ERR;            if (!lvAddColumnToList (p1, plvdata))		return LV_ERR;            lstSetHScrollInfo (plvdata);            InvalidateRect (hwnd, NULL, FALSE);	    return LV_OKAY;        }        case LVM_MODIFYHEAD:        {            PLVCOLUMN p1 = (PLVCOLUMN) lParam;	    if (!p1)		return LV_ERR;            if (sModifyHeadText (p1->nCols, p1->pszHeadText, plvdata) >= 0) {                InvalidateRect (hwnd, NULL, FALSE);		return LV_OKAY;	    }	    return LV_ERR;        }	case LVM_SETCOLUMN:	{            PLVCOLUMN p1 = (PLVCOLUMN) lParam;	    PLSTHDR ph;	    if (!p1)		return LV_ERR;	    if ( !(ph = lvGetHdrByCol (plvdata, p1->nCols)) )		return LV_ERR;            sModifyHeadText (p1->nCols, p1->pszHeadText, plvdata);	    lvSetColumnWidth (p1->nCols, p1->width, plvdata);	    ph->Image = p1->image;	    ph->flags = p1->colFlags;	                InvalidateRect (hwnd, NULL, FALSE);	    return LV_OKAY;	}        case LVM_FINDITEM:        {            PLVFINDINFO p1;            p1 = (PLVFINDINFO) lParam;            return lvFindItem(p1, plvdata);        }        case LVM_DELITEM:        {            if (sRemoveItemFromList ((int)wParam, plvdata)) 		return LV_ERR;	    return LV_OKAY;        }        case LVM_DELALLITEM:        {            sRemoveAllItem (plvdata); 	    return LV_OKAY;        }	//TODO        case LVM_CLEARSUBITEM:            break;        case LVM_DELCOLUMN:        {            if (lvRemoveColumn ((int)wParam, plvdata))		return LV_ERR;	    return LV_OKAY;        }        case LVM_SELECTITEM:            lvSelectItem (hwnd, (int)wParam, plvdata);	    return 0;        case LVM_SHOWITEM:	    lvMakeItemVisible (hwnd, plvdata, (int)wParam);	    return 0;        case LVM_CHOOSEITEM:            lvSelectItem(hwnd, (int)wParam, plvdata); 	    lvMakeItemVisible (hwnd, plvdata, (int)wParam);	    return 0;	case LVM_GETITEMADDDATA:	{	    PITEMDATA pitem = lvGetItemByRow (plvdata, (int)wParam);	    if (pitem)		return pitem->addData;	    else		return LV_ERR;	}	case LVM_SETITEMADDDATA:	{	    PITEMDATA pitem = lvGetItemByRow (plvdata, (int)wParam);	    if (pitem) {		pitem->addData = (DWORD)lParam;		return LV_OKAY;	    }	    else		return LV_ERR;	}	case LVM_SETSTRCMPFUNC:            if (lParam) {                plvdata->str_cmp = (STRCMP)lParam;                return 0;            }            return -1;	break;        case MSG_VSCROLL:        {	    lvVScroll (hwnd, wParam, lParam);	    return 0;        }        case MSG_HSCROLL:        {	    lvHScroll (hwnd, wParam, lParam);	    return 0;        }        case MSG_FONTCHANGED:        {	    if (plvdata->nItemHeight < LV_ITEMH_DEF(hwnd)) {                plvdata->nItemHeight = LV_ITEMH_DEF(hwnd);	    }	    if (plvdata->nHeadHeight < LV_HDRH_DEF(hwnd)) {                plvdata->nHeadHeight = LV_HDRH_DEF(hwnd);	    }            lstSetVScrollInfo (plvdata);            InvalidateRect (hwnd, NULL, FALSE);            return 0;        }        case MSG_LBUTTONDBLCLK:        {            int mouseX = LOSWORD (lParam);            int mouseY = HISWORD (lParam);            PITEMDATA p2;            if (isInLVItem (mouseX, mouseY, &p2, plvdata) > 0)                NotifyParent (hwnd, GetDlgCtrlID(hwnd), LVN_ITEMDBCLK);                        break;        }	case MSG_RBUTTONUP:	case MSG_RBUTTONDOWN:	{            int mouseX = LOSWORD (lParam);            int mouseY = HISWORD (lParam);            int nCols, nRows;            RECT rcClient;            PLSTHDR p1;            PITEMDATA p2;	    LVNM_NORMAL lvnm;	    lvnm.wParam = wParam;	    lvnm.lParam = lParam;            GetClientRect (hwnd, &rcClient);            // clicks on the header            if ( (nCols = isInListViewHead (mouseX, mouseY, &p1, plvdata)) > 0 )	    {		if (message == MSG_RBUTTONDOWN)	            NotifyParentEx (hwnd, GetDlgCtrlID(hwnd), LVN_HEADRDOWN, 				    (DWORD)&lvnm);		else	            NotifyParentEx (hwnd, GetDlgCtrlID(hwnd), LVN_HEADRUP, 				    (DWORD)&lvnm);	    }	    // clicks on an item	    else if ( (nRows = isInLVItem (mouseX, mouseY, &p2, plvdata)) > 0) {		if (message == MSG_RBUTTONDOWN) {            	    lvSelectItem (hwnd, nRows, plvdata);	            lvMakeItemVisible (hwnd, plvdata, nRows);                    NotifyParent (hwnd, GetDlgCtrlID(hwnd), LVN_SELCHANGE);	            NotifyParentEx (hwnd, GetDlgCtrlID(hwnd), LVN_ITEMRDOWN, (DWORD)&lvnm);		}		else {	            NotifyParentEx (hwnd, GetDlgCtrlID(hwnd), LVN_ITEMRUP, (DWORD)&lvnm);		}            }	    break;	}        case MSG_KEYDOWN:        {            int id = LOWORD (wParam);	    LVNM_NORMAL lvnm;	    int nItem = 0;            switch (id)            {                case SCANCODE_CURSORBLOCKDOWN:		    nItem = plvdata->nItemSelected+1;                    break;                case SCANCODE_CURSORBLOCKUP:		    nItem = plvdata->nItemSelected-1;                    break;                case SCANCODE_HOME:		    nItem = 1;                    break;                case SCANCODE_END:		    nItem = plvdata->nRows;                    break;                case SCANCODE_CURSORBLOCKLEFT:                    break;                case SCANCODE_CURSORBLOCKRIGHT:                    break;                case SCANCODE_PAGEUP:		    SendMessage (hwnd, MSG_VSCROLL, SB_PAGEUP, 0);                    break;                case SCANCODE_PAGEDOWN:		    SendMessage (hwnd, MSG_VSCROLL, SB_PAGEDOWN, 0);                    break;            }	    if (LV_BE_VALID_ROW(nItem)) {            	lvSelectItem (hwnd, nItem, plvdata);		lvMakeItemVisible (hwnd, plvdata, nItem);	    }	    lvnm.wParam = wParam;	    lvnm.lParam = lParam;	    NotifyParentEx (hwnd, GetDlgCtrlID(hwnd), LVN_KEYDOWN, (DWORD)&lvnm);                        break;        }        case MSG_DESTROY:        {            lvDataDestory (plvdata);            break;        }    }    return DefaultControlProc (hwnd, message, wParam, lParam);}BOOL RegisterListViewControl (void){    WNDCLASS WndClass;    WndClass.spClassName = CTRL_LISTVIEW;    WndClass.dwStyle = WS_NONE;    WndClass.dwExStyle = WS_EX_NONE;    WndClass.hCursor = GetSystemCursor (0);    WndClass.iBkColor = PIXEL_lightwhite;    WndClass.WinProc = sListViewProc;    return RegisterWindowClass (&WndClass);}void ListViewControlCleanup (void){    UnregisterWindowClass (CTRL_LISTVIEW);}#endif /* _EXT_CTRL_LISTVIEW */

⌨️ 快捷键说明

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