久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2305|回復: 0
打印 上一主題 下一主題
收起左側

C++ Builder的拖放功能實現

[復制鏈接]
跳轉到指定樓層
樓主
ID:3721 發(fā)表于 2015-1-2 19:46 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
     視窗系統中的拖放功能大家一定非常熟悉了,如文件的轉移,拷貝等操作用鼠標輕輕一拖即可,在編寫程式中有時也用到拖放,那么怎么實現呢?現以C++ Builder5(簡稱CB5)為例,分析拖放功能的具體實現。

一.工具條的拖放

要實現拖放功能,首先必須了解幾個和拖放有關的屬性和方法, 對于TControl控件,CB5提供了三個屬性,DockSite,DragKind和DragMode。靈活運用這三個屬性會得到意想不到的效果。這三個屬性的意義是:

DockSite:指定當前控件是否接受Drag-and-Dock類型的操作

DragKind:拖放種類,分為dkDrag和dkDock兩種

DragMode:拖放模式,分為自動和手動模式兩種

其中Dock操作是指某控件脫離他的Parent,轉而成為另一個控件的Child,也就是兩個控件合并。若某一控件的DockSite為True,表明他接受執(zhí)行Dock操作的某控件,并成為他的Parent。

著名的Office工具條能隨意拖放,其實實現起來非常簡單:在Form上放一CoolBar控件,再在CoolBar控件上隨意放幾個ToolBar控件,他們的屬性設置代碼如下:

CoolBar1.DockSite=true;

ToolBar1.DragKind=dkDock;

ToolBar1.DragMode= dmAutomatic;

其他ToolBar的屬性設置和ToolBar1的屬性設置相同,編譯運行程式,拖動工具條試試,Cool極了吧。

二、所有兩上控件間的拖放

和此操作有關的幾個函數有:

BeginDrag:開始執(zhí)行拖放操作,如果控件的DragMode為dmManual,則必須調用此函數,如果DragMode為dmAutomatic,則不用調用。

OnDragOver:當被拖放的對象經過此控件時觸發(fā)此事件,其中的參數Accept表示是否接受拖放的對象。

OnDragDrop:當放下被拖放的對象時觸發(fā)此事件。

下面舉例說明拖放的實現過程:

在CB5中新建一工程,在Form1上放兩個ListBox,分別命名為ListBox1,ListBox2,打開ListBox1的Items屬性框,隨便輸入幾行字符串。

其屬性設置如下:

ListBox1->MultiSelect=true; // MultiSelect屬性設為true,表示能多選

ListBox1->DragMode= dmAutomatic;

ListBox2->MultiSelect=true;

ListBox2->DragMode= dmAutomatic; //兩個ListBox拖放事件相同,能互相拖放

ListBox2->OnDragOver= ListBox1DragOver;

ListBox2->OnDragDrop= ListBox1DragDrop;

ListBox2->OnStartDrag= ListBox1StartDrag;

在頭文件中設置兩個int型變量CurIndex,NewIndex

程式代碼如下:

//

#include < vcl.h >

#pragma hdrstop

#include \"unit1.h\"

#include \"FileCtrl.hpp\"

//

#pragma package(smart_init)

#pragma resource \"*.dfm\"

TForm1 *Form1;

//

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//

void __fastcall TForm1::ListBox1StartDrag(TObject *Sender, TDragObject *&DragObject)

{

//開始執(zhí)行拖放事件時記錄ListBox->ItemIndex;

CurIndex=((TListBox *)Sender)->ItemIndex;

}

//

void __fastcall TForm1::ListBox1DragDrop(TObject *Sender, TObject *Source, int X, int Y)

{

int index;

if(Sender Source) //如果Sender等于Source,表明在同一控件內執(zhí)行操作,本例用來交換ListBox中的任意兩個Items

{

NewIndex=Y/(ListBox1->ItemHeight);//得到拖放后的ItemIndex

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

NewIndex=NewIndex< ((TListBox *)Sender)- >Items->Count?

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

//執(zhí)行Move操作,移動Item

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

}

//如果Sender不等于Source,表明在兩個控件間執(zhí)行操作

//此例是將數據從一ListBox拖到另一個ListBox

else

{ //若只選中一項

if(((TListBox *)Source)->SelCount 1)

{

((TListBox *)Sender)->Items->Add(((TListBox *)Source)-> Items->Strings[((TListBox *)Source)->ItemIndex]);

((TListBox *)Source)->Items->Delete(((TListBox *)Source)-> ItemIndex);

}

//多選操作

if(((TListBox *)Source)->SelCount>=1)

{

//循環(huán)操作,測試哪些項被選中

for(index=0;index< ((TListBox *)Source)- >Items->Count; index++)

if(((TListBox *)Source)->Selected[index])

((TListBox *)Sender)->Items->Add(((TListBox *)Source)-> Items->Strings[index]);

//從后向前刪除Source控件中數據

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

if(((TListBox *)Source)->Selected[index])

((TListBox *)Source)->Items->Delete(index);

}

}

}

//

void __fastcall TForm1::ListBox1DragOver(TObject *Sender, TObject *Source,int X, int Y, TDragState State, bool &Accept)

{

//本例中如果原控件各目標控件都為ListBox控件,則接受拖放

Accept = Source->ClassNameIs(\"TListBox\")&& Sender->ClassNameIs(\"TListBox\");

}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久新视频 | 一级黄色影片在线观看 | 天天干天天操天天爽 | 韩日在线 | 国产视频福利在线观看 | 99日韩| 亚洲在线一区二区 | 国产韩国精品一区二区三区 | 久久69精品久久久久久国产越南 | 一区二区视屏 | 亚洲精品在线观 | 99精品国自产在线观看 | 日韩www| 蜜月aⅴ国产精品 | 男人的天堂在线视频 | 野狼在线社区2017入口 | 精品国产乱码久久久久久中文 | 国产精品国产成人国产三级 | 日韩精品一区二区三区免费观看 | 色综合一区二区 | 精品成人av | 一区二区三区国产精品 | 成人免费视频在线观看 | 一区二区中文字幕 | av电影一区二区 | 精品免费国产视频 | 91天堂网 | 久久综合久久综合久久综合 | 在线观看国产网站 | av在线免费观看网址 | 国产免费自拍 | 午夜免费精品视频 | 国产精品视频97 | 日韩欧美中文字幕在线观看 | 国产高清视频在线 | 亚洲欧美日韩精品久久亚洲区 | 国产亚洲一区二区三区 | 午夜精品久久久久久久久久久久久 | av午夜激情 | 免费在线观看黄网站 | 日韩欧美精品一区 |