C++ Builder 中对listview模拟复制某个单元格的内容

来源:互联网 发布:神乃木庄龙 知乎 编辑:程序博客网 时间:2024/06/06 23:17

实现listview的双击事件OnDblClick()添加如下代码:


方法一:

POINT ptt;
GetCursorPos(&ptt); //获取屏幕相对坐标
long nPos = ptt.x; //获取X轴长度
if( lv2->SelCount <= 0 ){ return; } //如果点击listview空白处之间返回


int nIndex = 0;//索引
long nTotal = lv2->Left+pnl2->Width+3;//计算屏幕坐标距离左边的长度作为初始值


for(int i=0;i<lv2->Columns->Count;i++)
{
TListColumn *pCol = lv2->Column[i];
if( pCol->Width == 1 )//主要针对listview第一列是checkbox
{
nTotal+= pCol->Width;
continue;
}


if( nPos > nTotal )
{
nTotal+= 1;//每2个格子之间的宽度算1
nTotal+= pCol->Width;
if( nTotal >= nPos )
{
int nTemp = nTotal-pCol->Width;
if( nPos >= nTemp+1 && nPos <= nTotal )
{
nIndex = i;
}
else
{
nIndex = i-1;
}
break;
}
}
}


nIndex = nIndex-1; //减掉第一列listview第一列是给checkbox预留的所以要从第二列开始算起
if( nIndex == -1 ) { return; }


String strValue = "";
try
{
strValue = lv2->Items->operator[](lv2->Selected->Index)->SubItems->Strings[nIndex];
}catch(...)
{
strValue="";
}


方法二:

int nIndex = 0;
TPoint Pos = lv2->ScreenToClient(Mouse->CursorPos);
Pos.x += GetScrollPos(lv2->Handle, SB_HORZ);
for(int i=0; i<lv2->Columns->Count; i++)
{
Pos.x -= ListView_GetColumnWidth(lv2->Handle, i);
if (Pos.x < 0)
{
nIndex = i;
break;
        }
}


nIndex = nIndex-1; //减掉第一列listview第一列是给checkbox预留的所以要从第二列开始算起
if( nIndex == -1 ) { return; }


String strValue = "";
try
{
strValue = lv2->Items->operator[](lv2->Selected->Index)->SubItems->Strings[nIndex];
}catch(...)
{
strValue="";
}
Clipboard()->Clear();
Clipboard()->SetTextBuf(strValue.c_str());

最终将复制单元格的内容保存到剪切板中,如果Clipboard报错未定义,引入头文件:#include <Vcl.Clipbrd.hpp>

lv2是listview控件的name。

1 0