⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 20000806005.htm

📁 C++Builder教学大全
💻 HTM
字号:
<HTML>

<HEAD>



<TITLE>在C++ Builder中实现拖放功能</TITLE>



<META content="MSHTML 5.00.2314.1000" name=GENERATOR>

</HEAD>

<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0 

vLink=#990099>



<div align="center">

  <table width="744" border="0" cellspacing="0" cellpadding="0" height="76">

    <tr> 

      <td> 

        <p align="center"><font size="3"><b><br>

          在C++ Builder中实现拖放功能</b></font></p>

        <p>Windows中的拖放功能大家一定很熟悉了,如文件的转移,拷贝等操作用鼠标轻轻一拖即可,在编写程序中有时也用到拖放,那么如何实现呢?现以C++ 

          Builder5(简称CB5)为例,分析拖放功能的具体实现。 </p>

        <p><font color="#a30004">一.工具条的拖放</font> 

        <p><font color="#ffffff">----</font> 要实现拖放功能,首先必须了解几个与拖放有关的属性和方法, 对于TControl控件,CB5提供了三个属性,DockSite,DragKind和DragMode。灵活运用这三个属性会得到意想不到的效果。这三个属性的意义是: 

        <p><font color="#ffffff">----</font> DockSite:指定当前控件是否接受Drag-and-Dock类型的操作<br>

          <font color="#ffffff">----</font> DragKind:拖放种类,分为dkDrag和dkDock两种<br>

          <font color="#ffffff">----</font> DragMode:拖放模式,分为自动和手动模式两种 

        <p><font color="#ffffff">----</font> 其中Dock操作是指某控件脱离它的Parent,转而成为另一个控件的Child,也就是两个控件合并。若某一控件的DockSite为True,表明它接受执行Dock操作的某控件,并成为它的Parent。 

        <p><font color="#ffffff">----</font> 著名的Office工具条可以随意拖放,其实实现起来很简单:在Form上放一CoolBar控件,再在CoolBar控件上随意放几个ToolBar控件,它们的属性设置代码如下: 

        <pre>CoolBar1.DockSite=true;

ToolBar1.DragKind=dkDock;

ToolBar1.DragMode= dmAutomatic;

</pre>

        <font color="#ffffff">----</font> 其它ToolBar的属性设置与ToolBar1的属性设置相同,编译运行程序,拖动工具条试试,Cool极了吧。 

        <p><font color="#a30004">二、任何两上控件间的拖放</font> 

        <p><font color="#ffffff">----</font> 与此操作有关的几个函数有: 

        <p><font color="#ffffff">----</font> BeginDrag:开始执行拖放操作,如果控件的DragMode为dmManual,则必须调用此函数,如果DragMode为dmAutomatic,则不用调用。 

        <p><font color="#ffffff">----</font> OnDragOver:当被拖放的对象经过此控件时触发此事件,其中的参数Accept表示是否接受拖放的对象。 

        <p><font color="#ffffff">----</font> OnDragDrop:当放下被拖放的对象时触发此事件。 

        <p><font color="#ffffff">----</font> 下面举例说明拖放的实现过程: 

        <p><font color="#ffffff">----</font> 在CB5中新建一工程,在Form1上放两个ListBox,分别命名为ListBox1,ListBox2,打开ListBox1的Items属性框,随便输入几行字符串。 

        <p><font color="#ffffff">----</font> 其属性设置如下: 

        <pre>ListBox1-&gt;MultiSelect=true;  

// MultiSelect属性设为true,表示可以多选

ListBox1-&gt;DragMode= dmAutomatic;

ListBox2-&gt;MultiSelect=true;

ListBox2-&gt;DragMode= dmAutomatic;

//两个ListBox拖放事件相同,可以互相拖放

ListBox2-&gt;OnDragOver= ListBox1DragOver; 

ListBox2-&gt;OnDragDrop= ListBox1DragDrop;

ListBox2-&gt;OnStartDrag= ListBox1StartDrag;

在头文件中设置两个int型变量CurIndex,NewIndex

程序代码如下:

//-----------------------------------------------------------



#include &lt; vcl.h &gt;

#pragma hdrstop



#include &quot;unit1.h&quot;

#include &quot;FileCtrl.hpp&quot;

//-----------------------------------------------------------

#pragma package(smart_init)

#pragma resource &quot;*.dfm&quot;

TForm1 *Form1;

//----------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}



//----------------------------------------------------------

void __fastcall TForm1::ListBox1StartDrag(TObject *Sender,

      TDragObject *&amp;DragObject)

{

      //开始执行拖放事件时记录ListBox-&gt;ItemIndex;

      CurIndex=((TListBox *)Sender)-&gt;ItemIndex;

}



//----------------------------------------------------------

void __fastcall TForm1::ListBox1DragDrop

(TObject *Sender, TObject *Source,

      int X, int Y)

{

       int index;

 //如果Sender等于Source,表明在同一控件内执行操作

 //本例用来交换ListBox中的任意两个Items

  if(Sender==Source)

    {

    //得到拖放后的ItemIndex

   NewIndex=Y/(ListBox1-&gt;ItemHeight);

  //如果ItemIndex大于ListBox中的Item数,表示拖到最后一个

  NewIndex=NewIndex&lt; ((TListBox *)Sender)- &gt;Items-&gt;Count?

    NewIndex:((TListBox *)Sender)-&gt;Items-&gt;Count-1;

  //执行Move操作,移动Item

  ((TListBox *)Sender)-&gt;Items-&gt;Move(CurIndex,NewIndex);

       }

       //如果Sender不等于Source,表明在两个控件间执行操作

       //此例是将数据从一ListBox拖到另一个ListBox

       else

       {

  //若只选中一项

  if(((TListBox *)Source)-&gt;SelCount==1)

  {

    ((TListBox *)Sender)-&gt;Items-&gt;Add(((TListBox *)Source)-&gt;

    Items-&gt;Strings[((TListBox *)Source)-&gt;ItemIndex]);

    ((TListBox *)Source)-&gt;Items-&gt;Delete(((TListBox *)Source)-&gt;

    ItemIndex);

  }

  //多选操作

  if(((TListBox *)Source)-&gt;SelCount&gt;=1)

  {

     //循环操作,测试哪些项被选中

     for(index=0;index&lt; ((TListBox *)Source)- &gt;Items-&gt;Count;

       index++)

   if(((TListBox *)Source)-&gt;Selected[index])

  ((TListBox *)Sender)-&gt;Items-&gt;Add(((TListBox *)Source)-&gt;

       Items-&gt;Strings[index]);

    //从后向前删除Source控件中数据

 for(index=((TListBox *)Source)-&gt;Items-&gt;Count-1;index&gt;=0;

 index--)

     if(((TListBox *)Source)-&gt;Selected[index])

    ((TListBox *)Source)-&gt;Items-&gt;Delete(index);

  }



       }

}

//----------------------------------------------------------



void __fastcall TForm1::ListBox1DragOver

(TObject *Sender, TObject *Source,

 int X, int Y, TDragState State, bool &amp;Accept)

{

 //本例中如果原控件各目标控件都为ListBox控件,则接受拖放

Accept = Source-&gt;ClassNameIs(&quot;TListBox&quot;)&amp;&amp; 

      Sender-&gt;ClassNameIs(&quot;TListBox&quot;);

}

运行程序,用鼠标拖拖看。

//----------------------------------------------------------

本程序在PWin98+BCB5下编译运行通过

</pre>

        <p>骆名群 

      </td>

    </tr>

  </table>

 

</div>

</BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -