版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第十二章Win32環(huán)境程序設(shè)計(jì)這一章節(jié)可以說(shuō)是本書(shū)精華之一,Win32程序設(shè)計(jì)算是比較復(fù)雜的部分,但是我們以最簡(jiǎn)單的敘述帶領(lǐng)著大家進(jìn)入Win32程序設(shè)計(jì)的殿堂,讓你寫(xiě)出來(lái)的程序具有一定的水平以上。若能將本章與下一章的技巧靈活運(yùn)用,更能讓大家寫(xiě)出高階的窗口程序。1第十二章Win32環(huán)境程序設(shè)計(jì)這一章節(jié)可以說(shuō)是本書(shū)精華大綱12-1.檔案總管的接口12-2.標(biāo)頭控制組件12-3.進(jìn)度狀態(tài)顯示組件12-4.軌跡追蹤列12-5.上下控制組件12-6.日期時(shí)間12-7.熱鍵組件的使用(HotKey)12-8.常駐在SystemTray的程序本章習(xí)題2大綱12-1.檔案總管的接口212-1.檔案總管的接口提到Win32的程序設(shè)計(jì),最重要的范例就是檔案總管。整個(gè)檔案總管都是使用Win32的接口來(lái)完成。而我們?cè)谶@一章以及下一章,也都會(huì)圍繞著檔案總管來(lái)介紹大部分內(nèi)容。下圖中就是檔案總管的接口,在這個(gè)接口里,主要組件有ListView、TreeView、Splitter、以及StatusBar這四種VCL組件,SplitterTreeViewListViewStatusBar312-1.檔案總管的接口提到Win32的程序設(shè)計(jì),最重要的12-1.檔案總管的接口窗體檢視組件(ListView)范例12-1在范例12-1,我們的接口相當(dāng)簡(jiǎn)單,除了一個(gè)輸入數(shù)據(jù)的接口外,就是一個(gè)ListView。除了提到這些可看見(jiàn)的VCL組件外,我們還有放入一個(gè)Popupmenu以及一個(gè)ImageList在這個(gè)范例中。Popupmenu主要是提供鼠標(biāo)右鍵的功能選單,,而ImageList則是要提供一些Image給ListView使用。412-1.檔案總管的接口窗體檢視組件(ListView)412-1.檔案總管的接口窗體檢視組件(ListView)新增Column個(gè)數(shù)512-1.檔案總管的接口窗體檢視組件(ListView)512-1.檔案總管的接口窗體檢視組件(ListView)ViewStyle的不同大圖示(vsIcon)小圖示(vsSmallIcon)清單(List)詳細(xì)列表(Report)612-1.檔案總管的接口窗體檢視組件(ListView)612-1.檔案總管的接口窗體檢視組件(ListView)范例12-1執(zhí)行結(jié)果712-1.檔案總管的接口窗體檢視組件(ListView)712-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)TreeView是目前檔案總管中的重要組件之一,在檔案總管中TreeView負(fù)責(zé)顯示從桌面開(kāi)始的所有樹(shù)狀結(jié)構(gòu)。在這一小節(jié)里,我們將會(huì)利用三個(gè)范例讓各位練習(xí)TreeView的各項(xiàng)使用實(shí)例。談到Tree的使用,就必須談到什么是『根節(jié)點(diǎn)』、『父節(jié)點(diǎn)』、『子節(jié)點(diǎn)』、以及『葉節(jié)點(diǎn)』。根節(jié)點(diǎn)就是我們所謂的『root』,他是在整個(gè)Tree的最上方,以檔案總管來(lái)說(shuō),根節(jié)點(diǎn)就是『桌面』父節(jié)點(diǎn)就是這個(gè)節(jié)點(diǎn)的底下還有一個(gè)以上的節(jié)點(diǎn)子節(jié)點(diǎn)就是這個(gè)節(jié)點(diǎn)的上一層還有節(jié)點(diǎn)葉節(jié)點(diǎn)就代表這個(gè)節(jié)點(diǎn)已經(jīng)是這支樹(shù)的最后一個(gè)節(jié)點(diǎn)812-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)812-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-2:利用簡(jiǎn)單的程序來(lái)控制TreeView的各項(xiàng)動(dòng)作。我們主要是使用靜態(tài)的方式將一棵樹(shù)建立起來(lái)。這棵樹(shù)是利用BCB提供的接口去產(chǎn)生。912-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)912-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-2執(zhí)行結(jié)果1012-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)112-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-3:在程序中建構(gòu)一個(gè)靜態(tài)的TreeView在范例12-3,我們也是靜態(tài)產(chǎn)生Tree,但是這次我們不是從BCB的接口中產(chǎn)生,我們是從程序代碼中產(chǎn)生。在范例12-3的接口中,全部都跟范例12-2一模一樣。程序中,我們宣告了三個(gè)TreeNode(兩個(gè)也可以),經(jīng)由這三個(gè)TreeNode之間的相互關(guān)系,我們完成了整顆樹(shù)的建立。在建樹(shù)的程序代碼方面并不難,比較特別的就是要回到上一層我們使用的是『parent=parentParent』這樣的方法來(lái)取得上一層Node的內(nèi)存地址。至于一開(kāi)始我們有保留Root的地址這只是一個(gè)習(xí)慣,因?yàn)閺腂CB中也是可以判斷哪個(gè)Node是Root,在范例12-3中這樣做只是為了方便以及寫(xiě)程序者的習(xí)慣。1112-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)112-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-3:程序代碼void__fastcallTForm1::FormCreate(TObject*Sender){TTreeNode*root,*parent,*son;root=TreeView1->Items->Add(NULL,"Root");root->ImageIndex=0;root->SelectedIndex=1;root->StateIndex=-1;parent=root;son=TreeView1->Items->AddChild(parent,"Parent1");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=-1;parent=son;son=TreeView1->Items->AddChild(parent,"Son_1_1");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=0;son=TreeView1->Items->AddChild(parent,"Son_1_2");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=-1;parent=parent->Parent;son=TreeView1->Items->AddChild(parent,"Parent2");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=-1;parent=son;son=TreeView1->Items->AddChild(parent,"Son_2_1");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=-1;parent=son;son=TreeView1->Items->AddChild(parent,"Son_2_1_1");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=1;parent=parent->Parent->Parent;son=TreeView1->Items->AddChild(parent,"Parent3");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=-1;}1212-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)v12-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-4:在程序中建構(gòu)一個(gè)TreeView,主要程序代碼我們分成三個(gè)部分第一部份是動(dòng)態(tài)新增所需要的變量宣告,這部分是宣告在main.cpp的上方,歸類于全域變數(shù)第二部份就是有關(guān)新增/刪除TreeNode部分的程序代碼最后一部分就是一些瑣碎的功能,這些程序代碼包括了展開(kāi)以及收合的功能,也有在StatusBar上面顯示目前的狀況,還有一個(gè)就是選擇要不要顯示Root。1312-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)112-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-4:程序代碼宣告//宣告兩個(gè)變量..用來(lái)存放RootAddress和Node的AddressTTreeNode*root=NULL;TTreeNode*node=NULL;1412-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)/12-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-4:程序代碼動(dòng)態(tài)新增Nodevoid__fastcallTForm1::N1Click(TObject*Sender){//新增一個(gè)Node,在新增的時(shí)候會(huì)自動(dòng)判斷是不是新增Root,在新增的時(shí)候利用InputQuery來(lái)當(dāng)作輸入接口AnsiStringBuf;if(root==NULL){//如果現(xiàn)在root還是NULL的話..表示要新增一個(gè)rootif(InputQuery("輸入","請(qǐng)輸入TreeNode的名稱",Buf)){//使用InputQuery當(dāng)作輸入接口root=TreeView1->Items->AddChild(NULL,Buf);//將新增的Node加入到TreeView中root->ImageIndex=0;root->SelectedIndex=1;root->StateIndex=-1;//設(shè)定該Node的一些基本屬性StatusBar1->SimpleText="新增Root節(jié)點(diǎn)";//在StatusBar顯示目前的運(yùn)作情況TreeView1->AlphaSort();//新增之后利用AlphaSort對(duì)整個(gè)Tree排序}}else{//新增一般的Node//必須得先選一個(gè)node才能繼續(xù)產(chǎn)生Child,不然如果沒(méi)有Parent那來(lái)的Childif(TreeView1->Selected!=NULL){//使用InputQuery當(dāng)作輸入接口if(InputQuery("輸入","請(qǐng)輸入TreeNode的名稱",Buf)){//將新增的Node加入到TreeView中node=TreeView1->Items->AddChildFirst(TreeView1->Selected,Buf);node->ImageIndex=2;node->SelectedIndex=3;node->StateIndex=-1;//設(shè)定該Node的一些基本屬性StatusBar1->SimpleText="新增一個(gè)Node";//在StatusBar顯示目前的運(yùn)作情況TreeView1->AlphaSort();//新增之后利用AlphaSort對(duì)整個(gè)Tree排序}}}}1512-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)v12-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-4:程序代碼動(dòng)態(tài)刪除Nodevoid__fastcallTForm1::N2Click(TObject*Sender){if(TreeView1->Selected!=NULL){//如果有Node被選取..也選擇要?jiǎng)h除才執(zhí)行if(TreeView1->Selected==root){//判斷是不是RootTreeView1->Selected->Delete();root=NULL;//如果是root被刪除..要將root的point設(shè)成nullStatusBar1->SimpleText="刪除Root節(jié)點(diǎn)";}else{TreeView1->Selected->Delete();StatusBar1->SimpleText="刪除一個(gè)Node";}}}1612-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)v12-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)SortAlphaSort:根據(jù)我們每個(gè)Node的Caption中的值去做排序CustomSort:讓我們自己寫(xiě)函式去做排列SortTypestBoth:當(dāng)Date或是Text有任何一種改變時(shí)就重新SortstDate:當(dāng)Node的數(shù)據(jù)改變時(shí)就重新Sort一次stNone:永遠(yuǎn)不排序stText:當(dāng)Node的Text改變時(shí)重新Sort1712-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)112-1.檔案總管的接口分隔組件(Splitter)分隔組件最主要的功能就是讓兩個(gè)組件在你拉動(dòng)的時(shí)候自動(dòng)分配組件的大小。例如在檔案總管中,我們可以將光標(biāo)停放在TreeView和ListView的中間,接著游標(biāo)就會(huì)變成一個(gè)雙箭頭的光標(biāo),然后我們就可以按著鼠標(biāo)的左鍵左右移動(dòng)鼠標(biāo),這時(shí)候TreeView和ListView的窗口會(huì)隨著鼠標(biāo)的移動(dòng)自動(dòng)改變大小。拉動(dòng)之后可以自動(dòng)調(diào)整大小1812-1.檔案總管的接口分隔組件(Splitter)拉動(dòng)之12-1.檔案總管的接口狀態(tài)列組件(StatusBar)顧名思義就是將一些訊息顯示在這個(gè)Bar上面,在檔案總管中就是在檔案總管畫(huà)面的最下方。范例12-6StatusBar基本應(yīng)用void__fastcallTForm1::Button1Click(TObject*Sender){StatusBar1->SimpleText="你剛剛按下了Button1";}//void__fastcallTForm1::Button2Click(TObject*Sender){StatusBar1->SimpleText="你剛剛按下了Button2";}//void__fastcallTForm1::Button3Click(TObject*Sender){StatusBar1->SimpleText="你剛剛按下了Button3";}//void__fastcallTForm1::Edit1Change(TObject*Sender){StatusBar1->SimpleText="你剛剛修改了Edit1";}//void__fastcallTForm1::Edit2Change(TObject*Sender){StatusBar1->SimpleText="你剛剛修改了Edit2";}1912-1.檔案總管的接口狀態(tài)列組件(StatusBar)v12-1.檔案總管的接口狀態(tài)列組件(StatusBar)范例12-7:StatusBar進(jìn)階應(yīng)用使用一個(gè)按鈕、一個(gè)Edit、一個(gè)Image、以及一個(gè)StatusBar。在StatusBar上總共有四個(gè)字段,跟上一個(gè)范例不一樣。在StatusBar上面按下鼠標(biāo)右鍵,選擇『PanelsEditor』會(huì)出現(xiàn)StatusBar的Panel編輯畫(huà)面。2012-1.檔案總管的接口狀態(tài)列組件(StatusBar)212-1.檔案總管的接口狀態(tài)列組件(StatusBar)范例12-7:程序代碼(PartI)void__fastcallTForm1::Button1MouseDown(TObject*Sender,
TMouseButtonButton,TShiftStateShift,intX,intY)
{StatusBar1->Panels->Items[0]->Text="你按下了Button1";}//void__fastcallTForm1::Button1MouseUp(TObject*Sender,TMouseButtonButton,TShiftStateShift,intX,intY)
{StatusBar1->Panels->Items[0]->Text="你沒(méi)按下Button1";}//void__fastcallTForm1::Edit1Change(TObject*Sender)
{StatusBar1->Panels->Items[1]->Text="Edit1的文字是:"+Edit1->Text;}//void__fastcallTForm1::FormDragDrop(TObject*Sender,TObject*Source,intX,intY)
{//設(shè)定Form上的DragDrop的Function,主要是用來(lái)讓Image在Form上可以做Drag的動(dòng)作TImage*buf=(TImage*)Source;buf->Left=X;buf->Top=Y;}2112-1.檔案總管的接口狀態(tài)列組件(StatusBar)v12-1.檔案總管的接口狀態(tài)列組件(StatusBar)范例12-7:程序代碼(PartII)void__fastcallTForm1::FormDragOver(TObject*Sender,TObject*Source,
intX,intY,TDragStateState,bool&Accept)
{Accept=true;//讓Form可以被允許DragOver}//void__fastcallTForm1::Image1StartDrag(TObject*Sender,TDragObject*&DragObject)
{StatusBar1->Panels->Items[2]->Text="正在拉圖片";//當(dāng)啟動(dòng)Drag的時(shí)候顯示"正在拉圖片"}//void__fastcallTForm1::Image1EndDrag(TObject*Sender,TObject*Target,
intX,intY)
{StatusBar1->Panels->Items[2]->Text="沒(méi)在拉圖片";//結(jié)束Drag的時(shí)候顯示"沒(méi)在拉圖片"}//void__fastcallTForm1::FormMouseMove(TObject*Sender,TShiftStateShift,
intX,intY)
{//利用Form上面的MouseMove事件抓取鼠標(biāo)光標(biāo),并且在StatusBar上將光標(biāo)顯示出來(lái)AnsiStringBuf;Buf="("+IntToStr(X)+","+IntToStr(Y)+")";StatusBar1->Panels->Items[3]->Text="鼠標(biāo)光標(biāo)(X,Y):"+Buf;}2212-1.檔案總管的接口狀態(tài)列組件(StatusBar)v12-1.檔案總管的接口狀態(tài)列組件(StatusBar)范例12-7執(zhí)行結(jié)果2312-1.檔案總管的接口狀態(tài)列組件(StatusBar)212-2.標(biāo)頭控制組件標(biāo)頭控制組件所提供的功能,一般來(lái)說(shuō)我們都會(huì)直接利用ListView來(lái)完成,而不是單純的去拉一個(gè)標(biāo)頭控制組件下來(lái)用。因?yàn)镠eaderControl一般都是用來(lái)區(qū)分是不是同類型的資料,例如在ListView中我們顯示檔案的話,文件名就會(huì)集體放在檔名那一個(gè)Column,檔案大小也都會(huì)放在同一個(gè)Column……等,所以才會(huì)說(shuō)大部分的使用都是利用ListView來(lái)完成。但是如果想要在Header部分加上一些圖片等花俏的功能,還是得使用HeaderControl2412-2.標(biāo)頭控制組件標(biāo)頭控制組件所提供的功能,一般來(lái)說(shuō)我12-3.進(jìn)度狀態(tài)顯示組件我們?cè)诎惭b應(yīng)用程序(或是使用一些應(yīng)用程序)的過(guò)程中,常常會(huì)有一條光棒跑出來(lái)告訴我們目前工作正進(jìn)行了多少百分比,這個(gè)組件我們稱做進(jìn)度狀態(tài)列組件。進(jìn)度狀態(tài)列組件可以給使用程序的使用者非常高層次的訊息(可以馬上了解現(xiàn)在的情況),也可以讓使用者預(yù)估時(shí)間,也可以增加整個(gè)程序UserFriendly的程度。在BorlandC++Builder6中,有『ProgressBar』、『Cgauge』這兩個(gè)組件可以用來(lái)表示目前的完成度為何,其中ProgressBar位在Win32的頁(yè)面中,而Cgauge在Sample這一頁(yè)里。2512-3.進(jìn)度狀態(tài)顯示組件我們?cè)诎惭b應(yīng)用程序(或是使用一些12-3.進(jìn)度狀態(tài)顯示組件范例12-9:ProgressBar&CGauge操作實(shí)例ProgressBar重要屬性說(shuō)明屬性說(shuō)明MaxProgressBar跑到100%時(shí)的那個(gè)值。MinProgressBar在0%時(shí)的那個(gè)值。Orientation有Horizontal和Vertical兩種不同的屬性值,主要是用來(lái)決定ProgressBar是要往右增加或是往上增加。Position決定目前ProgressBar的光棒的所在位置。Smooth決定移動(dòng)的光棒要用平滑的模式或是一格一格的模式呈現(xiàn)出來(lái)。2612-3.進(jìn)度狀態(tài)顯示組件范例12-9:ProgressB12-3.進(jìn)度狀態(tài)顯示組件范例12-9:ProgressBar&CGauge操作實(shí)例CGauge重要屬性說(shuō)明屬性說(shuō)明BackColorCGauge在顯示ProgressBar的地方的顏色Color除了ProgressBar的地方的顏色。如果ProgressBar不是標(biāo)準(zhǔn)的長(zhǎng)條狀,就有可能會(huì)需要用到Color這個(gè)屬性。ForeColorProgressBar本身的顏色。KindCGauge的表示種類,有『HorizontalBar』、『Needle』、『Pie』、『Text』、以及『VerticalBar』這五種不同的表示方法。MaxValueProgressBar跑到100%時(shí)的那個(gè)值。MinValueProgressBar在0%時(shí)的那個(gè)值。Progress決定目前ProgressBar的光棒的所在位置。跟ProgressBar這個(gè)組件的Position屬性功能一樣。ShowText決定是否要在ProgressBar上面顯示出目前完成的百分比數(shù)字。2712-3.進(jìn)度狀態(tài)顯示組件范例12-9:ProgressB12-3.進(jìn)度狀態(tài)顯示組件范例12-9:ProgressBar&CGauge操作實(shí)例執(zhí)行結(jié)果2812-3.進(jìn)度狀態(tài)顯示組件范例12-9:ProgressB12-3.進(jìn)度狀態(tài)顯示組件不管在執(zhí)行ProgressBar或是CGauge的時(shí)候,整個(gè)程序幾乎都陷入了停頓狀態(tài),也就是停止響應(yīng)﹔反過(guò)來(lái)說(shuō),當(dāng)我們需要使用到ProgressBar或是CGauge的功能時(shí),通常也是因?yàn)檎谂芤粋€(gè)非常大的循環(huán)。現(xiàn)在有一個(gè)問(wèn)題產(chǎn)生了,不管是在跑一個(gè)非常大的循環(huán)(CPU使用率100%)或是跑Progress的組件,都會(huì)讓程序停止響應(yīng),這時(shí)候該怎么辦?我們?cè)谶@邊將提出一個(gè)簡(jiǎn)單的解決方案『ApplicationProcessMessages()』這個(gè)函式,這個(gè)函式可以讓我們的接口程序在執(zhí)行中取得一些CPUTime,也因?yàn)檫@樣,我們的接口就不會(huì)再發(fā)生『沒(méi)有響應(yīng)』的情況了。2912-3.進(jìn)度狀態(tài)顯示組件不管在執(zhí)行ProgressBar12-3.進(jìn)度狀態(tài)顯示組件大家在寫(xiě)過(guò)幾個(gè)程序之后,一定也會(huì)發(fā)現(xiàn)ProcessMessages()這個(gè)函式會(huì)有無(wú)效的時(shí)候,其實(shí)不是無(wú)效,而是剛剛好ProcessMessages()運(yùn)作原理剛好跟你程序的做法無(wú)法match,這時(shí)候又該怎么辦呢?在這邊非常建議各位采用Thread的做法,雖然有些情況下不加入ProcessMessages()也可以正常運(yùn)作,雖然有時(shí)候加入了ProcessMessages()就可以正常運(yùn)作,但是最終的解決方法仍然是使用Thread的做法,因?yàn)門(mén)hread才是真正將所有的工作分成『執(zhí)行緒』后才交給CPU去執(zhí)行,所以不管現(xiàn)在程序在跑什么東西,只要有開(kāi)Thread,不管同時(shí)間有多少程序在跑一定都可以使用到CPUTime。關(guān)于Thread的介紹與使用,我們將在后面章節(jié)提到。3012-3.進(jìn)度狀態(tài)顯示組件大家在寫(xiě)過(guò)幾個(gè)程序之后,一定也會(huì)12-3.進(jìn)度狀態(tài)顯示組件其實(shí)除了上面介紹的這兩個(gè)組件以外,還有其它很多組件都可以用來(lái)表示類似這方面的功能,例如曲線圖、圓餅圖、Shape,或是任何一個(gè)可以顯示圖形或是文字的都可以,只是需要程序設(shè)計(jì)師自己設(shè)計(jì)表現(xiàn)的模式。3112-3.進(jìn)度狀態(tài)顯示組件其實(shí)除了上面介紹的這兩個(gè)組件以外12-4.軌跡追蹤列軌跡追蹤列通常都是為了讓使用者可以有比較方便的方法設(shè)定數(shù)值。例如在寫(xiě)一個(gè)骰子的程序時(shí)(一次丟多個(gè)骰子),我們一定要輸入各點(diǎn)數(shù)會(huì)出現(xiàn)的機(jī)率,這時(shí)候我們就可以利用TrackBar這個(gè)組件,采用『拉』的方式來(lái)設(shè)定好各點(diǎn)數(shù)出現(xiàn)的機(jī)率。概觀的說(shuō),凡是需要設(shè)定『數(shù)值』時(shí),都可以利用TrackBar來(lái)完成,這樣可以增加不少UserFriendly的效果喔!3212-4.軌跡追蹤列軌跡追蹤列通常都是為了讓使用者可以有比12-4.軌跡追蹤列范例12-10:TrackBar操作實(shí)例TrackBar重要屬性說(shuō)明屬性說(shuō)明Frequency在TrackBar上的標(biāo)記多少單位劃一格LineSize當(dāng)你使用方向鍵控制TrackBar上面的指標(biāo)時(shí),按一下會(huì)移動(dòng)多少格MaxTrackBar的最大值MinTrackBar的最小值Orientation有Horizontal和Vertical兩種不同的屬性值,主要是用來(lái)決定TrackBar是要往右移動(dòng)或是往上移動(dòng)PageSize跟LineSize很像,不過(guò)LineSize是控制方向鍵對(duì)于TrackBar的移動(dòng)數(shù)量,而PageSize是控制PageDown、PageUp對(duì)于TrackBar的移動(dòng)數(shù)量Position目前TrackBar指針的位置SelEnd會(huì)顯示出一個(gè)Range的光棒在TrackBar上,這個(gè)光棒的結(jié)束位置就是在SelEnd這個(gè)位置。SelStart會(huì)顯示出一個(gè)Range的光棒在TrackBar上,這個(gè)光棒的結(jié)束位置就是在SelStart這個(gè)位置。一般來(lái)說(shuō)SelStart的位置都設(shè)定在『0』,而SelEnd的位置跟Position的值是同步的。因?yàn)檫@樣就會(huì)將TrackBar已經(jīng)被指針拉過(guò)的位置用其它顏色來(lái)表示SliderVisible決定指標(biāo)要不要出現(xiàn)在TrackBar上ThumbLengthTrackBar的長(zhǎng)度TickMarks決定標(biāo)記點(diǎn)要在哪個(gè)方向TickStyle決定標(biāo)記點(diǎn)產(chǎn)生的方式,Auto、Manual、或是None3312-4.軌跡追蹤列范例12-10:TrackBar操作實(shí)12-4.軌跡追蹤列范例12-10程序代碼void__fastcallTForm1::TrackBar1Change(TObject*Sender){Label1->Caption="目前位置:"+IntToStr(TrackBar1->Position);Label2->Caption="百分比率:"+\FloatToStr((float)100*(float)TrackBar1->Position/(float)TrackBar1->Max)+"%";}3412-4.軌跡追蹤列范例12-10void__fastc12-5.上下控制組件上下控制組件跟TrackBar非常的類似,都是用來(lái)設(shè)定(表現(xiàn))數(shù)值,只是TrackBar一定是一個(gè)調(diào)整棒在那邊讓使用者拉,但是上下控制組件就不一樣了,你可以結(jié)合各種不同的VCL組件,例如可以跟Label或是Edit結(jié)合等等。在范例12-11中,我們將列出一些比較常跟上下控制組件結(jié)合的使用范例,也會(huì)提到『CspinEdit』這個(gè)類似上下控制組件。3512-5.上下控制組件上下控制組件跟TrackBar非常的12-5.上下控制組件范例12-11:UpDown&CSpinEdit操作范例UpDown常用的屬性說(shuō)明屬性說(shuō)明AlignButton設(shè)定UpDown按鈕的方向要在那個(gè)方向ArrowKeys決定我們是不是可以使用方向鍵來(lái)控制UpDown組件Associate想要跟UpDown組件結(jié)合的VCL組件Increment每次按一次按鈕所增加或是減少的值MaxUpDown中會(huì)出現(xiàn)的最大的值,也就是Position這個(gè)屬性的值不可以超過(guò)這個(gè)值MinUpDown中會(huì)出現(xiàn)的最小的值,也就是Position這個(gè)屬性的值不可以小于這個(gè)值Orientation有Horizontal和Vertical兩種不同的屬性值,主要是用來(lái)決定UpDown的按鈕是要上下方向或是左右方向Position目前UpDown所在的位置(顯示出來(lái)的值)Thousands如果數(shù)值超過(guò)1000的時(shí)候,需要需要每三個(gè)數(shù)字打一個(gè)逗點(diǎn)3612-5.上下控制組件范例12-11:UpDown&C12-5.上下控制組件范例12-11:UpDown&CSpinEdit操作范例CspinEdit常用的屬性說(shuō)明屬性說(shuō)明AutoSelect當(dāng)CspinEdit剛好在focus的時(shí)候,Text中的值會(huì)自動(dòng)被選取EditorEnabled設(shè)定我們可不可以直接EditorCspinEdit的TextIncrement每次按一次按鈕所增加或是減少的值MaxValueCSpinEdit中會(huì)出現(xiàn)的最大的值,也就是Value這個(gè)屬性的值不可以超過(guò)這個(gè)值MinValueCSpinEdit中會(huì)出現(xiàn)的最大的值,也就是Value這個(gè)屬性的值不可以低于這個(gè)值Value目前CSpinEdit所在的位置(顯示出來(lái)的值)3712-5.上下控制組件范例12-11:UpDown&C12-5.上下控制組件范例12-11:UpDown&CSpinEdit操作范例程序代碼執(zhí)行結(jié)果void__fastcallTForm1::UpDown3Click(TObject*Sender,TUDBtnTypeButton){if(Button==btPrev)ProgressBar1->Position--;elseProgressBar1->Position++;}3812-5.上下控制組件范例12-11:UpDown&C12-6.日期時(shí)間在BCB內(nèi)有不少跟『日期/時(shí)間』相關(guān)的組件可以用,例如Win32頁(yè)次中的『DateTimePicker』及『MonthCalendar』,System頁(yè)次中的『Timer』,以及Sample頁(yè)次中的『Ccalendar』這幾個(gè)組件。范例12-12我們將實(shí)做這幾個(gè)組件讓大家看看。3912-6.日期時(shí)間在BCB內(nèi)有不少跟『日期/時(shí)間』相關(guān)的組12-6.日期時(shí)間范例12-12TimerTimer用白話一點(diǎn)的話來(lái)說(shuō)就是『定時(shí)器』。也就是說(shuō)我們可以利用Timer來(lái)做固定時(shí)間的定時(shí)器。除了可以利用Timer做時(shí)間的定時(shí)器外,在BCB中也有提供一些函式可以做時(shí)間的計(jì)算,例如時(shí)間間距的計(jì)算或是目前時(shí)間的回報(bào)等等。在范例程序12-12中,我們將上面我們所說(shuō)的三個(gè)功能寫(xiě)出來(lái)當(dāng)作范例,讓大家可以對(duì)Timer這個(gè)組件以及有關(guān)DateTime方面的函式更熟悉。4012-6.日期時(shí)間范例12-124012-6.日期時(shí)間范例12-12月歷MonthCalendar&DateTimePicker&CCalendarMonthCalendar重要屬性說(shuō)明屬性說(shuō)明CalColor設(shè)定月歷中的各種顏色Date月歷中被選取的日期FirstDayOfWeek設(shè)定每個(gè)星期的第一天是星期幾MultiSelect可以選多個(gè)日期ShowToday在月歷上顯示出今天的日期ShowTodayCircle在今天的日期上會(huì)出現(xiàn)一個(gè)圈圈包住WeekNumbers出現(xiàn)這一周是今年的第幾周的數(shù)字4112-6.日期時(shí)間范例12-12屬性說(shuō)明CalColor設(shè)12-6.日期時(shí)間范例12-12月歷CCalendar重要屬性說(shuō)明屬性說(shuō)明Day目前選定的日子GridLineWidth表格網(wǎng)格線的寬度Month目前選定的月份StartOfWeek設(shè)定每個(gè)星期的第一天是星期幾UseCurrentDate預(yù)設(shè)為目前的日期Year目前表格顯示出來(lái)的日期的年份4212-6.日期時(shí)間范例12-12屬性說(shuō)明Day目前選定的日12-6.日期時(shí)間范例12-12Timer執(zhí)行畫(huà)面&DateTime執(zhí)行畫(huà)面4312-6.日期時(shí)間范例12-124312-7.熱鍵組件的使(HotKey)熱鍵的使用在Windows系統(tǒng)中也是蠻重要的功能。雖然說(shuō)目前大家都習(xí)慣使用鼠標(biāo),但是如果想讓自己在使用軟件上能加快速度或是提升效率,熱鍵的使用及建立就相當(dāng)?shù)闹匾?。例如在Word中,你要打個(gè)『頓號(hào)』可能得從〔插入〕〔符號(hào)〕這個(gè)選單中慢慢找,但是如果你將他設(shè)定成快速鍵,節(jié)省下來(lái)的時(shí)間可能高達(dá)30秒鐘。4412-7.熱鍵組件的使(HotKey)熱鍵的使用在Wind12-7.熱鍵組件的使(HotKey)范例12-13:HotKey實(shí)作技巧在BCB中有提供熱鍵的組件。在范例12-13中我們將會(huì)設(shè)計(jì)一個(gè)范例程序來(lái)展現(xiàn)熱鍵的實(shí)作技巧,以及使用熱鍵的好處。在范例12-13中我們利用MainMenu這個(gè)組件當(dāng)作我們要指定快速鍵的組件。設(shè)定好了之后按下快速鍵就會(huì)啟動(dòng)相關(guān)的函式。4512-7.熱鍵組件的使(HotKey)范例12-13:Ho12-7.熱鍵組件的使(HotKey)范例12-13:HotKey實(shí)作技巧相關(guān)程序代碼void__fastcallTForm1::BitBtn1Click(TObject*Sender){AnsiStringStrBuf,HotKeyBuf;TMenuItem*ItemBuf;if(RadioGroup1->ItemIndex!=-1){StrBuf=RadioGroup1->Items->Strings[RadioGroup1->ItemIndex];for(inti=0;i<MainMenu1->Items->Count;i++)if((ItemBuf=MainMenu1->Items->Items[i]->Find(StrBuf))!=NULL)break;if(ItemBuf)ItemBuf->ShortCut=HotKey1->HotKey;}}//void__fastcallTForm1::ShowHotKeySet(TObject*Sender){ShowMessage("SetHotKeySuccess!\n");}4612-7.熱鍵組件的使(HotKey)范例12-13:Ho12-7.熱鍵組件的使(HotKey)范例12-13:HotKey實(shí)作技巧執(zhí)行畫(huà)面4712-7.熱鍵組件的使(HotKey)范例12-13:Ho12-8.常駐在SystemTray的程序有很多軟件常常會(huì)將自己的軟件最小化在右下角的系統(tǒng)列,例如防毒軟件或是一些常駐程序都會(huì)在系統(tǒng)列。在BCB中也有這樣的組件提供給programmer使用,這個(gè)組件就是『TrayIcon』。范例12-14:系統(tǒng)列程序?qū)嵶骷记蒚rayIcon的使用方法非常的簡(jiǎn)單,在范例12-14中,我們除了放入一個(gè)TrayIcon外,我們也加入一個(gè)PopupMenu當(dāng)做快速選單,也加入一個(gè)ImageList,并且放入多個(gè)Image在ImageList中,讓TrayIcon最小化的時(shí)候可以在系統(tǒng)列出現(xiàn)我們所設(shè)定的圖示。4812-8.常駐在SystemTray的程序有很多軟件常常12-8.常駐在SystemTray的程序范例12-14:系統(tǒng)列程序?qū)嵶骷记芍饕绦虼avoid__fastcallTForm1::N1Click(TObject*Sender){//放置于系統(tǒng)列if(TrayIcon1->Visible==false){N1->Enabled=false;N2->Enabled=true;TrayIcon1->Visible=true;TrayIcon1->Minimize();}}void__fastcallTForm1::N2Click(TObject*Sender){//放置于桌面if(TrayIcon1->Visible==true){N1->Enabled=true;N2->Enabled=false;TrayIcon1->Visible=false;TrayIcon1->Restore();}}4912-8.常駐在SystemTray的程序范例12-1412-8.常駐在SystemTray的程序范例12-14:系統(tǒng)列程序?qū)嵶骷记芍饕绦虼avoid__fastcallTForm1::CheckBox1Click(TObject*Sender){//設(shè)定要不要在系統(tǒng)列開(kāi)啟動(dòng)態(tài)的效果if(CheckBox1->Checked){TrayIcon1->AnimateInterval=Edit1->Text.ToInt()*1000;TrayIcon1->Animate=true;}else{TrayIcon1->Animate=false;TrayIcon1->IconIndex=0;}}5012-8.常駐在SystemTray的程序范例12-1412-8.常駐在SystemTray的程序范例12-14:系統(tǒng)列程序?qū)嵶骷记芍饕绦虼avoid__fastcallTForm1::Edit1Change(TObject*Sender){//設(shè)定動(dòng)態(tài)效果的時(shí)間長(zhǎng)短if(CheckBox1->Checked){TrayIcon1->AnimateInterval=Edit1->Text.ToInt()*1000;TrayIcon1->Animate=true;}else{TrayIcon1->Animate=false;TrayIcon1->IconIndex=0;}}5112-8.常駐在SystemTray的程序范例12-1412-8.常駐在SystemTray的程序范例12-14:系統(tǒng)列程序?qū)嵶骷记芍饕獔?zhí)行畫(huà)面5212-8.常駐在SystemTray的程序范例12-1412-8.常駐在SystemTray的程序其實(shí)要實(shí)做系統(tǒng)列的程序也不一定需要使用BCB提供的TrayIcon這個(gè)VCL組件,我們也可以直接利用Win32API所提供的函式來(lái)完成這個(gè)功能,而且透過(guò)Win32API的方式更能提供多樣化的功能。5312-8.常駐在SystemTray的程序其實(shí)要實(shí)做系統(tǒng)本章習(xí)題利用Win32API實(shí)做出可以將程序最小化至系統(tǒng)列的應(yīng)用程序。除了MainMenu可以結(jié)合HotKey外,找出其它的組件搭配HotKey實(shí)做出應(yīng)用程序。試著拉出類似檔案總管的接口(不需要實(shí)做程序代碼)。54本章習(xí)題利用Win32API實(shí)做出可以將程序最小化至系統(tǒng)列第十二章Win32環(huán)境程序設(shè)計(jì)這一章節(jié)可以說(shuō)是本書(shū)精華之一,Win32程序設(shè)計(jì)算是比較復(fù)雜的部分,但是我們以最簡(jiǎn)單的敘述帶領(lǐng)著大家進(jìn)入Win32程序設(shè)計(jì)的殿堂,讓你寫(xiě)出來(lái)的程序具有一定的水平以上。若能將本章與下一章的技巧靈活運(yùn)用,更能讓大家寫(xiě)出高階的窗口程序。55第十二章Win32環(huán)境程序設(shè)計(jì)這一章節(jié)可以說(shuō)是本書(shū)精華大綱12-1.檔案總管的接口12-2.標(biāo)頭控制組件12-3.進(jìn)度狀態(tài)顯示組件12-4.軌跡追蹤列12-5.上下控制組件12-6.日期時(shí)間12-7.熱鍵組件的使用(HotKey)12-8.常駐在SystemTray的程序本章習(xí)題56大綱12-1.檔案總管的接口212-1.檔案總管的接口提到Win32的程序設(shè)計(jì),最重要的范例就是檔案總管。整個(gè)檔案總管都是使用Win32的接口來(lái)完成。而我們?cè)谶@一章以及下一章,也都會(huì)圍繞著檔案總管來(lái)介紹大部分內(nèi)容。下圖中就是檔案總管的接口,在這個(gè)接口里,主要組件有ListView、TreeView、Splitter、以及StatusBar這四種VCL組件,SplitterTreeViewListViewStatusBar5712-1.檔案總管的接口提到Win32的程序設(shè)計(jì),最重要的12-1.檔案總管的接口窗體檢視組件(ListView)范例12-1在范例12-1,我們的接口相當(dāng)簡(jiǎn)單,除了一個(gè)輸入數(shù)據(jù)的接口外,就是一個(gè)ListView。除了提到這些可看見(jiàn)的VCL組件外,我們還有放入一個(gè)Popupmenu以及一個(gè)ImageList在這個(gè)范例中。Popupmenu主要是提供鼠標(biāo)右鍵的功能選單,,而ImageList則是要提供一些Image給ListView使用。5812-1.檔案總管的接口窗體檢視組件(ListView)412-1.檔案總管的接口窗體檢視組件(ListView)新增Column個(gè)數(shù)5912-1.檔案總管的接口窗體檢視組件(ListView)512-1.檔案總管的接口窗體檢視組件(ListView)ViewStyle的不同大圖示(vsIcon)小圖示(vsSmallIcon)清單(List)詳細(xì)列表(Report)6012-1.檔案總管的接口窗體檢視組件(ListView)612-1.檔案總管的接口窗體檢視組件(ListView)范例12-1執(zhí)行結(jié)果6112-1.檔案總管的接口窗體檢視組件(ListView)712-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)TreeView是目前檔案總管中的重要組件之一,在檔案總管中TreeView負(fù)責(zé)顯示從桌面開(kāi)始的所有樹(shù)狀結(jié)構(gòu)。在這一小節(jié)里,我們將會(huì)利用三個(gè)范例讓各位練習(xí)TreeView的各項(xiàng)使用實(shí)例。談到Tree的使用,就必須談到什么是『根節(jié)點(diǎn)』、『父節(jié)點(diǎn)』、『子節(jié)點(diǎn)』、以及『葉節(jié)點(diǎn)』。根節(jié)點(diǎn)就是我們所謂的『root』,他是在整個(gè)Tree的最上方,以檔案總管來(lái)說(shuō),根節(jié)點(diǎn)就是『桌面』父節(jié)點(diǎn)就是這個(gè)節(jié)點(diǎn)的底下還有一個(gè)以上的節(jié)點(diǎn)子節(jié)點(diǎn)就是這個(gè)節(jié)點(diǎn)的上一層還有節(jié)點(diǎn)葉節(jié)點(diǎn)就代表這個(gè)節(jié)點(diǎn)已經(jīng)是這支樹(shù)的最后一個(gè)節(jié)點(diǎn)6212-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)812-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-2:利用簡(jiǎn)單的程序來(lái)控制TreeView的各項(xiàng)動(dòng)作。我們主要是使用靜態(tài)的方式將一棵樹(shù)建立起來(lái)。這棵樹(shù)是利用BCB提供的接口去產(chǎn)生。6312-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)912-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-2執(zhí)行結(jié)果6412-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)112-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-3:在程序中建構(gòu)一個(gè)靜態(tài)的TreeView在范例12-3,我們也是靜態(tài)產(chǎn)生Tree,但是這次我們不是從BCB的接口中產(chǎn)生,我們是從程序代碼中產(chǎn)生。在范例12-3的接口中,全部都跟范例12-2一模一樣。程序中,我們宣告了三個(gè)TreeNode(兩個(gè)也可以),經(jīng)由這三個(gè)TreeNode之間的相互關(guān)系,我們完成了整顆樹(shù)的建立。在建樹(shù)的程序代碼方面并不難,比較特別的就是要回到上一層我們使用的是『parent=parentParent』這樣的方法來(lái)取得上一層Node的內(nèi)存地址。至于一開(kāi)始我們有保留Root的地址這只是一個(gè)習(xí)慣,因?yàn)閺腂CB中也是可以判斷哪個(gè)Node是Root,在范例12-3中這樣做只是為了方便以及寫(xiě)程序者的習(xí)慣。6512-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)112-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-3:程序代碼void__fastcallTForm1::FormCreate(TObject*Sender){TTreeNode*root,*parent,*son;root=TreeView1->Items->Add(NULL,"Root");root->ImageIndex=0;root->SelectedIndex=1;root->StateIndex=-1;parent=root;son=TreeView1->Items->AddChild(parent,"Parent1");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=-1;parent=son;son=TreeView1->Items->AddChild(parent,"Son_1_1");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=0;son=TreeView1->Items->AddChild(parent,"Son_1_2");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=-1;parent=parent->Parent;son=TreeView1->Items->AddChild(parent,"Parent2");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=-1;parent=son;son=TreeView1->Items->AddChild(parent,"Son_2_1");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=-1;parent=son;son=TreeView1->Items->AddChild(parent,"Son_2_1_1");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=1;parent=parent->Parent->Parent;son=TreeView1->Items->AddChild(parent,"Parent3");son->ImageIndex=2;son->SelectedIndex=3;son->StateIndex=-1;}6612-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)v12-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-4:在程序中建構(gòu)一個(gè)TreeView,主要程序代碼我們分成三個(gè)部分第一部份是動(dòng)態(tài)新增所需要的變量宣告,這部分是宣告在main.cpp的上方,歸類于全域變數(shù)第二部份就是有關(guān)新增/刪除TreeNode部分的程序代碼最后一部分就是一些瑣碎的功能,這些程序代碼包括了展開(kāi)以及收合的功能,也有在StatusBar上面顯示目前的狀況,還有一個(gè)就是選擇要不要顯示Root。6712-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)112-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-4:程序代碼宣告//宣告兩個(gè)變量..用來(lái)存放RootAddress和Node的AddressTTreeNode*root=NULL;TTreeNode*node=NULL;6812-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)/12-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-4:程序代碼動(dòng)態(tài)新增Nodevoid__fastcallTForm1::N1Click(TObject*Sender){//新增一個(gè)Node,在新增的時(shí)候會(huì)自動(dòng)判斷是不是新增Root,在新增的時(shí)候利用InputQuery來(lái)當(dāng)作輸入接口AnsiStringBuf;if(root==NULL){//如果現(xiàn)在root還是NULL的話..表示要新增一個(gè)rootif(InputQuery("輸入","請(qǐng)輸入TreeNode的名稱",Buf)){//使用InputQuery當(dāng)作輸入接口root=TreeView1->Items->AddChild(NULL,Buf);//將新增的Node加入到TreeView中root->ImageIndex=0;root->SelectedIndex=1;root->StateIndex=-1;//設(shè)定該Node的一些基本屬性StatusBar1->SimpleText="新增Root節(jié)點(diǎn)";//在StatusBar顯示目前的運(yùn)作情況TreeView1->AlphaSort();//新增之后利用AlphaSort對(duì)整個(gè)Tree排序}}else{//新增一般的Node//必須得先選一個(gè)node才能繼續(xù)產(chǎn)生Child,不然如果沒(méi)有Parent那來(lái)的Childif(TreeView1->Selected!=NULL){//使用InputQuery當(dāng)作輸入接口if(InputQuery("輸入","請(qǐng)輸入TreeNode的名稱",Buf)){//將新增的Node加入到TreeView中node=TreeView1->Items->AddChildFirst(TreeView1->Selected,Buf);node->ImageIndex=2;node->SelectedIndex=3;node->StateIndex=-1;//設(shè)定該Node的一些基本屬性StatusBar1->SimpleText="新增一個(gè)Node";//在StatusBar顯示目前的運(yùn)作情況TreeView1->AlphaSort();//新增之后利用AlphaSort對(duì)整個(gè)Tree排序}}}}6912-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)v12-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)范例12-4:程序代碼動(dòng)態(tài)刪除Nodevoid__fastcallTForm1::N2Click(TObject*Sender){if(TreeView1->Selected!=NULL){//如果有Node被選取..也選擇要?jiǎng)h除才執(zhí)行if(TreeView1->Selected==root){//判斷是不是RootTreeView1->Selected->Delete();root=NULL;//如果是root被刪除..要將root的point設(shè)成nullStatusBar1->SimpleText="刪除Root節(jié)點(diǎn)";}else{TreeView1->Selected->Delete();StatusBar1->SimpleText="刪除一個(gè)Node";}}}7012-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)v12-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)SortAlphaSort:根據(jù)我們每個(gè)Node的Caption中的值去做排序CustomSort:讓我們自己寫(xiě)函式去做排列SortTypestBoth:當(dāng)Date或是Text有任何一種改變時(shí)就重新SortstDate:當(dāng)Node的數(shù)據(jù)改變時(shí)就重新Sort一次stNone:永遠(yuǎn)不排序stText:當(dāng)Node的Text改變時(shí)重新Sort7112-1.檔案總管的接口樹(shù)狀檢視組件(TreeView)112-1.檔案總管的接口分隔組件(Splitter)分隔組件最主要的功能就是讓兩個(gè)組件在你拉動(dòng)的時(shí)候自動(dòng)分配組件的大小。例如在檔案總管中,我們可以將光標(biāo)停放在TreeView和ListView的中間,接著游標(biāo)就會(huì)變成一個(gè)雙箭頭的光標(biāo),然后我們就可以按著鼠標(biāo)的左鍵左右移動(dòng)鼠標(biāo),這時(shí)候TreeView和ListView的窗口會(huì)隨著鼠標(biāo)的移動(dòng)自動(dòng)改變大小。拉動(dòng)之后可以自動(dòng)調(diào)整大小7212-1.檔案總管的接口分隔組件(Splitter)拉動(dòng)之12-1.檔案總管的接口狀態(tài)列組件(StatusBar)顧名思義就是將一些訊息顯示在這個(gè)Bar上面,在檔案總管中就是在檔案總管畫(huà)面的最下方。范例12-6StatusBar基本應(yīng)用void__fastcallTForm1::Button1Click(TObject*Sender){StatusBar1->SimpleText="你剛剛按下了Button1";}//void__fastcallTForm1::Button2Click(TObject*Sender){StatusBar1->SimpleText="你剛剛按下了Button2";}//void__fastcallTForm1::Button3Click(TObject*Sender){StatusBar1->SimpleText="你剛剛按下了Button3";}//void__fastcallTForm1::Edit1Change(TObject*Sender){StatusBar1->SimpleText="你剛剛修改了Edit1";}//void__fastcallTForm1::Edit2Change(TObject*Sender){StatusBar1->SimpleText="你剛剛修改了Edit2";}7312-1.檔案總管的接口狀態(tài)列組件(StatusBar)v12-1.檔案總管的接口狀態(tài)列組件(StatusBar)范例12-7:StatusBar進(jìn)階應(yīng)用使用一個(gè)按鈕、一個(gè)Edit、一個(gè)Image、以及一個(gè)StatusBar。在StatusBar上總共有四個(gè)字段,跟上一個(gè)范例不一樣。在StatusBar上面按下鼠標(biāo)右鍵,選擇『PanelsEditor』會(huì)出現(xiàn)StatusBar的Panel編輯畫(huà)面。7412-1.檔案總管的接口狀態(tài)列組件(StatusBar)212-1.檔案總管的接口狀態(tài)列組件(StatusBar)范例12-7:程序代碼(PartI)void__fastcallTForm1::Button1MouseDown(TObject*Sender,
TMouseButtonButton,TShiftStateShift,intX,intY)
{StatusBar1->Panels->Items[0]->Text="你按下了Button1";}//void__fastcallTForm1::Button1MouseUp(TObject*Sender,TMouseButtonButton,TShiftStateShift,intX,intY)
{StatusBar1->Panels->Items[0]->Text="你沒(méi)按下Button1";}//void__fastcallTForm1::Edit1Change(TObject*Sender)
{StatusBar1->Panels->Items[1]->Text="Edit1的文字是:"+Edit1->Text;}//void__fastcallTForm1::FormDragDrop(TObject*Sender,TObject*Source,intX,intY)
{//設(shè)定Form上的DragDrop的Function,主要是用來(lái)讓Image在Form上可以做Drag的動(dòng)作TImage*buf=(TImage*)Source;buf->Left=X;buf->Top=Y;}7512-1.檔案總管的接口狀態(tài)列組件(StatusBar)v12-1.檔案總管的接口狀態(tài)列組件(StatusBar)范例12-7:程序代碼(PartII)void__fastcallTForm1::FormDragOver(TObject*Sender,TObject*Source,
intX,intY,TDragStateState,bool&Accept)
{Accept=true;//讓Form可以被允許DragOver}//void__fastcallTForm1::Image1StartDrag(TObject*Sender,TDragObject*&DragObject)
{StatusBar1->Panels->Items[2]->Text="正在拉圖片";//當(dāng)啟動(dòng)Drag的時(shí)候顯示"正在拉圖片"}//void__fastcallTForm1::Image1EndDrag(TObject*Sender,TObject*Target,
intX,intY)
{StatusBar1->Panels->Items[2]->Text="沒(méi)在拉圖片";//結(jié)束Drag的時(shí)候顯示"沒(méi)在拉圖片"}//void__fastcallTForm1::FormMouseMove(TObject*Sender,TShiftStateShift,
intX,intY)
{//利用Form上面的MouseMove事件抓取鼠標(biāo)光標(biāo),并且在StatusBar上將光標(biāo)顯示出來(lái)AnsiStringBuf;Buf="("+IntToStr(X)+","+IntToStr(Y)+")";StatusBar1->Panels->Items[3]->Text="鼠標(biāo)光標(biāo)(X,Y):"+Buf;}7612-1.檔案總管的接口狀態(tài)列組件(StatusBar)v12-1.檔案總管的接口狀態(tài)列組件(StatusBar)范例12-7執(zhí)行結(jié)果7712-1.檔案總管的接口狀態(tài)列組件(StatusBar)212-2.標(biāo)頭控制組件標(biāo)頭控制組件所提供的功能,一般來(lái)說(shuō)我們都會(huì)直接利用ListView來(lái)完成,而不是單純的去拉一個(gè)標(biāo)頭控制組件下來(lái)用。因?yàn)镠eaderControl一般都是用來(lái)區(qū)分是不是同類型的資料,例如在ListView中我們顯示檔案的話,文件名就會(huì)集體放在檔名那一個(gè)Column,檔案大小也都會(huì)放在同一個(gè)Column……等,所以才會(huì)說(shuō)大部分的使用都是利用ListView來(lái)完成。但是如果想要在Header部分加上一些圖片等花俏的功能,還是得使用HeaderControl7812-2.標(biāo)頭控制組件標(biāo)頭控制組件所提供的功能,一般來(lái)說(shuō)我12-3.進(jìn)度狀態(tài)顯示組件我們?cè)诎惭b應(yīng)用程序(或是使用一些應(yīng)用程序)的過(guò)程中,常常會(huì)有一條光棒跑出來(lái)告訴我們目前工作正進(jìn)行了多少百分比,這個(gè)組件我們稱做進(jìn)度狀態(tài)列組件。進(jìn)度狀態(tài)列組件可以給使用程序的使用者非常高層次的訊息(可以馬上了解現(xiàn)在的情況),也可以讓使用者預(yù)估時(shí)間,也可以增加整個(gè)程序UserFriendly的程度。在BorlandC++Builder6中,有『ProgressBar』、『Cgauge』這兩個(gè)組件可以用來(lái)表示目前的完成度為何,其中ProgressBar位在Win32的頁(yè)面中,而Cgauge在
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江省人教版八年級(jí)歷史與社會(huì)上冊(cè)說(shuō)課稿4.3.4-元朝統(tǒng)一多民族國(guó)家的拓展001
- 基層新聞寫(xiě)作培訓(xùn)
- 2024年江永婦幼保健院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2024年永勝縣人民醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫(kù)頻考點(diǎn)附帶答案
- 2024版標(biāo)準(zhǔn)化鋼結(jié)構(gòu)施工承建協(xié)議范本一
- 第23課《女?huà)z造人》說(shuō)課稿 2024-2025學(xué)年統(tǒng)編版語(yǔ)文七年級(jí)上冊(cè)001
- 名著閱讀《 朝花夕拾》說(shuō)課稿+預(yù)習(xí)任務(wù)單2024-2025學(xué)年統(tǒng)編版語(yǔ)文七年級(jí)上冊(cè)
- 嘉鴻學(xué)院培訓(xùn)
- 攻略17 題型專練-組合型選擇題(原卷版)
- 《機(jī)芯插入方法》課件
- 廣西柳州市名校2024屆數(shù)學(xué)高一上期末統(tǒng)考試題含解析
- 高考浙江卷:2023年6月《政治》考試真題與參考答案
- 第三章海洋民俗生活與海洋信仰
- 神經(jīng)網(wǎng)絡(luò)-BP算法-課件
- 假結(jié)婚私下協(xié)議書(shū)
- 高一生物-必修一-知識(shí)點(diǎn)復(fù)習(xí)提綱人教版
- 工程監(jiān)督中心鉆井液監(jiān)督培訓(xùn)教材
- 湘教版高中美術(shù)鑒賞二單元第四課《人間生活》課件
- 西安交通大學(xué)少年班英語(yǔ)模擬試題1
- 聯(lián)通創(chuàng)新人才認(rèn)證(解決方案)考試題庫(kù)(附答案)
- 【超星爾雅學(xué)習(xí)通】航空與航天網(wǎng)課章節(jié)答案
評(píng)論
0/150
提交評(píng)論