• win32 sdk列表视图控件(ListCtrl或ListView)资料整理


        列表视图控件是一种非常常用的控件,在需要以报表形式显示数据时,列表控件通常是最好的选择,许多专用的数据报表控件,也是在它的基础上派生而来。与树视图类似,列表控件可以由多个子项目组成,可以设置为Icon(大图标)、SmallIcon(小图标)、List(列表)或Report(报表)。

    一、列表视图控件有两个重要的数据结构LVCOLUMN和LVITEM。LVCOLUMN用于定义报表方式下的“列”的结构;LVITEM用于定义“项”的结构。这两个结构的定义及说明如下:

    typedef struct _LVCOLUMN {

    UINT mask;            说明此结构中哪些成员是有效的

    int fmt;                  列的对齐方式

    int cx;                    列的初始宽度

    LPTSTR pszText;     列的标题

    int cchTextMax;      pszText所指向的缓冲区的大小

    int iSubItem;         与列关联的子项的索引值,从0开始

    int iImage;            与列关联的图像列表中指定图像的索引值

    int iOrder;             第几列,0代表最左一列

    } LVCOLUMN, FAR LPLVCOLUMN;

    -----------------------------------

    typedef struct _LVITEM {

    UINT   mask;          说明LVITEM结构中哪些成员有效

    int    iItem;             项目的索引值(可以视为行号)从0开始

    int    iSubItem;      子项的索引值(可以视为列号)从0开始

    UINT   state;          子项的状态

    UINT   stateMask;   状态有效的屏蔽位

    LPTSTR pszText;    主项或子项的名称

    int    cchTextMax;  pszText所指向的缓冲区大小

    int    iImage;         关联图像列表中指定图像的索引值

    LPARAM lParam;    程序定义的32位参数

    int iIndent;            表示图像位置缩进的单位

    } LVITEM, FAR LPLVITEM;

    ---------------------------------------

    二、相关操作。因为是SDK编程,所以对控件的操作是向控件发送SendMessage()来实现的

    LISTVIEW中的相关消息为:

    1、LVM_SETTEXTCOLOR 和 LVM_SETTEXTBKCOLOR和 LVM_SETBKCOLOR   //消息设定文本的前景和背景色,wParam 为0,lParam 为颜色的RGB值

    2、 LVM_GETNEXTITEM  //找到选中的行,对应ListView_GetNextItem宏将SendMessage打包为函数方式操作。

    3、LVM_SETCOLUMNWIDTH  //设置列宽,对应ListView_SetColumnWidth

    4、LVM_SETEXTENDEDLISTVIEWSTYLE  //设置扩展风格如:LVS_EX_FULLROWSELECT(选中一整行), LVS_EX_GRIDLINES(网络线),LVS_EX_CHECKBOXES(选择按钮),对应ListView_SetExtendedListViewStyle

    5、LVM_INSERTCOLUMN  //插入新列,对应ListView_InsertColumn,wParam 为整型,指定列号,lParam 为指向LV_COLUMN结构的指针

    6、LVM_SETCOLUMN  //设置列,参数同上

    7、LVM_INSERTITEM  //插入项目(行),对应ListView_InsertItem,加入项目或子项目,wParam 为0,lParam 为指向LV_ITEM结构的指针

    8、LVM_SETITEM  //设置子项(行中的每列),对应ListView_SetItem,设置项目或子项目,参数同上

    9、LVM_GETITEM  //取得项目或子项目,参数同上

    10、LVM_GETITEMCOUNT  //获取项数,对应ListView_GetItemCount

    11、LVM_GETNEXTITEM  取得下一个项目或子项目,可以用来取得光标选择的项目

    12、LVM_DELETEITEM  //删除项,对应ListView_DeleteItem,删除项目或子项目,wParam 为整型,指定项目索引号,lParam 为0

    13、LVM_DELETEALLITEMS  //删除所有项目,wParam 和 lParam 均为0

    三、ListCtrl控件的扩展样式

    LVS_EX_GRIDLINES //绘制表格线

    LVS_EX_SUBITEMIMAGES//子项目图标列表

    LVS_EX_CHECKBOXES //带复选框

    LVS_EX_TRACKSELECT //自动换行

    LVS_EX_HEADERDRAGDROP//报表头可以拖拽

    LVS_EX_FULLROWSELECT //选择整行

    LVS_EX_ONECLICKACTIVATE//单击激活

    LVS_EX_TWOCLICKACTIVATE//双击激活

    LVS_EX_FLATSB//扁平滚动条

    LVS_EX_REGIONAL

    LVS_EX_INFOTIP

    LVS_EX_UNDERLINEHOT

    LVS_EX_UNDERLINECOLD

    LVS_EX_MULTIWORKAREAS//多工作区

    四、ListView控件属于通用控件CONTROL中的一种,在SDK编程方式时要使用通用控件

    必须包含comctl32.dll,所以代码中要有头文件: commctrl.h    导入库:comctl32.lib

    在使用通用控件之前应该先调用InitCommonControls();初始化它

    以ListView控件为例:

    InitCommonControls();

    //子窗口形式使用LISTVIEW

    CreateWindowEx(0,  //扩展风格  WC_LISTVIEW, //这是系统定义的宏,WC_LISTVIEW对应 "SysListView32" "123", //窗口标题  WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN   | LVS_REPORT | LVS_AUTOARRANGE | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SINGLESEL , //窗口风格 (普通控件风格在这里设置,扩展风格要单独设置)  0,   0, //窗口大小   420, //宽度一定要等于所有列宽的和,否则会看起来有空列 600, hwnd, //父窗口句柄  NULL, //菜单句柄 hInstance, //实例句柄 NULL //创建参数 );

    //也可以在对话框资源文件中以子控件的方式使用

    CONTROL         "",IDC_LISTVIEW, "SysListView32", WS_BORDER | WS_TABSTOP | LVS_REPORT | LVS_AUTOARRANGE | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SINGLESEL, 7,110,300,133

    五、部分操作代码。

    void in_it(HWND hwnd,int iSubItem,int cx,char *text,int cchTextMax,int len)//插入列函数
    {
     LVCOLUMN ColInfo1 = {0};//LVCOLUMN 定义一个结构变量ColInfo1)
     ColInfo1.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
     ColInfo1.iSubItem = iSubItem;
     ColInfo1.fmt = LVCFMT_CENTER;
     ColInfo1.cx = cx;
     ColInfo1.pszText=(LPWSTR)text;
     ColInfo1.cchTextMax = cchTextMax;
     SendMessage(hwnd, LVM_INSERTCOLUMN, WPARAM(len), LPARAM(&ColInfo1));
    };

    void set_data(HWND hwnd,char *text,int x,int y)

    {  

    LVITEM item;  

    item.mask=LVIF_TEXT;  

    item.pszText=text;  

    item.iItem=x;  

    item.iSubItem=y;

     if(y==0)   

    SendMessage(hwnd, LVM_INSERTITEM, 0, LPARAM(&item));  

    else   

    SendMessage(hwnd, LVM_SETITEM, 0, LPARAM(&item));

    }

    BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)

    {  

    HWND hWndlist= GetDlgItem(hwnd, IDC_LIST1);  

    SendMessage(hWndlist, LVM_SETEXTENDEDLISTVIEWSTYLE, 0,   LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP | LVS_EX_GRIDLINES);  

    in_it(hWndlist,0,115,"商品名称",50,0);  

    in_it(hWndlist,0,115,"编号",50,1);  

    in_it(hWndlist,0,115,"价格",50,2);

    set_data(hWndlist,"电冰箱",0,0);  

    set_data(hWndlist,"电视机",1,0);  

    set_data(hWndlist,"笔记本",2,0);

    set_data(hWndlist,"吸尘器",3,0);

     set_data(hWndlist,"1234",0,1);  

    set_data(hWndlist,"3000",0,2);  

    set_data(hWndlist,"2345",1,1);  

    set_data(hWndlist,"5000",1,2);  

    set_data(hWndlist,"3456",2,1);  

    set_data(hWndlist,"4000",2,2);  

    set_data(hWndlist,"4567",3,1);  

    set_data(hWndlist,"3500",3,2);  

                return TRUE;
          }

  • 相关阅读:
    第七十四节,css边框与背景
    php中strlen和{}的效率对比
    for循环++i效率
    php优化技巧
    mysql中group_concat函数用法
    mysql引擎互转问题
    array_column php 函数
    php-mysql结果集函数比较
    javaweb 要学习的东西
    Java 泛型和类型安全的容器
  • 原文地址:https://www.cnblogs.com/wumac/p/4101677.html
Copyright © 2020-2023  润新知