关于ListView的图标排列问题

时间:2020-12-03 19:33:16
我现在想自定义排列ListView的图标显示   最好能达到下面的效果,可以随意拖动改变位置的   请问有什么解决方法么?大虾们来帮帮小弟啊
[img=http://b51.photo.store.qq.com/http_imgload.cgi?/rurl4_b=4a8b2d7fc91dd9abfa2a4a56756310ba21bf1769bef7481e8eb905ae25423e8da08810b3dff5a8bba1d9f4d1445144b7771eaaa83505b3876167175018e22f951699dde6f7e246e9adf8a234a417643b6dd73f6a][/img]

4 个解决方案

#1


顶贴啊 在线等呢 大虾们

#2


看不到你的图. 如果想拖动ListView中的图标, 这样做:

首先添加一个变量, 再设置一下ListView的属性:
TPoint ptPre;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    ListView1->DragCursor = crDefault;
    ListView1->IconOptions->AutoArrange = false;
}


然后在ListView的OnDragOver, OnDragDrop, OnMouseDown事件中添加以下代码:
void __fastcall TForm1::ListView1DragOver(TObject *Sender, TObject *Source,
      int X, int Y, TDragState State, bool &Accept)
{
    Accept = Source->ClassNameIs("TListView");
}

// ---------------------------------------------------------------------------
//
void __fastcall TForm1::ListView1DragDrop(TObject *Sender, TObject *Source,
      int X, int Y)
{
    TPoint pt(X - ptPre.x, Y - ptPre.y);
    TListItem *pItem = ((TListView *)Source)->Selected;
    pItem->SetPosition(pt);
}

// ---------------------------------------------------------------------------
//
void __fastcall TForm1::ListView1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    if (Button == mbLeft)
    {
        TListItem *pItem = ((TListView *)Sender)->GetItemAt(X, Y);
        if(pItem != NULL)
        {
            ((TListView *)Sender)->BeginDrag(false, 0);
            TRect rct = pItem->DisplayRect(drSelectBounds);
            ptPre.x = X - rct.Left - 3;
            ptPre.y = Y - rct.Top;
            Caption = String().sprintf("%d,%d", ptPre.x, ptPre.y);
        }
    }
}

#3


谢谢楼上的回答啊 但是这个效果不是我要的那种效果   简单的说 就是 比如从数据库中读取十个点的坐标,然后按照坐标把图标设置到相应的位置(十个坐标点可能是形成一个圆形,那么图标就排成圆形)能有什么好的解决方法么

#4


简单说, 就是利用 TListItem的SetPosition方法. 至于坐标, 你自己去计算就行了.

#1


顶贴啊 在线等呢 大虾们

#2


看不到你的图. 如果想拖动ListView中的图标, 这样做:

首先添加一个变量, 再设置一下ListView的属性:
TPoint ptPre;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    ListView1->DragCursor = crDefault;
    ListView1->IconOptions->AutoArrange = false;
}


然后在ListView的OnDragOver, OnDragDrop, OnMouseDown事件中添加以下代码:
void __fastcall TForm1::ListView1DragOver(TObject *Sender, TObject *Source,
      int X, int Y, TDragState State, bool &Accept)
{
    Accept = Source->ClassNameIs("TListView");
}

// ---------------------------------------------------------------------------
//
void __fastcall TForm1::ListView1DragDrop(TObject *Sender, TObject *Source,
      int X, int Y)
{
    TPoint pt(X - ptPre.x, Y - ptPre.y);
    TListItem *pItem = ((TListView *)Source)->Selected;
    pItem->SetPosition(pt);
}

// ---------------------------------------------------------------------------
//
void __fastcall TForm1::ListView1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    if (Button == mbLeft)
    {
        TListItem *pItem = ((TListView *)Sender)->GetItemAt(X, Y);
        if(pItem != NULL)
        {
            ((TListView *)Sender)->BeginDrag(false, 0);
            TRect rct = pItem->DisplayRect(drSelectBounds);
            ptPre.x = X - rct.Left - 3;
            ptPre.y = Y - rct.Top;
            Caption = String().sprintf("%d,%d", ptPre.x, ptPre.y);
        }
    }
}

#3


谢谢楼上的回答啊 但是这个效果不是我要的那种效果   简单的说 就是 比如从数据库中读取十个点的坐标,然后按照坐标把图标设置到相应的位置(十个坐标点可能是形成一个圆形,那么图标就排成圆形)能有什么好的解决方法么

#4


简单说, 就是利用 TListItem的SetPosition方法. 至于坐标, 你自己去计算就行了.