VS2008下的CListCtrl控件的使用

 

                                                              VS2008下的CListCtrl控件的使用
     最近要适应VS这个开发环境,从VC6移植到VS有很多不习惯.在一个小程序中利用到了 CListCtrl控件的时候 就出现了问题 。其实自VC6下这个控件我还是会使用的 主要指Report风格 。。
下面是VS下的CListCtrl控件的使用。。
     我们利用的时候主要是针对CListCtrl的 report风格。关于CListCtrl,有基本风格和扩展风格  。 设置控件风格的API  SetWindowLong(可以设置基本风格和扩展风格),还有就是CListCtrl类的
SetExtendedStyle函数可以设置扩展风格 。

下面是基本风格:
LVS_ALIGNLEFT  指定项是左对齐的
LVS_ALIGNTOP   指定靠顶部对齐
LVS_AUTOARRANGE  指定图标自动安排在大图标和小图标视图
LVS_EDITLABELS   允许项目文本进行编辑但是父窗口必须处理LVN_ENDLABELEDIT消息
LVS_ICON  指定是ICON视图
LVS_LIST  指定是列表视图
LVS_REPORT 指定是repoet风格
LVS_NOCOLUMNHEADER  指定在一个report视图列头不显示,但是默认下是显示的
LVS_NOLABELWRAP   在图标视图中单行显示项文本 ,缺省情况下项文本可以包含在图标列表
LVS_NOSCROLL   禁用scroll ,所有项必须在客户区域内 也就是我们可以看见的部分   
LVS_NOSORTHEADER   Specifies that column headers do not work like buttons. This style is useful if clicking a column header in report view does not carry out an action, such as sorting.
LVS_SMALLICON  指定大图标
LVS_SORTASCENDING  对项目文本按照升序方式排序
LVS_SORTDESCENDING  项目文本按照降序方式排序
LVS_SINGLESEL  在一个时间内仅仅允许一个项被选中 。默认情况下一次可以选中多个项 。
LVS_SHOWSELALWAYS    总是显示选择项 即使CListCtrl控件失去焦点
LVS_OWNERDRAWFIXED   允许窗体拥有者重回控件。列表控件发送 WM_DRAWITEM 到每一个项 。 他不会发送的消息到每个项 theDRAWITEMSTRUCT包含了将要重会的列表项的一些数据
下面是扩展风格:
LVS_EX_FULLROWSELECT  可以整行都选择   只针对于report
LVS_EX_GRIDLINES   控件有网格线
LVS_EX_CHECKBOXES  列表项前面有个复选框 CheckBox 
上面这几个是常用的 还有很多扩展风格用到的时候 直接去源文件看定义。

下面这个函数可以获得控件的风格 或者扩展风格: 
LONG GetWindowLong(       
  HWND hWnd,  // handle to window
  int nIndex  // offset of value to retrieve
);
下面这个函数可以设置控件的风格 或者扩展风格: 
LONG SetWindowLong(
  HWND hWnd,       // handle to window
  int nIndex,      // offset of value to set
  LONG dwNewLong   // new value
);


 假设有一个指向CListCtrl对象的指针 那么我们修改他的风格:
         DWORD style=::GetWindowLong(c->m_hWnd,GWL_STYLE)  ;//获得控件的Style
 ::SetWindowLong(c->m_hWnd,GWL_STYLE,style|LVS_REPORT |LVS_NOLABELWRAP|LVS_EDITLABELS)   ; //修改风格为report和可以加入图标
 ::SetWindowLong(c->m_hWnd,GWL_STYLE,LVS_REPORT |LVS_NOLABELWRAP|style)   ;
 DWORD styles = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES;  //新风格 网格和选中一行只支持report 
  c->SetExtendedStyle(styles) ;//设置扩展风格 其实在底层应该是调用了SetWindowLong进行风格的修改
插入列有2中方式 :可以通过位LVCOLUMN和直接插入文本
typedef struct _LVCOLUMN {
UINT mask;    //位掩码 指定结构体中的那几个成员是有效的 
int fmt;
int cx;
LPTSTR pszText;
int cchTextMax;
int iSubItem;
int iOrder;
int iImage;}
LVCOLUMN;


定义LVCOLUMN结构体并赋值,赋值后并且插入 具体去看看MSDN简单
LVCOLUMN lv1,lv2 ,lv3;
 lv1.mask=LVCF_FMT |LVCF_TEXT|LVCF_WIDTH  ;  //设置LVCOLUMN的位掩码
 lv1.pszText=_T("歌曲名字") ;//文本
 lv1.cx=100 ;  //列表宽是
 lv1.fmt=LVCFMT_LEFT  ;//文本居中显示
 lv2.mask=LVCF_FMT |LVCF_TEXT|LVCF_WIDTH  ;  //设置LVCOLUMN的位掩码
 lv2.pszText=_T("歌曲路径") ;//文本
 lv2.cx=nWidth-200 ;  //列表宽是
 lv2.fmt=LVCFMT_LEFT  ;//文本居中显示
 lv3.mask=LVCF_FMT |LVCF_TEXT|LVCF_WIDTH  ;  //设置LVCOLUMN的位掩码
 lv3.pszText=_T("歌曲长度") ;//文本
 lv3.cx=100 ;  //列表宽是
 lv3.fmt=LVCFMT_LEFT  ;//文本居中显示
 c->InsertColumn(1,&lv1) ;
 c->InsertColumn(3,&lv3) ;
 c->InsertColumn(2,&lv2) ;

插入项的时候要注意: 一定要先插入项,再设置项的文本。
 c->InsertItem(0,"ITEM1")  ;  //插入ITEM
 c->SetItemText(0,1,"subitem") ;//设置项目的文本 从1开始 因为0是项的索引      如果SubItem多的话那么依次往后加即可

处理CListCtrl控件时候常用到的消息:
NM_CLICK  当项目列表单击的时候发送  在程序中我们需要做相应的处理
NM_DBCLICK 当项目列表双击的时候发送 

但是我们要注意CListCtrl类中的2个模糊的函数 
POSITION GetFirstSelectedItemPosition( ) const;  //这个函数返回的是单击或者双击后  的位置   如果点击之处不在 项上面的话 那么 返回的 POSITION 是NULL  。  
如果返回的POSITION 不是NULL  那么调用
int GetNextSelectedItem( POSITION& pos ) const; //通过返回的POSITION 位置 来返回点击列表项的索引 。   

 

 


       
       

 


 

上一篇:使用NTDSXtract离线抓取Domain Hash


下一篇:java环境变量配置四种方法