什么是网站ip地址,最吉祥的公司名字大全,大连企业信息,知名的环保行业网站开发本课中我们将学习如何创建和使用列表视图控件。 理论#xff1a;列表视图控件和树型视图、丰富文本编辑控件一样是通用控件的一种。可能您都已经知道了列表视图控件#xff0c;只不过是不知道它的确切名字而已。列表视图控件可以用来很好地显示项目。在这方面它和列表框相同列表视图控件和树型视图、丰富文本编辑控件一样是通用控件的一种。可能您都已经知道了列表视图控件只不过是不知道它的确切名字而已。列表视图控件可以用来很好地显示项目。在这方面它和列表框相同只不过它的性能更强。有两种方法创建一个列表视图控件。第一种也是最简单的方法是用资源编辑器来创建它。用该种方法只是不要忘记在您的代码的任何位置处加入对InitCommonControls函数的调用记得吗调用该函数只是为了隐式地加载包含通用控件的DLL。另一种方法是调用CreateWindowEx函数这里您必须指定合适的类名譬如SysListView32WC_LISTVIEW不是正确的类名在列表视图种有四种方法来显示数据大图标小图标列表和报告方式。这些方法和在资源管理器种选择View-Large IconsSmall Icons List 和 Details 相对应。各种不同的显示方式只是显示了不同的外观而已。譬如您可能有许多的数据只是并不想全部显示。报告方式提供的消息最完全其它的方式则要少得多。在刚创建一个列表视图时您可以选择一种初始显示方法随后您可以调用SetWinodwLong函数并设置GWL_STYLE标志位来改变显示方式既然我们已经知道了如何创建列表控件接下来我们学习如何使用它们。我们将主要集中在报告方式的显示上因为该种方式演示了最多的列表控制的特性。使用列表控制的步骤如下调用CreateWindowEx函数来创建一个列表控件指定它的类名为SysListView32。您还可以在此处指定控件初次显示时的方式。创建和初始化用在列表控件中显示项目的图象列表如果存在。向列表控件中插入列如果显示的方式是报告方式这一步是必须的。向控件中插入项目和自项目。列在报告方式中有不止一个列。您可以把放入到列表控件中的数据看作是一张表单这时数据是按行列排列的。在控件中至少有一列。在其它的显示方式中则无所谓因为这些显示方式有仅有一列。加入列要通过向列表控件发送LVM_INSERTCOLUMN消息来实现。LVM_INSERTCOLUMNwParam iCollParam 指向LV_COLUMN型结构体变量的指针iCol 列数从0开始编号。LV_COLUMN 包含了将插入的列的信息。它的定义如下LV_COLUMN STRUCTimask dd ?fmt dd ?lx dd ?pszText dd ?cchTextMax dd ?iSubItem dd ?iImage dd ?iOrder dd ?LV_COLUMN ENDSField nameMeaningsimask一组标志位它指示了该结构体中的那些成员变量是有效的。该结构体中的成员变量并不是同时有效的。在某些时候可能只有某些成员变量是有效的。结构体可以用来输入和输出。这样让WINDOWS知道那些成员变量是有效的是非常重要的。可能的标志有LVCF_FMT fmt有效LVCF_SUBITEM iSubItem有效LVCF_TEXT pszText有效.LVCF_WIDTH lx有效您可以一次使用几个标志。譬如如果您向指定列的文本标签列名您必须在pszText成员变量中提供列名然后指定标志LVCF_TEXT告诉WINDOWS成员变量pszText中的值是有效的否则WINDOWS将忽略掉pszText中的值。fmt指定了项目/子项目的对齐方式。可能的值有LVCFMT_CENTER 文本居中LVCFMT_LEFT 文本左对齐LVCFMT_RIGHT 文本右对齐lxlx 是列的宽度以像素点为单位。以后您可以发送消息LVM_SETCOLUMNWIDTH来改变列的宽度。pszText如果用来设定列的属性时该成员变量为指向列名的指针。如果是查询列名该成员变量指向一个足够大的缓冲区用来接收返回的列名这是您必须在成员cchTextMax中指定缓冲区的大小。如果是设定列名时可以忽略该变量因为该指针指向的是一个ASCII码的字符串而WINDOWS可以解析出ASCII串的长度。cchTextMaxcchTextMax 以字节计的上面一个成员变量指向的缓冲区的小。该成员变量只在您查询列的属性时使用。如果是设定列的属性那该变量将被忽略。iSubItem指定和该列相连的子项目的索引号。该成员变量的值用来标识和列相连系的子项目。该列的使用最好地说明了如何把列号和子项目相连。要查询列的属性时可以发送LVM_GETCOLUMN消息并在成员变量imask中指定LVCF_SUBITEM标志列表控件将在iSubItem中返回插入时设定的iSubItem值。为了使用该办法您需要在该成员变量中放入正确的值。iImage and iOrder为了和IE3.0以上版本兼容。目前我没有这方面的资料。在列表视图控件创建后您必须至少向其中插入一列。当然如果不打算使用报告方式显示那倒是没有必要插入列。为了插入列您需要定义一个LV_COLUMN型的结构体变量给其成员变量赋上正确的值指定列号然后向列表视图控件发送LVM_INSERTCOLUMN消息并把该结构体变量的值传过去。LOCAL lvc:LV_COLUMNmov lvc.imask,LVCF_TEXTLVCF_WIDTHmov lvc.pszText,offset Heading1mov lvc.lx,150invoke SendMessage,hList, LVM_INSERTCOLUMN,0,addr lvc上面的代码段显示了该过程。当发送LVM_INSERTCOLUMN消息时他指定了列的标题条文本和它的宽度。项目和子项目项目是列表视图中主要的内容。除报告方式显示的外在列表视图您只能看到项目。子项目是项目的详细信息。一个项目可能有不止一个相关的子项目。举个例子譬如项目是文件名那其相关的子项目可能有文件属性、大小、创建日期等。在报告方式的视图中最左边一列是项目其它列是子项目。从数据库记录的角度看项目类似主键子项目类似记录。至少您的列表视图需要一些项目子项目是可选的。如果您想要给用户提供更多的信息可以把子项目和项目相连然后放到列表视图中以报告的方式显示。您可以通过向列表视图发送LVM_INSERTITEM消息来向其中添加项目这时还需要把一个指向LV_ITEM型的结构体的变量的指针放到lParam一同传给列表视图。LV_ITEM的定义如下LV_ITEM STRUCTimask dd ?iItem dd ?iSubItem dd ?state dd ?stateMask dd ?pszText dd ?cchTextMax dd ?iImage dd ?lParam dd ?iIndent dd ?LV_ITEM ENDSField nameMeaningsimask一组标志位标明该结构体中那些成员变量中的值有效。它的意义和上面我们提到的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的值传给您这样您就可以进行比较先列出那一个了。如果您现在还不太明白的话没有系我们稍后还要讲关于排序的问题。现在让我们来总结想列表控件中插入项目/子项目的步骤定义一个LV_ITEM型的结构体变量。给该变量赋给合适的值如果要插入一个项目就向列表视图控件发送LVM_INSERTITEM值。 如果要插入一个子项目发送LVM_SETITEM。如果您不明白项目和子项目之间的关系的话可能会有一些疑惑。子项目仅是项目的属性而已也就是说您可以插入一个项目但是不能插入一个子项目。所以添加一个子项目十只能发送LVM_SETITEM消息而不能发送LVM_INSERTITEM消息。列表视图控件的消息/通知既然您知道了如何创建和往其中添加内容下一步就是如何和它通讯。列表视图控件和它的父窗口之间的通讯是通过消息/通知来进行的。父窗口通过发送消息来控制列表视图控件列表视图控件通过发送WM_NOTIFY消息来通知它的父窗口。这一点和其它的通用控件没有什么不同。排序项目/子项目您可以在调用CreateWindowEx函数时指定LVS_SORTASCENDING 或 LVS_SORTDESCENDING风格来指定缺省的排序方式。这两种风格仅仅排序项目的名称。如果想要排序项目的其它属性您可以通过发送LVM_SORTITEMS消息来完成LVM_SORTITEMSwParam lParamSortlParam pCompareFunctionlParamSort 用户定义的值该值将传递给用来比较的函数。pCompareFunction 用户定义的用来比较排序的函数的地址。该函数的原型如下CompareFunc proto lParam1:DWORD, lParam2:DWORD, lParamSort:DWORDlParam1 和 lParam2 是 LV_ITEM型的结构体中的成员变量lParam的值。lParamSort 是发送LVM_SORTITEMS消息时参数wParam中的值当列表视图控件接收到LVM_SORTITEMS消息时当需要比较项目时它会调用在lParam中指定的比较函数。比较函数将决定那一个项目排在前面。方法很简单如果函数返回一个负值由lParam代表的第一个项目排在前如果返回正值第二个项目排在前。如果相等必须返回0 。真正使得该方法能够运行的是LV_ITEM型结构体中的成员变量lParam值。当您需要排序时譬如当您点击列的标题条时您需要考虑好排序方案。在本例中我们把项目的索引放到该成员变量中这样我们可以通过发送LVM_GETITEM消息来得到项目的其它信息。注意当项目重排序后它们的索引也就变了。所以当重排序后我需要在lParam参数中反应出新的索引。如果您想在用户点击列的标题条时重新排序您需要在您的窗口过程函数中处理LVN_COLUMNCLICK通知消息。LVN_COLUMNCLICK消息是随同WM_NOTIFY消息一起发送的。例子该例子创建了一个列表视图控件并在其中显示了当前文件夹中的文件大小和文件名。缺省的视图是报告方式的如果您点击列标题条标题将按升/降序重新排列。您可以通过菜单选择不同的显示方式大图标、小图标等。当您双击一个项目时项目的名称将显示在一个对话框中。.386.model flat,stdcalloption casemap:noneinclude \masm32\include\windows.incinclude \masm32\include\user32.incinclude \masm32\include\kernel32.incinclude \masm32\include\comctl32.incincludelib \masm32\lib\comctl32.libincludelib \masm32\lib\user32.libincludelib \masm32\lib\kernel32.libWinMain proto :DWORD,:DWORD,:DWORD,:DWORDIDM_MAINMENU equ 10000IDM_ICON equ LVS_ICONIDM_SMALLICON equ LVS_SMALLICONIDM_LIST equ LVS_LISTIDM_REPORT equ LVS_REPORTRGB macro red,green,bluexor eax,eaxmov ah,blueshl eax,8mov ah,greenmov al,redendm.dataClassName db ListViewWinClass,0AppName db Testing a ListView Control,0ListViewClassName db SysListView32,0Heading1 db Filename,0Heading2 db Size,0FileNamePattern db *.*,0FileNameSortOrder dd 0SizeSortOrder dd 0template db %lu,0.data?hInstance HINSTANCE ?hList dd ?hMenu dd ?.codestart:invoke GetModuleHandle, NULLmov hInstance,eaxinvoke WinMain, hInstance,NULL, NULL, SW_SHOWDEFAULTinvoke ExitProcess,eaxinvoke InitCommonControlsWinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORDLOCAL wc:WNDCLASSEXLOCAL msg:MSGLOCAL hwnd:HWNDmov wc.cbSize,SIZEOF WNDCLASSEXmov wc.style, NULLmov wc.lpfnWndProc, OFFSET WndProcmov wc.cbClsExtra,NULLmov wc.cbWndExtra,NULLpush hInstancepop wc.hInstancemov wc.hbrBackground,COLOR_WINDOW1mov wc.lpszMenuName,IDM_MAINMENUmov wc.lpszClassName,OFFSET ClassNameinvoke LoadIcon,NULL,IDI_APPLICATIONmov wc.hIcon,eaxmov wc.hIconSm,eaxinvoke LoadCursor,NULL,IDC_ARROWmov wc.hCursor,eax