Win32 SDK利用ListView控件

转载 2012年05月24日 15:08:50
相关链接:
http://www.codeproject.com/KB/combobox/listview.aspx   CodeProject是个非常不错的网站,让我们可以吸收外国同行的编程经验。


Win32 SDK利用ListView控件。
为了使用ListView控件,我们需要初始化公共控件库,我们需要在程序刚刚启动时调用
InitCommonControls() 函数,如果发生链接错误,说明我们没有链接拥有该函数的库文件。它们对应的
头和库 DLL分别为 #include <commctrl.h> comctl32.lib comctl32.dll
为了使用这个控件 我们就需要知道它的窗口类,利用Spy++等文件可以找到指定进程窗口的窗口类,
而一个ListView控件也是一个子窗口,所以我们可以得到它的类名为syslistview32,其他的控件,
我们只需要按照同样的道理来得到类名即可。
有了类名还不够,我们还需要知道每种控件的风格,比如listView控件有以下的风格LVS_REPORT | LVS_SHOWSELALWAYS, 它表示要产生报表和总是显示。为了得到控件的风格,我们可以通过MSDN中MFC中的ListView风格来作参考。有了窗口类和风格,我们利用CreateWindow就可以创建并得到
这个控件的句柄了。有了句柄,我们就可以随便控制了,具体要怎么看你自己的了。

此外为了向ListView内插入项和列,我们需要两个结构体。
LVITEM和LVCOLUMN

它们的定义分别为
typedef struct _LVITEM { 
    UINT mask; 
    int iItem; 
    int iSubItem; 
    UINT state; 
    UINT stateMask; 
    LPTSTR pszText; 
    int cchTextMax; 
    int iImage; 
    LPARAM lParam;
#if (_WIN32_IE >= 0x0300)
    int iIndent;
#endif
#if (_WIN32_IE >= 0x560)
    int iGroupId;
    UINT cColumns; // tile view columns
    PUINT puColumns;
#endif

typedef struct _LVCOLUMN { 
    UINT mask; 
    int fmt; 
    int cx; 
    LPTSTR pszText; 
    int cchTextMax; 
    int iSubItem; 
#if (_WIN32_IE >= 0x0300)
    int iImage;
    int iOrder;
#endif
} LVCOLUMN, *LPLVCOLUMN; 

} LVITEM, *LPLVITEM;
有了这两个结构体,我们就可以利用SendMessage来给ListView控件发送消息来为它添加项和列。
我们分别通过下面两个消息来添加项和列。
SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
SendMessage(hButton, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);

LVM_INSERTITEM表示添加项
LVM_INSERTCOLUMN表示添加列。
为了更好的查找关于ListView的消息,我们只需要在网上或MSDN 里查找 LVM_XXXXXX 就可以找到
相关的消息了。最好自己整理出一份关于ListView的全部消息。

WindowFrame &wndFrame = WindowFrame::Instance();
   
    GetWindowRect(hWnd, &rect);
    cx = rect.right-rect.left;
    cy = rect.bottom-rect.top;

    switch(msg)
    {
    case WM_CREATE:
        {
            rowIndex = 7;
            hButton = CreateWindow("syslistview32", "",
                                     WS_VISIBLE|WS_CHILD|WS_BORDER|
                                    LVS_REPORT | LVS_SHOWSELALWAYS,
                                    10, 20,
                                    cx-30,
                                    cy-100,
                                    hWnd, NULL, wndFrame.getInstance(), NULL);
            // 添加数据
            LV_ITEM item;       // 项
            LV_COLUMN colmn;     // 列
            ZeroMemory(&item, sizeof(LV_ITEM));
            ZeroMemory(&colmn, sizeof(LV_COLUMN));
           
            colmn.mask = LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM; // 风格
            colmn.cx = 0x28;
            colmn.pszText = "进程名"; // 文字
            colmn.cx = 0x42;         // 后面列
            SendMessage(hButton, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);
            colmn.pszText = "内存使用";
            SendMessage(hButton, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);
            colmn.pszText = "ID";
            SendMessage(hButton, LVM_INSERTCOLUMN, 0, (LPARAM)&colmn);

            // 添加一些行项
            item.mask = LVIF_TEXT;       // 文字
            item.cchTextMax = MAX_PATH;       // 文字长度
            item.iItem = 0;
            item.iSubItem = 0;
            item.pszText = "中国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "日本";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "德国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "俄国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "美国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "英国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
            item.pszText = "法国";
            SendMessage(hButton, LVM_INSERTITEM, 0, (LPARAM)&item);
        }
        break;

Win32 SDK利用ListView控件。

Win32 SDK利用ListView控件。 为了使用ListView控件,我们需要初始化公共控件库,我们需要在程序刚刚启动时调用 InitCommonControls() 函数,如果发生链接错误...

win32 sdk中ListView列表控件的使用

使用ListView控件,我们需要初始化公共控件库,所以我们要在初始化时调用InitCommonControls()函数。 如果调用发生链接错误,说明我们没有链接拥有该函数的库文件。它们对应的头和库...

消除窗体/内容/控件闪烁(Win32 SDK、C++ 语言描述)

消除窗体/内容/控件闪烁(Win32 SDK、C++ 语言描述) 原作者:Ultraman_King    2011.8 原文章地址:http://hi.baidu.com/...

Win32 SDK控件详细设置

列表框 LBS(ListBoxStyle) 以CTRL_LIST/"list"为类名调用CreateWindow 多选风格:LBS_MULTIPLESEL 高级风各:LBS_USEICON ...

Win32 SDK程序创建一些控件

在Win32 SDK中创建一些控件的时候需要注意一下(具体是哪些控件请参看MSDN文档中列出来的) /* MSDN:Carries information used to load common c...

Win32 GUI编程之三--------ListView控件之OwnerData

dfasdfs // Windows 头文件: #include // C 运行时头文件 #include #include #include #include #include #i...
  • zzidea
  • zzidea
  • 2014年03月30日 02:40
  • 752

跟我一起玩Win32开发(15):ListView控件

这个控件其实不用阿拉来介绍,因为它太常见了,就好像我们一出门就会看到妹子一样常见。当然也可以说,它是对ListBox的扩充。 在使用该控件之前,我先介绍VS的一个相当好玩的功能。 在代码文件的#i...
  • tcjiaan
  • tcjiaan
  • 2013年02月06日 13:47
  • 13552

Win32修改ListView控件扩展属性

创建一个ListView,以为就是和一般的控件一样: m_hLogList = ::CreateWindowEx(LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|...
  • mfcing
  • mfcing
  • 2015年11月03日 22:32
  • 1690
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Win32 SDK利用ListView控件
举报原因:
原因补充:

(最多只允许输入30个字)