列表控制List Control ListBase IDC_LST listbox使用方法

   与列表相关的控件有:列表控件(List Control)、水平列表控件(HorizontalList Control)、片式列表控件(TileList Control)、组合框控件(ComboBox Control)等。这些控件直接或间接地继承mx.controls.listClasses.ListBase类。

 

一、ListBase类

      一)常用的属性

            1、allowMultipleSelection:是否允许多项选择。默认为false。

            2、dataProvider:数据提供者。

            3、showDataTip:是否允许显示提示信息。

            4、dataTipField:指明在数据中哪一部分,当鼠标停留在数据项上时,显示的提示信息。

            5、dataTipFunction:指定的自定义方法返回显示的提示信息。

            6、iconField:指定哪个数据字段值决定数据条目中的图标。

            7、labelField:指定哪个数据字段作为控件中数据的标签。

            8、labelFunction:自定义控件中数据标签的内容,而不用labelField中指定的值。

            9、selectedIndex:选中条目的序号,没有选中任何条目时为-1。

            10、selectedIndices:

            11、selectedItem:选中条目的具体信息。

            12、selectedItems:

            13、variableRowHeight:是否允许每行的高度不同。

            14、wordWrap:是否允许数据换行。

            15、columnCount:表格的列数。

            16、columnWidth:列宽。

            17、rowCount:行数。

            18、rowHeight:行高。

            19、itemRenderer:条目渲染器,用于定制条目中显示的内容。

 

      二)常用的事件

            1、change:当selectedIndex、selectedItem属性值变化时触发。

            2、itemClick:单击条目时触发。

            3、itemDoubleClick:双击条目时触发。

            4、itemRolOver:当鼠标停留在条目上时触发。

 

二、列表控件(List Control)的使用

      一)常用的属性

            1、editable:是否可编辑条目中的数据。默认为false。

            2、showScrollTips:是否显示滚动条提示。

            3、scrollTipFunction:定义显示滚动条提示的内容。

            4、editedItemPosition:可编辑条目的起始位置。

 

      二)常用的事件

            1、itemEditBeginning:条目进入编辑状态时触发。

            2、itemEditEnd:条目完成编辑时触发。

            3、scroll:拖动滚动条时触发。

 

使用列表控制的步骤如下:

  1. 调用CreateWindowEx函数来创建一个列表控件,指定它的类名为SysListView32。您还可以在此处指定控件初次显示时的方式。
  2. 创建和初始化用在列表控件中显示项目的图象列表(如果存在)。
  3. 向列表控件中插入列,如果显示的方式是报告方式这一步是必须的。
  4. 向控件中插入项目和自项目。

所用到的两种数据结构:
列:

LV_COLUMN STRUCT
  imask dd ?
  fmt dd ?
  lx dd ?
  pszText dd ?
  cchTextMax dd ?
  iSubItem dd ?
  iImage dd ?
  iOrder dd ?
LV_COLUMN ENDS

Field nameMeanings
imask一组标志位标明该结构体中那些成员变量中的值有效。它的意义和上面我们提到的LV_COLUMN型结构体中向对应的成员变量基本相同。更详细的信息,可以查询WIN32 API 手册。
iItem该结构体代表的项目的索引号。索引号是从0开始编号的。该值和表单的“行”类似。
iSubItem和上一个成员变量指定的项目相连的子项目的索引号。您可以把它当作表单的“列”。譬如您想要把一个项目插入到新创建的列表视图控件,iItem的值应为0(因为该项目是第一个项目),iSubItem的值也应当为0(我们想把该项目插到第一列)。如果你想指定一个子项目和该项目相连,iItem中应该是您想要相连的项目的索引号,iSubItem的值应当是大于0的值,具体的值取决于您想把该子项目插在那一列。如果你的列表视图控件一共有4列的化,第一列包含了项目,其余3列是留给子项目的。如果您想把子项目插在第四列,应当指定该值为3。
state

该成员变量包含的标志位反应了项目的状态。状态的改变可能是由用户的操作引起的或是程序改变的。这些状态包括:是否有焦点/高亮度显示/被选中(由于被剪切)/被选中等。另外还包括,以1为基数的索引用来代表是否处使用重叠/状态图标。

stateMask由于上面的成员变量包含状态标志位、重叠的位图索引号、和状态位图的索引号,我们需要告诉WINDOWS我们到底需要设定或查询那一个值。该成员变量就是用来做这项工作的。
pszText当我们想设定项目的属性时,它包含项目名称的ASCII码的字符串的地址。当查询项目的属性时,该成员变量将用来接收查询返回的项目的名称。
cchTextMax仅当您用来查询项目的属性时才需要使用该值,这时它包含上一个成员变量的大小。
iImage图标在列表视图中的图象链表中的索引号。
lParam用户定义的值,当您给项目排序时使用。当您告诉列表视图对项目排序时,列表视图将成对地比较项目。 它将会把两个项目的lParam的值传给您,这样您就可以进行比较先列出那一个了。如果您现在还不太明白的话,没有系,我们稍后还要讲关于排序的问题。

控件通过SendMessage来发送消息来控制,常用的消息有:

LVM_INSERTCOLUMN  加入列,wParam 为整型,指定列号,lParam 为指向LV_COLUMN结构的指针
LVM_SETCOLUMN  设置列,参数同上
LVM_INSERTITEM  加入项目或子项目,wParam 为0,lParam 为指向LV_ITEM结构的指针
LVM_SETITEM  设置项目或子项目,参数同上
LVM_GETITEM  取得项目或子项目,参数同上
LVM_GETNEXTITEM  取得下一个项目或子项目,可以用来取得光标选择的项目
LVM_DELETEITEM  删除项目或子项目,wParam 为整型,指定项目索引号,lParam 为0
LVM_DELETEALLITEMS  删除所有项目,wParam 和 lParam 均为0
LVM_SETTEXTCOLOR  设置文字颜色,wParam 为0,lParam 为颜色的RGB值
LVM_SETTEXTBKCOLOR  设置文字背景色,参数同上
LVM_SETBKCOLOR  设置背景色,参数同上

下面是用SysListView32控件实现的简单的学生管理系统程序的一部分:

void InsertColumn(void)
{
    LV_COLUMN lvc;

    lvc.mask = LVCF_TEXT | LVCF_WIDTH;
    lvc.pszText = "学号";
    lvc.cx = 60;
    SendMessage(hList, LVM_INSERTCOLUMN, 0, (long)&lvc);
    lvc.pszText = "姓名";
    lvc.cx = 80;
    SendMessage(hList, LVM_INSERTCOLUMN, 1, (long)&lvc);
    lvc.pszText = "性别";
    lvc.cx = 40;
    SendMessage(hList, LVM_INSERTCOLUMN, 2, (long)&lvc);
    lvc.pszText = "年龄";
    lvc.cx = 40;
    SendMessage(hList, LVM_INSERTCOLUMN, 3, (long)&lvc);
    lvc.pszText = "出生日期";
    lvc.cx = 100;
    SendMessage(hList, LVM_INSERTCOLUMN, 4, (long)&lvc);
    lvc.pszText = "籍贯";
    lvc.cx = 150;
    SendMessage(hList, LVM_INSERTCOLUMN, 5, (long)&lvc);
    lvc.pszText = "入学时间";
    lvc.cx = 100;
    SendMessage(hList, LVM_INSERTCOLUMN, 6, (long)&lvc);
    lvc.pszText = "数学";
    lvc.cx = 40;
    SendMessage(hList, LVM_INSERTCOLUMN, 7, (long)&lvc);
    lvc.pszText = "英语";
    lvc.cx = 40;
    SendMessage(hList, LVM_INSERTCOLUMN, 8, (long)&lvc);
    lvc.pszText = "政治";
    lvc.cx = 40;
    SendMessage(hList, LVM_INSERTCOLUMN, 9, (long)&lvc);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HINSTANCE hInst;
    HMENU hMenu;
    LV_ITEM lvi;
    int i;

    switch (message) {
        case WM_CREATE:
            hInst = ((LPCREATESTRUCT)lParam) -> hInstance;
            hMenu = GetMenu(hwnd);
            InitCommonControls();
            hList = CreateWindowEx(NULL, TEXT("SysListView32"), NULL, LVS_REPORT | WS_CHILD | WS_VISIBLE, 0, 0, 0, 0, hwnd, NULL, hInst, NULL);
            InsertColumn();
            SendMessage(hList, LVM_SETTEXTCOLOR, 0, RGB(255, 255, 255));
            SendMessage(hList, LVM_SETBKCOLOR, 0, RGB(100, 100, 100));
            SendMessage(hList, LVM_SETTEXTBKCOLOR, 0, RGB(0, 0, 0));
            Refresh();
            break;
        case WM_COMMAND:
            switch (LOWORD(wParam)) {
                case IDREFRESH:
                    Refresh();
                    break;
                case IDINSERT:
                    if (DialogBox(hInst, TEXT("StudInfo"), hwnd, InsertDlgProc)) InvalidateRect(hwnd, NULL, TRUE);
                    break;
                case IDEDIT:
                    lvi.iItem = SendMessage(hList, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
                    if (-1 == lvi.iItem) {
                        MessageBox(hwnd, "请选择一条记录!", "Edit Info", MB_OK | MB_ICONWARNING);
                        break;
                    }
                    lvi.mask = LVIF_TEXT;
                    lvi.cchTextMax = 20;
                    for (i = 0; i < 10; ++i) {
                        lvi.iSubItem = i;
                        lvi.pszText = buf[i];
                        SendMessage(hList, LVM_GETITEM, 0, (long)&lvi);
                    }
                    if (DialogBox(hInst, TEXT("StudInfo"), hwnd, EditDlgProc)) InvalidateRect(hwnd, NULL, TRUE);
                    break;
                case IDDELETE:
                    lvi.iItem = SendMessage(hList, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
                    if (-1 == lvi.iItem) {
                        MessageBox(hwnd, "请选择一条记录!", "Delete Info", MB_OK | MB_ICONWARNING);
                        break;
                    }
                    SendMessage(hList, LVM_DELETEITEM, lvi.iItem, 0);
                    lvi.mask = LVIF_TEXT;
                    lvi.iSubItem = 0;
                    lvi.pszText = buf[0];
                    lvi.cchTextMax = 20;
                    SendMessage(hList, LVM_GETITEM, 0, (long)&lvi);
                    sprintf(query, "DELETE FROM student WHERE id = %s", buf[0]);
                    ODBCConnect(hwnd);
                    ODBCQuery(query);
                    ODBCQueryEnd();
                    ODBCDisconnect(hwnd);
                    break;
                case IDEXIT:
                    SendMessage(hwnd, WM_CLOSE, 0, 0);
                    break;
                case IDABOUT:
                    MessageBox(hwnd, "Students Info Administration System Developed by anonymous", "About", MB_OK | MB_ICONINFORMATION);
            }
            break;
        case WM_SIZE:
            MoveWindow(hList, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
    }

    return 0;
}

 

___________________________________________________________________________________________________________________

列表框主要用于输入,它允许用户从所列出的表项中进行单项或多项选择,被选择的项呈高亮度显示.列表框具有边框,并且一般带有一个垂直滚动条.列表框分单选列表框和多重选择列表框两种.单选列表框一次只能选择一个列表项,而多重选择列表框可以进行多重选择.对于列表项的选择,应用程序用CreateWindowEx创建列表框控件时,可根据控件的用途在下表中选择部份常数来设定其风格属性(style)。


常数                                                    说明  
LBS_DISABLENOSCROLL   固定显示垂直滚动条。未指定本项时,当列表未超出窗口,垂直滚动条自动隐藏。
LBS_EXTENDEDSEL       使用键盘“SHIFT”键或另指定键加鼠标进行多选。
LBS_HASSTRINGS        含有字符串的自绘式列表框.应用程序在自绘式列表框进行自绘时可以用LB_GETTEXT消息来取得列表项的文本。
LBS_MULTICOLUMN       多列列表框,带有水平滚动条。应用程序可以用 LB_SETCOLUMNWIDTH 消息来为列表框指定列数。
LBS_MULTIPLESEL       支持多重选择。列表项的选择状态随着用户对该项单击或双击鼠标而翻转。
LBS_NODATA            本项已不被支持。
LBS_NOINTEGRALHEIGHT  列表框的尺寸由应用程序而不是Windows指定.通常,Windows指定尺寸会使列表项的某些部分隐藏起来。
LBS_NOREDRAW          禁止刷新。当选择发生变化时防止列表框被更新,可发送WM_SETREDRAW来改变该风格。
LBS_NOSEL             禁止选择,列表项只能看,不能被选择。
LBS_NOTIFY            当用户单击或双击鼠标时通知父窗口。
LBS_OWNERDRAWFIXED    指定自绘式列表框,即由父窗口负责绘制列表框的内容,并且列表项有相同的高度。在控件被创建时父窗口将收到WM_MEASUREITEM 消息,当需要重绘时父窗口将收到 WM_DRAWITEM 消息。
LBS_OWNERDRAWVARIABLE 指定自绘式列表框,并且列表项有不同的高度.在控件被创建时父窗口将收到WM_MEASUREITEM消息,当需要重绘时父窗口将收到 WM_DRAWITEM 消息。
LBS_SORT              使插入列表框中的项按字母升序排列.
LBS_STANDARD          使用默认风格,相当于指定了边框,垂直滚动条,字母升序排列和鼠标单双击通知消息这几项风格
LBS_USETABSTOPS       使列表框在显示列表项时识别并扩展制表符(08h),缺省的制表宽度是32个对话框单位。
LBS_WANTKEYBOARDINPUT 响应键盘输入。当控件拥有键盘输入焦点时,允许接收父窗口接收WM_VKEYTOITEM和WM_CHARTOITEM消息,输入字符。
应用程序可以通过调用SendMessage向控件发送如下消息来设定和查询控件各种参数。
   uMsg             wParam          lParam               说明
LB_ADDFILE            0            件名地址           增加文件名。
LB_ADDSTRING          0            符串地址           追加一个列表项。如果指定了LBS_SORT风格,表项将被重排序,否则将被追加在列表框的最后一项。
LB_DELETESTRING     列表项序号           0            删除指定的列表项,
LB_DIR              DDL_ARCHIVE    指向通配符地址     在列表框中列出文件名,必须是当前路径内,符合指定通配符,存档属性的文件名。
LB_DIR              DDL_DIRECTORY  指向通配符地址     在列表框中列出当前路径的子文件夹。子文件夹名前后将加上一对方括号"

  • "
    LB_DIR              DDL_DRIVES     指向通配符地址     在列表框中列出本机的所有驱动器名。驱动器名前后将加上一对方括号和减号"[-*-]"
    LB_DIR              DDL_EXCLUSIVE  指向通配符地址     只列出指定属性的文件名,默认情况下是所有可读写文件都列出。如果没有指定任何文件属性,则不列出文件名。
    LB_DIR              DDL_HIDDEN     指向通配符地址     列出隐藏属性的文件名。
    LB_DIR              DDL_READONLY   指向通配符地址     列出只读属性的文件名。
    LB_DIR              DDL_READWRITE  指向通配符地址     列出读写属性的文件名。
    LB_DIR              DDL_SYSTEM     指向通配符地址     列出系统属性的文件名。
    LB_FINDSTRING       开始表项序号   字符串地址         查找匹配字符串,忽略大小写,从指定开始表项序号开始查找,当查到某表项的文本字符串的前面包括指定的字符串则结束,找不到则转到列表框第一项继续查找,直到查完所有表项,如果wParam为-1则从列表框第一项开始查找,如果找到则返回表项序号,否则返回LB_ERR。如:表项字符串为"abc123"和指定字串"ABC"就算匹配。
    LB_FINDSTRINGEXACT  开始表项序号   字符串地址         查找字符串,忽略大小写,与LB_FINDSTRING不同,本操作必须整个字符串相同。如果找到则返回表项序号,否则返回LB_ERR。
    LB_GETANCHORINDEX      0               0              返回鼠标最后选中的项的索引
    LB_GETCARETINDEX       0               0              返回具有矩形焦点的项的索引
    LB_GETCOUNT            0               0              返回列表项的总项数,若出错则返回LB_ERR.
    LB_GETCURSEL           0               0              本操作仅适用于单选择列表框,用来返回当前被选择项的索引,如果没有列表项被选择或有错误发生,则返回LB_ERR.
    LB_GETHORIZONTALEXTENT 0               0              返回列表框的可滚动的宽度(象素)
    LB_GETITEMDATA        索引             0              每个列表项都有一个32位的附加数据.该函数返回指定列表项的附加数据。若出错则函数返回LB_ERR.
    LB_GETITEMHEIGHT      索引             0              返回列表框中某一项的高度(单位:象素)
    LB_GETITEMRECT        索引            RECT结构地址    获得列表项的客户区的RECT
    LB_GETLOCALE          0               0               取列表项当前用于排序的语言代码,当用户使用LB_ADDSTRING向组合框中的列表框中添加记录并使用LBS_SORT风格进行重新排序时,必须使用该语言代码。返回值中高16位为国家代码。
    LB_GETSEL             索引            0               返回指定列表项的状态。如果查询的列表项被选择了,函数返回一个正值,否则返回0,若出错则返回LB_ERR。
    LB_GETSELCOUNT        0               0               本操作仅用于多重选择列表框,它返回选择项的数目,若出错函数返回LB_ERR.
    LB_GETSELITEMS        数组的大小      缓冲区          本操作仅用于多重选择列表框,用来获得选中的项的数目及位置。参数lParam指向一个整型数数组缓冲区,用来存放选中的列表项的索引。wParam说明了数组缓冲区的大小。本操作返回放在缓冲区中的选择项的实际数目,若出错函数返回LB_ERR.
    LB_GETTEXT            索引            缓冲区          用于获取指定列表项的字符串。参数lParam指向一个接收字符串的缓冲区.wParam则指定了接收字符串的列表项索引。返回获得的字符串的长度,若出错,则返回LB_ERR。
    LB_GETTEXTLEN         索引            0               返回指定列表项的字符串的字节长度。wParam指定了列表项的索引.若出错则返回LB_ERR。
    LB_GETTOPINDEX        0               0               返回列表框中第一个可见项的索引,若出错则返回LB_ERR.
    LB_INITSTORAGE        表项数          内存字节数      本操作只适用于Windows95版本,当你将要向列表框中加入很多表项或有很大的表项时,本操作将预先分配一块内存,以免在今后的操作中一次一次地分配内存,从而加快程序运行速度。
    LB_INSERTSTRING       索引            字符串地址      在列表框中的指定位置插入字符串。wParam指定了列表项的索引,如果为-1,则字符串将被添加到列表的末尾。lParam指向要插入的字符串。本操作返回实际的插入位置,若发生错误,会返回LB_ERR或LB_ERRSPACE。与LB_ADDSTRING不同,本操作不会导致LBS_SORT风格的列表框重新排序。建议不要在具有LBS_SORT风格的列表框中使用本操作,以免破坏列表项的次序。
    LB_ITEMFROMPOINT      0               位置            获得与指定点最近的项的索引,lParam指定在列表框客户区,低16位为X坐标,高16位为Y坐标。
    LB_RESETCONTENT       0               0               清除所有列表项。
    LB_SELECTSTRING       开始表项序号    字符串地址      本操作仅适用于单选择列表框,设定与指定字符串相匹配的列表项为选中项。本操作会滚动列表框以使选择项可见。参数的意义及搜索的方法与LB_FINDSTRING类似。如果找到了匹配的项,返回该项的索引,如果没有匹配的项,返回LB_ERR并且当前的选中项不被改变。
    LB_SELITEMRANGE       TRUE或FALSE     范围            本操作仅用于多重选择列表框,用来使指定范围内的列表项选中或落选.参数lParam指定了列表项索引的范围,低16位为开始项高16位为结束项。如果参数wParam为TRUE,那么就选择这些列表项,否则就使它们落选。若出错函数返回LB_ERR。
    LB_SELITEMRANGEEX     起点            终点            本操作仅用于多重选择列表框,若指定终点大于起点则设定该范围为选中,若指定起点大于终点则设定该范围为落选。
    LB_SETANCHORINDEX     索引            0               设置鼠标最后选中的表项成指定表项
    LB_SETCARETINDEX      索引            TRUE或FALSE     设置键盘输入焦点到指定表项,若lParam为TRUE则滚动到指定项部份可见,若lParam为FALSE则滚动到指定项全部可见。
    LB_SETCOLUMNWIDTH     宽度(点)        0               设置列的宽度。
    LB_SETCOUNT           项数            0               设置表项数目
    LB_SETCURSEL          索引            0               本操作仅适用于单选择列表框,设置指定的列表项为当前选择项。本操作会滚动列表框以使选择项可见。参数wParam指定了列表项的索引,若为-1,那么将清除列表框中的选择。若出错函数返回LB_ERR。
    LB_SETHORIZONTALEXTENT 宽度(点)       0               设置列表框的滚动宽度。
    LB_SETITEMDATA         索引           数据值          更新指定列表项的32位附加数据。
    LB_SETITEMHEIGHT       索引           高度(点)        指定列表项显示高度,带有LBS_OWNERDRAWVARIABLE(自绘列表项)风格的控件,只设置由wParam指定项的高度,其它风格将更新所有的列表项的高度。
    LB_SETLOCALE           语言代码       0               取列表项当前用于排序的语言代码,当用户使用LB_ADDSTRING向组合框中的列表框中添加记录并使用LBS_SORT风格进行重新排序时,必须使用该语言代码。返回值中高16位为国家代码。
    LB_SETSEL              TRUE或FALSE    索引            本操作仅适用于多重选择列表框,它使指定的列表项选中或落选。参数lParam指定了列表项的索引,若为-1,则相当于指定了所有的项。参数wParam为TRUE时选中列表项,否则使之落选。若出错则返回LB_ERR。
    LB_SETTABSTOPS         站数           索引顺序表      设置列表框的光标(输入焦点)站数及索引顺序表。
    LB_SETTOPINDEX         索引           0               用来将指定的列表项设置为列表框的第一个可见项,该函数会将列表框滚动到合适的位置。wParam指定了列表项的索引.若操作成功,返回0值,否则返回LB_ERR。
    当用户在列表框上进行各种操作时,其父窗口将收到WM_COMMAND通知消息,同时wParam的低16位带控件的ID。lParam带控件句柄(hWnd),wParam的高16位带有如下表的消息代码。
    消息代码           说明
    LBN_DBLCLK    用户单击了列表项。
    LBN_ERRSPACE  列表框无法申请到足够的内存空间。
    LBN_KILLFOCUS 列表框失去输入焦点。
    LBN_SELCANCEL 取消选择列表项。
    LBN_SELCHANGE 列表框的选择项即将被改变。
    LBN_SETFOCUS  列表框得到键盘输入焦点。

    __________________________________________________________________________________________________________________________

    (1)添加项:
    如果采用LBS_SORT样式,那么填入清单方块最简单的方法是借助LB_ADDSTRING消息:
    SendMessage (hwndList, LB_ADDSTRING, 0, (LPARAM) szString) ;

    如果没有采用LBS_SORT,那么可以使用LB_INSERTSTRING指定一个索引值,将字符串插入到清单方块中:
    SendMessage (hwndList, LB_INSERTSTRING, iIndex, (LPARAM) szString) ;
    示例代码:
    SendMessage(hwndLB,LB_INSERTSTRING,0,(LPARAM)TEXT("你好"));
    (2)删除项:
    在指定索引值的同时使用LB_DELETESTRING参数,这就可以从清单方块中删除字符串:
    SendMessage (hwndList, LB_DELETESTRING, iIndex, 0) ;
    (3)取得有多少项:
    iCount = SendMessage (hwndList, LB_GETCOUNT, 0, 0) ;(4)选定某一项SendMessage (hwndList, LB_SETCURSEL, iIndex, 0) ;将iParam设定为-1则取消所有选择(5) 确定目前选项的索引:iIndex = SendMessage (hwndList, LB_GETCURSEL, 0, 0) ;如果没有项目被选中,那么从呼叫中传回的iIndex值为LB_ERR。(6)将某项目复制到文字缓冲区中:iLength = SendMessage (
    hwndList, LB_GETTEXT, iIndex,

    (LPARAM) szBuffer) ;确定清单方块中字符串的长度:iLength = SendMessage (hwndList, LB_GETTEXTLEN, iIndex, 0) ;对以NULL字符终结的字符串长度来说,szBuffer数组必须够大。您也许想用LB_GETTEXTLEN先分配一些局部内存来存放字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值