请问如何在CListCtrl中的第一列不显示图片,并且第一列文字在列表中左对齐??

时间:2021-09-09 19:32:26
各位大虾,小弟是新人,而且是VC新手。
虽然用了一年多了,可是对VC了解还是不够深。希望以后各位多多帮助。谢谢了先!!

现在我碰到一个问题,
是关于CListCtrl列表显示的,客户要求的效果是列表共有4列,能够拖拽,行选择,
在第2列显示图标和文件名(左对齐),第一列显示文件更新时间(左对齐),第三列显示文件大小(右对齐),第四列显示更新用户名(左对齐)。
目前碰到的问题是在第一列显示文字时无法显示在列表格的最左边,在文字前面总有一快空白的地方。很是奇怪阿!!!
希望各位高手给看看阿!!
下面是我写的代码,麻烦各位给检查检查看看那不对阿!!
//创建列表
CListCtrl m_list_cFileList = new CListCtrl();
//创建图标列表
CImageList m_pcImageList = new CImageList();
m_pcImageList->Create(16, 16, ILC_COLOR32|ILC_MASK|ILC_COLORDDB, 0, 4);
//列表和图标列表关联
m_list_cFileList.SetImageList( m_pcImageList, LVSIL_SMALL );
//列表设置模式
m_list_cFileList.SetExtendedStyle(m_list_cFileList.GetExtendedStyle()|LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|LVS_EX_SUBITEMIMAGES);  
//根据文件后缀名取得对应图标
//csFileName 文件名
SHFILEINFO shfi;
memset(&shfi,0,sizeof(shfi));
SHGetFileInfo(csFileName,
FILE_ATTRIBUTE_NORMAL,
&shfi,
sizeof(shfi),
SHGFI_ICON|SHGFI_SMALLICON|SHGFI_USEFILEATTRIBUTES);
//把图标添加到图标列表中
int iImgIdx = m_pcImageList->Add(shfi.hIcon );
//列表添加10行
for( int i == 0 ; i < 10;i++)
{
    //添加一列
    m_list_cFileList.InsertItem(i,NULL,-1);
    m_list_cFileList.SetItem(i,m_2,LVIF_TEXT|LVIF_IMAGE,csFileName,iImgIdx,NULL,NULL,NULL);
 ...........
}

我目前感到疑惑的是在列表和图标列表关联时是不是默认在第一列就要显示图标呢?
如果是的话怎样控制呢?
谢谢各位大虾!!

5 个解决方案

#1


是的,会留有一个图标的位置。
如果想去掉,我原来也试验过,需要慢慢调,而且方法不太好,你看看吧
主要用SetItem这个函数
其中的LVITEM结构中
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
} LVITEM, *LPLVITEM; 

要注意mask和iIndent
mask中要有LVIF_INDENT
iIndent我记得当时填-1,-2之类的。

#2


谢谢上面的大虾!!
我先试试看。
效果出来了就给分

#3


UP

#4


SetOrderArray将第一列和第二列对调,使第二列为主列

#5


上面两位大虾告诉的方法哦都尝试了一下,
 Ariesman(超然)告诉的方法在设置为-2的时候在第一列显示的文字不全。比如第一行显示“系统管理员“第二行显示“李(汉字)”。这时第二行的文字列无法全表示出来。
 vcmute(横秋)告诉的方法也有一个问题,就是只能两行互换,如果四行互换现实的效果就不对了。
比如第一列换到第四列,第二列换到第一列,第四列换到第二列。

不知道,还有没有其他的方法啊?
谢谢了阿,跪求了!!如果哪位大虾能给点源代码,小弟不胜感激阿!!
跪拜跪拜

#1


是的,会留有一个图标的位置。
如果想去掉,我原来也试验过,需要慢慢调,而且方法不太好,你看看吧
主要用SetItem这个函数
其中的LVITEM结构中
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
} LVITEM, *LPLVITEM; 

要注意mask和iIndent
mask中要有LVIF_INDENT
iIndent我记得当时填-1,-2之类的。

#2


谢谢上面的大虾!!
我先试试看。
效果出来了就给分

#3


UP

#4


SetOrderArray将第一列和第二列对调,使第二列为主列

#5


上面两位大虾告诉的方法哦都尝试了一下,
 Ariesman(超然)告诉的方法在设置为-2的时候在第一列显示的文字不全。比如第一行显示“系统管理员“第二行显示“李(汉字)”。这时第二行的文字列无法全表示出来。
 vcmute(横秋)告诉的方法也有一个问题,就是只能两行互换,如果四行互换现实的效果就不对了。
比如第一列换到第四列,第二列换到第一列,第四列换到第二列。

不知道,还有没有其他的方法啊?
谢谢了阿,跪求了!!如果哪位大虾能给点源代码,小弟不胜感激阿!!
跪拜跪拜