青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 16, 文章 - 1, 評(píng)論 - 4, 引用 - 0
數(shù)據(jù)加載中……

C++ Builder 初學(xué)問與答(五~十)

38)問:事件OnChange和OnScorll都可以描述滾動(dòng)條的滾動(dòng)事件,他們有什么區(qū)別嗎?

答:事件OnChange和OnScorll是有區(qū)別的。只要屬性Position的值發(fā)生改變,那么無論這個(gè)值是用戶操作滾動(dòng)條引起的還是通過程序修改的,都會(huì)產(chǎn)生OnChange事件。而OnScorll事件只有在用戶操作滾動(dòng)條時(shí)才發(fā)生。當(dāng)用戶操作滾動(dòng)條時(shí),首先發(fā)生OnScorll事件,然后OnChange事件才會(huì)發(fā)生。

  下面我們共同看一個(gè)程序來加深對(duì)滾動(dòng)條的理解。

  在窗體上放置一個(gè)水平滾動(dòng)條ScrollBar1和一個(gè)垂直滾動(dòng)條ScrollBar2,以及一個(gè)記錄滾動(dòng)條事件的Memo組件。當(dāng)用戶操作滾動(dòng)條時(shí),在Memo組件中就會(huì)顯示發(fā)生的事件。

  選擇Memo組件,把它的ScrollBars屬性設(shè)置為ssVertical。

  選擇水平滾動(dòng)條組件,雙擊OnScroll的Value域,系統(tǒng)將生成事件處理模板,輸入這樣一段代碼。

void __fastcall TForm1::ScrollBar1Scroll(TObject *Sender,

      TScrollCode ScrollCode, int &ScrollPos)

{

AnsiString temp;

if(Sender==ScrollBar2)

temp="垂直滾動(dòng)條的";

else

temp="水平滾動(dòng)條的";

switch(ScrollCode)

{

       case scLineUp:temp+="scLineUp";break;

       case scLineDown:temp+="scLineDown";break;

       case scPageUp:temp+="scPageUp";break;

       case scPageDown:temp+="scPageDown";break;

       case scPosition:temp+="scPosition";break;

       case scTrack:temp+="scTrack";break;

       case scTop:temp+="scTop";break;

       case scBottom:temp+="scBottom";break;

       case scEndScroll:temp+="scEndScroll";break;

     default:

temp+="未知";break;

}

Memo1->Lines->Append(temp+"事件");
}

  第一條語句聲明一個(gè)AnsiString類型的變量,用來存放將要顯示的字符串。

       第二條語句判斷發(fā)送事件的對(duì)象,如果是垂直滾動(dòng)條,將temp初始化為 “垂直滾動(dòng)條的”,否則初始化為 “水平滾動(dòng)條的”。

       第三條語句根據(jù)ScrollCode的值,顯示相應(yīng)的事件。

       最后一條語句將要顯示的字符串加到文本框的末尾。

  在窗體中選擇垂直滾動(dòng)條組件,選擇Events標(biāo)簽,單擊OnScroll的Value域,從下拉列表框中選擇ScrollBar1Scroll事件處理程序。這樣,垂直滾動(dòng)條和水平滾動(dòng)條將共用一個(gè)事件處理程序。

  選擇水平滾動(dòng)條組件,選擇Events標(biāo)簽,雙擊OnChange域,然后輸入:

  Memo1->Lines->Append("水平滾動(dòng)條的OnChange事件");

  它將在文本框后面顯示水平滾動(dòng)條改變的信息。

  類似的,給垂直滾動(dòng)條的OnChange事件加上如下代碼:

Memo1->Lines->Append("垂直滾動(dòng)條的OnChange事件");

  詳細(xì)代碼如下:

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

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

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


__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

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

void __fastcall TForm1::ScrollBar1Scroll(TObject *Sender,

      TScrollCode ScrollCode, int &ScrollPos)

{

         AnsiString temp;

if(Sender==ScrollBar2)

temp="垂直滾動(dòng)條的";

else

temp="水平滾動(dòng)條的";

switch(ScrollCode)

{

       case scLineUp:temp+="scLineUp";break;

       case scLineDown:temp+="scLineDown";break;

       case scPageUp:temp+="scPageUp";break;

       case scPageDown:temp+="scPageDown";break;

       case scPosition:temp+="scPosition";break;

       case scTrack:temp+="scTrack";break;

       case scTop:temp+="scTop";break;

       case scBottom:temp+="scBottom";break;

       case scEndScroll:temp+="scEndScroll";break;

     default:

temp+="未知";break;

}

Memo1->Lines->Append(temp+"事件");

}

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

void __fastcall TForm1::ScrollBar1Change(TObject *Sender)

{

       Memo1->Lines->Append("水平滾動(dòng)條的OnChange事件");

}

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

void __fastcall TForm1::ScrollBar2Change(TObject *Sender)

{

    Memo1->Lines->Append("垂直滾動(dòng)條的OnChange事件");

}
//--------------------------------------------

  現(xiàn)在,編譯并運(yùn)行這個(gè)程序,點(diǎn)擊滾動(dòng)條,可以看出滾動(dòng)條的事件產(chǎn)生情況。

  哪個(gè)事件優(yōu)先你能看出來嗎?你一定會(huì)對(duì)OnScroll同一事件產(chǎn)生的兩個(gè)屬性值先后被OnChange分開而不解是嗎?你好好看一下什么時(shí)候產(chǎn)生scEndScroll值J

  其實(shí)我們?nèi)绻私馄渌硞€(gè)組件所產(chǎn)生的事件之間的順序,也可以用同樣的方法來實(shí)現(xiàn)。

  39)問:軌跡條(TrackBar)有那些主要屬性呢?

  答:軌跡條與滾動(dòng)條有相似之處,它也有一個(gè)類似于滾動(dòng)塊的滑動(dòng)塊,可以用鼠標(biāo)或者使用方向鍵移動(dòng)。軌跡條的某些屬性與滾動(dòng)條完全相同,例如Max,Min和Position。但是它還有一些特殊的屬性。

  1.LineSize屬性,用于指定當(dāng)用戶按下方向鍵時(shí),軌跡條的滑動(dòng)塊移動(dòng)的距離。

  2.PageSize屬性,用于指定當(dāng)用戶按下PgUp和PgDn時(shí),軌跡條上的滑動(dòng)塊移動(dòng)的距離。

  3.Frequency屬性,用于設(shè)置軌跡條刻度的單位。如果Max-Min等于100,而這個(gè)屬性等于10,那么軌跡條就被分成了10等份。

  4.Orientation屬性,用來確定軌跡條的放置方向,它有兩個(gè)值,tbHorizontal表示水平放置,tbVertical表示是垂直放置的。缺省情況下是水平放置的。


5.SelStart這個(gè)屬性用來設(shè)置選擇的起點(diǎn)。

  6.SelEnd這個(gè)屬性用來設(shè)置的選擇終點(diǎn)。

  7.TickMarks這個(gè)屬性用來設(shè)置軌跡條標(biāo)尺的位置。它有三個(gè)值,分別表示三種不同的滑動(dòng)塊位置:

  tmBottomRight表示垂直放置時(shí)標(biāo)尺顯示在軌跡條的下面或者水平放置時(shí)顯示在右邊。

  tmTopLeft表示垂直放置時(shí)標(biāo)尺顯示在軌跡條的上面或者水平放置時(shí)顯示在左邊。

  tmBoth則表示軌跡條的兩邊都有標(biāo)尺。

  8.TickStyle這個(gè)屬性用來確定軌跡條標(biāo)尺的樣式。它有三個(gè)值,分別表示三種不同的標(biāo)尺樣式:

  tsAuto表示自動(dòng)顯示標(biāo)尺的刻度。

  tsManual表示需要使用SetTick過程才能設(shè)置在某個(gè)位置顯示刻度。

  tsNone表示標(biāo)尺不顯示刻度。

  40)問:軌跡條有哪些常用的事件呢?

  答:當(dāng)用戶用鼠標(biāo)或者鍵盤操作軌跡條時(shí),就會(huì)產(chǎn)生OnChange事件。不過要注意,在程序中改變屬性Position的值不會(huì)產(chǎn)生OnChange事件,這一點(diǎn)與滾動(dòng)條不同。

  41)問:進(jìn)程條(ProgressBar)如何用呢?

  答:它的屬性與上面的那些組件差不多,象Max、Min、Orientation、Position與上面的含義大同小異。其中Position是這個(gè)組件的關(guān)鍵,它用來設(shè)置或者返回進(jìn)程條的填充小方塊的當(dāng)前位置,當(dāng)進(jìn)條結(jié)束的時(shí)候,這個(gè)位置應(yīng)該是位置上限。

  Smooth:布爾類型,缺省為false。這時(shí)的填充是按格進(jìn)行的,如果設(shè)置為true,則填充是平滑進(jìn)行的。

  StepBy:其聲明為:void _fastcall StepBy(int Detla);這個(gè)函數(shù)用來向前填充進(jìn)程條,同時(shí)改變Position的屬性值。它的增加量由參數(shù)Detla來指定。

  StepIt:其聲明為:void _fastcall StepIt(void);這個(gè)函數(shù)用來向前填充進(jìn)程條,同時(shí)改變Position的屬性值。其填充步長由Step屬性來指定。

  Step:這個(gè)屬性用來設(shè)置當(dāng)調(diào)用StepIt函數(shù)時(shí),Position位置的增加量。缺省為10。

  42)問:UpDown控件有什么用?

  答:這個(gè)控件是一對(duì)上下箭頭按鈕,按下按鈕時(shí)會(huì)自動(dòng)增加或減少某個(gè)數(shù)值。它通常有一個(gè)附屬組件,由UpDown控件的Associate屬性指定。如果這個(gè)組件是一個(gè)編輯框,那么編輯框就會(huì)自動(dòng)顯示UpDown控件的屬性Position的值。

  UpDown控件也有一些滾動(dòng)條和軌跡條所具備的屬性,例如Max,Min,Position,Orientation,它們的意義也基本上相同,不過UpDown控件同樣有一些特殊的屬性。

  AlignButton為udLeft時(shí),表示將UpDown控件放置在附屬組件的左邊,為udRight時(shí),則表示將UpDown控件放置在附屬組件的右邊。

  Associate用來指定關(guān)聯(lián)的附屬組件。

  ArrowKey屬性,當(dāng)屬性為True時(shí),按下上下方向鍵就像按下UpDown控件的上下箭頭一樣。缺省值為True。


Thousands屬性, 當(dāng)屬性為True時(shí),如果Position超過1000,那么就會(huì)自動(dòng)給所顯示的數(shù)值加上一個(gè)千分位。缺省值為True。

  Wrap屬性,當(dāng)屬性為True時(shí),如果Position的值大于Max,那么就會(huì)自動(dòng)回到Min屬性指定的值。缺省值為False。

  43)問:UpDown控件有哪些常用的事件呢?

  答:UpDown控件有兩個(gè)常用的事件:OnChanging和OnClick。當(dāng)用戶正在按下上下箭頭時(shí),將發(fā)生OnChanging事件;當(dāng)用戶按下上下箭頭時(shí),會(huì)發(fā)生OnClick事件。

    我們共同來看一個(gè)例子:

  在窗體上放置兩個(gè)Edit控件,和兩個(gè)UpDown控件,將兩個(gè)UpDown控件的Orientation屬性分別取值udHorizontal和udVertical。

  將第二個(gè)UpDown控件的Max的取值為5000,Position值為100,將他們的Associate屬性分別與兩個(gè)編輯框關(guān)聯(lián)。在對(duì)應(yīng)事件中輸入如下代碼:

void _fastcall TForm1::UpDown1Changeing(TObject *Sender,bool &AllowChange)

{

       Edit1->Text=UpDown1->Position;

}

// 注意參數(shù)AllowChange可以用來指定是否允許改變Position屬性的值。

void _fastcall TForm1::UpDown2Click(TObject *Sender,TUBtnType Button)

{

       Edit2->Text=UpDown2->Position;

}

//注意參數(shù)Button表示哪個(gè)按鈕被按下:btNext為上箭頭或者右箭頭;btPrew為下箭頭或者左箭頭。

  44)問:在UpDown右邊有一個(gè)HotKey組件是做什么的?

  答:熱鍵HotKey用來在程序運(yùn)行期間動(dòng)態(tài)地指定某個(gè)組件或者菜單的快捷鍵。在它的屬性中你只要記住HotKey屬性就可以了,這個(gè)屬性用來返回用戶指定的快捷鍵。

代碼如下:

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

#include <vcl.h>

#pragma hdrstop


#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

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

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

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

void __fastcall TForm1::X1Click(TObject *Sender)

{

Close();

}

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

void __fastcall TForm1::HotKey1Change(TObject *Sender)

{

    X1->ShortCut=HotKey1->HotKey;//X1為菜單名,注意有些書介紹用OnEnter事件,但我覺得不妥,不防你也試一下,用OnEnter你將得不到什么關(guān)聯(lián)J

}

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

  為什么這里用了一個(gè)Button1?如果你的程序中沒有另外一個(gè)組件可以獲得焦點(diǎn),你將感受不到快捷鍵的功能的,因?yàn)榻裹c(diǎn)會(huì)停在HotKey組件上,在這里就是想將焦點(diǎn)轉(zhuǎn)移一下,然后用快捷鍵試一下效果J

6.圖形列表組件TreeView
  45)問:有時(shí)侯,我希望實(shí)現(xiàn)類似資源管理器對(duì)文件夾管理的顯示方式,和對(duì)文件的管理顯示方式,在C++Builder中應(yīng)該怎么辦?

答:在C++Builder中可以直接使用圖形列表組件來實(shí)現(xiàn),它包括TreeView、ListView以及Outline組件。其中Outline組件實(shí)際上是基于Windows 3.1環(huán)境的組件,而且無論從功能還是使用的角度來看,它都無法與TreeView相比,因此完全可以用TreeView組件代替Outline。所以我將主要介紹前面兩種組件。這兩個(gè)組件都在頁Win32中。

  46)問:TreeView組件是一個(gè)怎樣的組件?

  答:TreeView組件比較復(fù)雜,所以我們首先簡單地介紹一下這個(gè)組件的基本使用情況,然后再深入討論。

  TreeView組件采用了樹形結(jié)構(gòu),最典型的例子就是Windows 95的資源管理器,它用樹形結(jié)構(gòu)顯示磁盤上的文件夾和文件。因此TreeView組件能夠清晰地顯示層次關(guān)系。

  47)問:請(qǐng)給我演示一下怎樣在設(shè)計(jì)狀態(tài)編輯TreeView好嗎?

  答:首先在窗體上放置一個(gè)TreeView組件,然后在對(duì)象編輯器中單擊屬性Items中的省略號(hào)按鈕,就會(huì)打開一個(gè)項(xiàng)目編輯器。

  TreeView組件的項(xiàng)目編輯器是一個(gè)在設(shè)計(jì)時(shí)專門增加、刪除節(jié)點(diǎn)和為節(jié)點(diǎn)賦予圖標(biāo)的工具。從屏幕上可以看到,項(xiàng)目編輯器由項(xiàng)目組框和項(xiàng)目屬性組框組成。項(xiàng)目組框由一個(gè)項(xiàng)目列表框、按鈕New Item、按鈕New SubItem、按鈕Delete和按鈕Load組成。當(dāng)你剛打開項(xiàng)目編輯器時(shí),項(xiàng)目列表框是空的,New SubItem和Delete按鈕處于失效狀態(tài)。

  項(xiàng)目屬性組框由編輯框Text、編輯框Image Index、編輯框Selected Index和編輯框State Index組成。

  項(xiàng)目組框可以創(chuàng)建和刪除節(jié)點(diǎn)、子節(jié)點(diǎn)。如果要載入一個(gè)已經(jīng)存在的TreeView節(jié)點(diǎn),可以單擊按鈕Load。要?jiǎng)?chuàng)建一個(gè)新項(xiàng)目,單擊New Item,然后在文本編輯框中輸入新節(jié)點(diǎn)的標(biāo)題。這時(shí),New SubItem按鈕由失效變?yōu)橛行?,允許你在節(jié)點(diǎn)下再嵌套子節(jié)點(diǎn)。如果項(xiàng)目列表框中顯示了節(jié)點(diǎn),那么Delete按鈕也會(huì)變的有效。你只要在項(xiàng)目列表框中選中這個(gè)節(jié)點(diǎn)然后單擊Delete按鈕,就可以刪除這個(gè)節(jié)點(diǎn)了。

  要注意的是:如果刪除的節(jié)點(diǎn)還包括子節(jié)點(diǎn),那么子節(jié)點(diǎn)也會(huì)被同時(shí)刪除。

  項(xiàng)目屬性組框主要是為當(dāng)前選中的節(jié)點(diǎn)(或子節(jié)點(diǎn))設(shè)置屬性的。其中編輯框Text可以修改節(jié)點(diǎn)的標(biāo)題。如果要在不是當(dāng)前被選中的節(jié)點(diǎn)的左邊顯示圖像,那么應(yīng)該在編輯框Image Index中輸入圖像的索引號(hào)。要禁止顯示圖像可以把這個(gè)節(jié)點(diǎn)Image Index設(shè)置為缺省值-1。

  如果要在被選中的節(jié)點(diǎn)的左邊顯示圖像,應(yīng)該在編輯框Selected Index中指定圖像的索引號(hào),索引號(hào)是從0開始的。要禁止顯示圖像可以把它設(shè)置為缺省值-1。

  如果要在節(jié)點(diǎn)的左邊多顯示一個(gè)圖像,可以在編輯框State Index中輸入圖像的索引號(hào)。這個(gè)索引號(hào)代表Tree View組件中的StateImages屬性所表示的圖像列表的索引。要禁止顯示圖像可以把這個(gè)項(xiàng)目設(shè)置為缺省值-1。

  注意:Image Index與 Selected Index 使用的是Images指定的ImageList;而State Index使用的是StateImages 指定的ImageList。

  48)問:TreeView的屬性太多了,我想問我一定要清楚哪些主要屬性?

  答: Items : 該屬性包含TreeView組件中的所有節(jié)點(diǎn),它是TtreeNodes的對(duì)象,在設(shè)計(jì)時(shí),你可以使用項(xiàng)目編輯器來增加、刪除和修改節(jié)點(diǎn)。在運(yùn)行期間,可以通過Items屬性訪問每一個(gè)節(jié)點(diǎn),并且也能夠增加、刪除和修改節(jié)點(diǎn)。而每一個(gè)節(jié)點(diǎn)又都是一個(gè)TtreeNode對(duì)象。

  AutoEWxpand:布爾類型。為true時(shí),則當(dāng)前被選擇的節(jié)點(diǎn)將自動(dòng)擴(kuò)展,沒有被選擇節(jié)點(diǎn)將自動(dòng)折疊。缺省為false,這時(shí)擴(kuò)展和折疊要用戶自己指定。

  DragMode:其聲明為:_property TdragMode DragMode;這個(gè)屬性用來設(shè)置樹狀視圖的拖放模式。缺省為dmManual,用戶要拖放節(jié)點(diǎn)需要調(diào)用BeginDrag才能拖放。若設(shè)置為 dmAutomatic,則樹狀視圖將支持自動(dòng)拖放,用戶可以把一個(gè)節(jié)點(diǎn)拖到另一個(gè)位置。

  Images:用來設(shè)定TreeView中的不同節(jié)點(diǎn)的圖標(biāo)。

  StateImages:用不同的的圖像來表示節(jié)點(diǎn)的不同狀態(tài)。

  在TreeView組件中,每個(gè)節(jié)點(diǎn)除了可以有一個(gè)文字標(biāo)題外,還可以附加圖標(biāo),這樣可以使用戶界面更加直觀。這兩個(gè)屬性就包含著節(jié)點(diǎn)所使用的圖標(biāo)。

  這兩個(gè)屬性都是TImageList的對(duì)象,所以如果要在TreeView組件中給節(jié)點(diǎn)添加圖標(biāo),就必須使用圖標(biāo)列表組件給這兩個(gè)屬性賦值。如果在窗體中放置了圖標(biāo)列表組件,那么單擊屬性Images中的下拉按鈕,就可以選取這個(gè)組件了。

  ShowButtons屬性值為True時(shí)表示凡是有子節(jié)點(diǎn)的節(jié)點(diǎn)將自動(dòng)具有擴(kuò)展按鈕(即+號(hào)按鈕)和折疊按鈕(即減號(hào)按鈕),單擊它們就可以擴(kuò)展和折疊節(jié)點(diǎn)。屬性值為False時(shí),不顯示這兩個(gè)按鈕,缺省值為True。

  ShowLines屬性用來確定是否顯示在節(jié)點(diǎn)和子節(jié)點(diǎn)之間的連線。缺省值為True。

  ShowRoot屬性用來確定與頂層節(jié)點(diǎn)連線是否顯示。缺省值為True。

  HideSelection屬性用來確定當(dāng)輸入焦點(diǎn)從TreeView移動(dòng)到其它控件上時(shí),被選中的節(jié)點(diǎn)是否處于被選中狀態(tài)。當(dāng)屬性值為True時(shí),不再處于選中狀態(tài)。缺省值為True。

  Indent屬性用來設(shè)置子節(jié)點(diǎn)與父節(jié)點(diǎn)之間縮進(jìn)顯示的距離。

  ReadOnly用來確定用戶是否可以直接修改節(jié)點(diǎn)的標(biāo)題。當(dāng)屬性值為False時(shí),表示可以修改。修改方法是,選中要修改的節(jié)點(diǎn)并單擊進(jìn)入編輯狀態(tài)。缺省值為False。

  SortType用來設(shè)置節(jié)點(diǎn)進(jìn)行排序的方式。它有以下幾種取值:

  stNone:不排序(缺省值);

  stData:當(dāng)節(jié)點(diǎn)所關(guān)聯(lián)的對(duì)象發(fā)生改變時(shí)重新排序;

  stText:當(dāng)節(jié)點(diǎn)的標(biāo)簽發(fā)生變化時(shí)重新排序;

  stBoth:當(dāng)節(jié)點(diǎn)所關(guān)聯(lián)的對(duì)象或者節(jié)點(diǎn)的標(biāo)簽發(fā)生改變時(shí)重新排序。

  以上排序原則為在同一層的節(jié)點(diǎn)以標(biāo)簽的字母順序排序。

此外,還有一些運(yùn)行時(shí)態(tài)屬性。

  TopItem:這個(gè)屬性用來設(shè)置一個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)將顯示在樹狀視圖的最上面。

  RowSelcet:缺省為false。若設(shè)置為true,則表示當(dāng)前選擇的節(jié)點(diǎn)所在的整行都將加亮顯示。當(dāng)ShowLines設(shè)置為true時(shí),這個(gè)屬性無效。

  Selected:用來返回當(dāng)前選擇的節(jié)點(diǎn)。

  49)問:屬性Images和StateImages有什么區(qū)別呢?

  答:每一個(gè)節(jié)點(diǎn)可以有兩個(gè)附帶的圖標(biāo)。一般情況下只需要顯示一個(gè)圖標(biāo),這時(shí)我們經(jīng)常使用Images來指定圖標(biāo),也就是說給屬性Images賦予一個(gè)ImageList對(duì)象。如果某個(gè)節(jié)點(diǎn)要顯示兩個(gè)圖標(biāo),那么還需要給屬性StateImages賦予一個(gè)ImageList對(duì)象。然后給節(jié)點(diǎn)的屬性StateIndex指定圖標(biāo)的索引號(hào)。具體的方法是在項(xiàng)目編輯器中,修改編輯框State Index的值。

  其實(shí)在顯示一個(gè)圖標(biāo)時(shí),也可以使用屬性StateImages。但是使用Images屬性有一個(gè)優(yōu)點(diǎn),就是它可以為處于不同狀態(tài)的節(jié)點(diǎn)指定不同的圖標(biāo)。例如在Windows 95的資源管理器中,被選中的節(jié)點(diǎn)顯示一個(gè)打開的文件夾,而沒有選中的節(jié)點(diǎn)顯示一個(gè)關(guān)閉的文件夾。要實(shí)現(xiàn)這一點(diǎn)很簡單,因?yàn)轫?xiàng)目編輯器中的編輯框Image Index指定的圖標(biāo)在節(jié)點(diǎn)未選中時(shí)顯示,而編輯框Seleted Index指定的圖像在節(jié)點(diǎn)選中時(shí)顯示。

  50)問:請(qǐng)?jiān)谇懊嬖O(shè)計(jì)的TreeView組件的基礎(chǔ)上,給TreeView組件中的節(jié)點(diǎn)增加圖標(biāo)。好嗎?

  答:好的,首先在窗體上放置兩個(gè)ImageList組件,這兩個(gè)組件將具有缺省的名字ImageList1和ImageList2。

  其次、編輯ImageList組件:ImageList組件實(shí)際上是一個(gè)圖標(biāo)列表,它可以包含大量的圖標(biāo),這些圖標(biāo)的大小由屬性Width和Height確定,缺省值都是16。

  ImageList剛建立時(shí)不包含任何圖標(biāo),你需要把已創(chuàng)建好的圖標(biāo)引入到ImageList中。這個(gè)工作可以通過ImageList編輯器完成。

  用鼠標(biāo)右鍵單擊ImageList組件,在快捷菜單中選擇ImageList Editor或雙擊一下該組件,就會(huì)出現(xiàn)下面這個(gè)編輯器。

  單擊Add按鈕,在彈出的Add Images對(duì)話框中選擇要引入的圖像文件,圖標(biāo)就會(huì)出現(xiàn)在Images框內(nèi)。從圖中可以看出,引入的圖標(biāo)被自動(dòng)賦予索引號(hào)。

  為了使用上的方便,每一個(gè)圖標(biāo)都有一個(gè)編號(hào),這個(gè)編號(hào)就是這個(gè)圖標(biāo)的索引號(hào)。如果要引用某個(gè)圖標(biāo),只需要使用它的索引號(hào)就可以了。

  要注意的是:這個(gè)編輯器會(huì)自動(dòng)把引入的圖像分解成16×16的圖標(biāo),之所以尺寸為16×16是因?yàn)镮mageList的屬性Width和Height被設(shè)置成了16。如果圖標(biāo)的尺寸不一樣,那么可以修改這兩個(gè)屬性,使其滿足圖標(biāo)的要求。

然后、繼續(xù)用項(xiàng)目編輯器給節(jié)點(diǎn)增加圖標(biāo):我們已經(jīng)在圖標(biāo)列表組件中加入了兩個(gè)圖標(biāo),其索引號(hào)分別為0和1,接著可以使用項(xiàng)目編輯器給節(jié)點(diǎn)增加圖標(biāo)。

  再次打開項(xiàng)目編輯器,輸入所有節(jié)點(diǎn)。

  修改節(jié)點(diǎn)的ImageIndex, SelectedIndex屬性,    

  要注意的是,編輯框Image Index中的索引號(hào)是0,編輯框Selected Index中的索引號(hào)是1。也就是說,在選中或未選中狀態(tài)下,該節(jié)點(diǎn)顯示的圖標(biāo)不同。

  修改所有節(jié)點(diǎn)的圖標(biāo)索引號(hào),使包含子節(jié)點(diǎn)的節(jié)點(diǎn)有兩種不同的圖標(biāo),而不含子節(jié)點(diǎn)的節(jié)點(diǎn)只有一種圖標(biāo),也就是編輯框Image Index和Selected Index的索引號(hào)相同。

  最后,修改TreeView1組件的Images屬性,從下拉列表中選擇ImageList1組件。

  從屏幕上可以看到,圖標(biāo)已經(jīng)出現(xiàn)在控件里面了。

  51)問:那怎樣給節(jié)點(diǎn)增加第二個(gè)圖標(biāo)呢?

  答:要給節(jié)點(diǎn)增加第二個(gè)圖標(biāo),首先必須再創(chuàng)建一個(gè)圖標(biāo)列表組件,然后把這個(gè)圖標(biāo)列表賦值給TreeView組件的屬性StateImages。當(dāng)然還要給這個(gè)圖標(biāo)列表引入圖標(biāo)。

  完成這些工作后,我們就可以進(jìn)入項(xiàng)目編輯器,選中要增加第二個(gè)圖標(biāo)的節(jié)點(diǎn),修改編輯框State Index中的索引號(hào)即可。

  52)問:TreeView有哪些重要的函數(shù)呢?

  答:AlphaSort:其聲明為:bool _fastcall AlphaSort(void);這個(gè)函數(shù)用來對(duì)所有的節(jié)點(diǎn)按標(biāo)簽的字母順序排序。若排序成功,則返回true。

  FullCollapse:其聲明為void _fastcall FullCollapse(void);這個(gè)函數(shù)的作用是折疊所有的節(jié)點(diǎn),直到最頂層為止。

  FullExpand:其聲明為 void _fastcall FullExpand(void);這個(gè)函數(shù)的作用是展開所有的節(jié)點(diǎn),直到最底層為止。若ShowButtons屬性為true,則所有的“+”都會(huì)變成“-”。

  GetHitTestInfoAt:其聲明為THitTests _fastcall GetHitTestInfoAt(int X,int Y);這個(gè)函數(shù)返回指定點(diǎn)與樹狀視圖之間的位置關(guān)系。這個(gè)點(diǎn)的位置由參數(shù)X、Y確定。THitTests是個(gè)集合,它可能包含下面的元素:

  HtAbove:在樹狀視圖的客戶區(qū)上方;

  HtBelow:在樹狀視圖的客戶區(qū)下方;

  HtNowhere:在樹狀視圖的客戶區(qū)內(nèi)但在最后一個(gè)節(jié)點(diǎn)下面;

  HtOnItem:在某個(gè)節(jié)點(diǎn)的標(biāo)簽或者圖標(biāo)上;

  HtOnButton:在某個(gè)節(jié)點(diǎn)的左邊的圖標(biāo)上;

  HtOnIcon:在某個(gè)節(jié)點(diǎn)的圖標(biāo)上;

  HtOnIndent:在某個(gè)節(jié)點(diǎn)的縮進(jìn)線上;

  HtOnLabel:在某個(gè)節(jié)點(diǎn)的標(biāo)簽上;

  htOnRight:在某個(gè)節(jié)點(diǎn)的右邊;

  htOnStateIcon:在某個(gè)節(jié)點(diǎn)的狀態(tài)圖標(biāo)上;

  htToLeft:在客戶區(qū)的右邊;

  htToRight:在客戶區(qū)的的左邊。

  GetNodeAt:其聲明為TTreeNode*_fastcall GetNodeAt(int X,int Y);這個(gè)函數(shù)用來返回指定點(diǎn)所在的節(jié)點(diǎn)。參數(shù)X、Y為這個(gè)點(diǎn)的坐標(biāo)。如果這個(gè)點(diǎn)沒有節(jié)點(diǎn),則返回NULL。

53)問:能介紹一下TTreeNodes與TTreeNode?

答:在BCB中,樹狀視圖的節(jié)點(diǎn)是通過TTreeNodes對(duì)象來管理的,通過這個(gè)對(duì)象可以對(duì)樹狀視圖進(jìn)行動(dòng)態(tài)的增加、刪除、插入、移動(dòng)節(jié)點(diǎn)等操作。而每一個(gè)節(jié)點(diǎn)都是一個(gè)TTreeNode對(duì)象。

  TTreeNode的主要屬性和函數(shù):

  Count:這個(gè)屬性用來返回某個(gè)節(jié)點(diǎn)所擁有的子節(jié)點(diǎn)的數(shù)目。它不包括其子節(jié)點(diǎn)。

  Item:其聲明為:_property TTreeNode* Item[int Index];這個(gè)屬性用來訪問該節(jié)點(diǎn)的某個(gè)子節(jié)點(diǎn)。其中參數(shù)Index為其子節(jié)點(diǎn)在所有子節(jié)點(diǎn)中的位置。

  Index:這個(gè)屬性用來返回該節(jié)點(diǎn)在其父節(jié)點(diǎn)的所有子節(jié)點(diǎn)中的位置。

  Text:這個(gè)屬性用來設(shè)置或者返回節(jié)點(diǎn)的標(biāo)簽。

  Delete:這個(gè)函數(shù)用來刪除該節(jié)點(diǎn)本身。

  DeleteChildren:這個(gè)函數(shù)用來刪除該節(jié)點(diǎn)的所有子節(jié)點(diǎn)。

  EditText:這個(gè)函數(shù)用來對(duì)節(jié)點(diǎn)進(jìn)行就地編輯。

  IndexOf:其聲明為:int _fastcall IndexOf(TTreeNode* Value);這個(gè)函數(shù)將返回該節(jié)點(diǎn)的某個(gè)子節(jié)點(diǎn)的序號(hào)。子節(jié)點(diǎn)由參數(shù)value指定。如果參數(shù)value指定的節(jié)點(diǎn)不是該節(jié)點(diǎn)的子節(jié)點(diǎn),函數(shù)將返回-1。

  TTreeNodes的主要屬性和函數(shù):

  Count:這個(gè)屬性用來返回樹狀視圖中節(jié)點(diǎn)的數(shù)目。

  Add:其聲明為:TTreeNode *_fastcall Add(TTreeNode,const System::AnsiString S);這個(gè)函數(shù)將在樹狀視圖中增加一個(gè)節(jié)點(diǎn),新節(jié)點(diǎn)成為參數(shù)Node 指定的節(jié)點(diǎn)的父節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn),參數(shù)S為新節(jié)點(diǎn)的標(biāo)簽。

  AddChild:其聲明為: TTreeNode *_fastcall AddChild(TTreeNode,const System::AnsiString S);增加的新節(jié)點(diǎn)為參數(shù)Node指定的節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn)。

  AddChildFirst:其聲明為: TTreeNode *_fastcall AddChildFirst(TTreeNode,const System::AnsiString S);這個(gè)函數(shù)與AddChild不同的是新增加的節(jié)點(diǎn)為Node節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)。

  AddFirst :其聲明為:TTreeNode *_fastcall AddFirst(TTreeNode,const System::AnsiString S);這個(gè)函數(shù)與Add 相似,不同的是新節(jié)點(diǎn)成為Node節(jié)點(diǎn)的父節(jié)點(diǎn)的第一個(gè)子節(jié)點(diǎn)。

  Clear:這個(gè)函數(shù)將把整個(gè)樹狀視圖都清空。

  Delete:其聲明:void _fastcall Delete(TTreeNode *Node);這個(gè)函數(shù)將刪除參數(shù)Node 指定的節(jié)點(diǎn)。

  Insert:其聲明為:TTreeNode _fastcall Insert (TTreeNode* Node,const System::AnsiString S);這個(gè)函數(shù)用來在參數(shù)Node 指定的節(jié)點(diǎn)之后插入一個(gè)新的節(jié)點(diǎn),新節(jié)點(diǎn)的標(biāo)簽由參數(shù)S指定。

  7.圖形列表組件ListView
  54)問:TreeView組件能夠?qū)崿F(xiàn)資源管理器左邊顯示區(qū)的內(nèi)容,可是它右邊顯示區(qū)能將列表用各種不同的方式顯示,例如大圖標(biāo)方式、小圖標(biāo)方式、簡單列表方式和詳細(xì)列表方式。這在C++Builder應(yīng)該怎樣來實(shí)現(xiàn)?

  答:這可以用ListView組件來實(shí)現(xiàn),ListView組件從功能上講與列表框相似,但是從組件的屬性來看與TreeView相似。ListTiew組件所建立的列表可以用各種不同的方式顯示,例如大圖標(biāo)方式、小圖標(biāo)方式、簡單列表方式和詳細(xì)列表方式。

  ListView組件中的一部分屬性與TreeView組件中的屬性是相同的,例如Items,StateImages等。還有一些屬性是ListView特有的。

LargeImages屬性用來設(shè)置存放大圖標(biāo)的圖標(biāo)列表,當(dāng)列表處于大圖標(biāo)顯示方式時(shí),列表使用這個(gè)圖標(biāo)列表中的圖標(biāo)顯示。

  SmallImages屬性用來設(shè)置存放小圖標(biāo)的圖標(biāo)列表,當(dāng)列表處于小圖標(biāo)顯示方式時(shí),列表使用這個(gè)圖標(biāo)列表中的圖標(biāo)顯示。

  MultiSelected屬性可確定用戶是否可以同時(shí)選擇多個(gè)項(xiàng)目。缺省值為false。

  屬性ViewStyle確定了顯示風(fēng)格,可以取這樣一些值。

  vsIcon:列表以大圖標(biāo)方式顯示,可以進(jìn)行拖放操作。只顯示第一層節(jié)點(diǎn),放置方式由Arrangement決定。

  vsSmallIcon:列表以小圖標(biāo)方式顯示,可以進(jìn)行拖放操作。只顯示第一層節(jié)點(diǎn),放置方式由Arrangement決定。

  vsList:以簡單列表的方式顯示,不能進(jìn)行拖放操作。節(jié)點(diǎn)是豎向放置的,只顯示第一層節(jié)點(diǎn),Arrangement不起作用。

  vsReport:以詳細(xì)列表的方式顯示,顯示的信息可以分成多列。最左邊的列顯示圖標(biāo)和文字,其余的列顯示詳細(xì)信息。節(jié)點(diǎn)是豎向放置的,每一層均已經(jīng)展開,只有此時(shí)Columns的設(shè)置才起作用,Arrangement不起作用。

  屬性Columns  當(dāng)屬性ViewStyle被設(shè)置為vsReport時(shí),列表中的每一項(xiàng)可以分成多列顯示,這個(gè)屬性用于設(shè)置列數(shù)和列的標(biāo)題。

  在設(shè)計(jì)時(shí),按下Columns屬性Value列中的省略號(hào)按鈕可以打開一個(gè)ListView Columns編輯器,在這個(gè)編輯器中可以生成和編輯列及列的標(biāo)題。

  屬性ColumnClick的值為True時(shí),列表中的標(biāo)題可以作為按鈕使用, 這個(gè)屬性最常見的應(yīng)用是在Windows 95的資源管理器中,單擊文件名或者其它幾個(gè)列標(biāo)題,列表中的文件就會(huì)按照文件名重新排序。

  屬性Items 包含列表中所有項(xiàng)目的集合。與TreeView組件中的Items屬性類似,這個(gè)屬性也有一個(gè)項(xiàng)目編輯器,你可以使用這個(gè)編輯器在設(shè)計(jì)時(shí)增加、刪除項(xiàng)目,設(shè)置項(xiàng)目的圖標(biāo)索引以及標(biāo)題等。它的使用方法與TreeView組件的Items編輯器基本相同。

  IconOptions屬性用來設(shè)置圖標(biāo)的顯示方式。它還包含幾個(gè)子屬性:

  (1)Arrangement屬性:當(dāng)該屬性等于iaTop時(shí),表示圖標(biāo)從左到右排列在ListView組件的頂部;等于iaLeft時(shí),表示圖標(biāo)從上到下排列在組件的左邊。

 ?。?)AutoArrange屬性:等于True時(shí),表示增加、刪除或移動(dòng)圖標(biāo)時(shí)圖標(biāo)將自動(dòng)重排。

  (3)WrapText屬性:等于True時(shí),表示當(dāng)項(xiàng)目的標(biāo)題超過圖標(biāo)的寬度時(shí)標(biāo)題將換行。

  此外,還有運(yùn)行時(shí)態(tài)屬性

  Selected屬性用來返回列表中被選中的項(xiàng)目。

  TopItem屬性用來返回列表中當(dāng)前可見的最頂端的項(xiàng)目。

  55)問:請(qǐng)您編寫一個(gè)程序來幫助我理解和記憶ListView控件好嗎?

  答:好的,選擇File菜單的New Application菜單項(xiàng),打開一個(gè)空的工程,在窗體上放置一個(gè)ListView控件,兩個(gè)ImageList控件,一個(gè)ListBox控件。

  選中ImageList1控件,將它的Height和Width屬性設(shè)置為32。雙擊ImageList1控件,打開圖像列表編輯框。點(diǎn)擊Add按鈕,選擇一個(gè)大圖標(biāo)文件。點(diǎn)擊打開按鈕。然后點(diǎn)擊OK按鈕。同樣方法給ImageList2控件加上小圖標(biāo)。選擇TreeView控件,將它的LargeImages屬性修改為ImageList1。

將它的SmallImages屬性修改為ImageList2。在ListView控件上點(diǎn)擊鼠標(biāo)右鍵,選擇Columns Editor選項(xiàng)(當(dāng)然我們只要點(diǎn)擊屬性Columns右邊的“…”就可以了)。彈出Columns編輯對(duì)話框。點(diǎn)擊Add New工具按鈕加入四個(gè)列表,選中它們,將它們的caption屬性修改為名稱、大小、類型、修改時(shí)間。

  關(guān)閉列表編輯對(duì)話框。

  在ListView控件上點(diǎn)擊鼠標(biāo)右鍵(同樣我們只要點(diǎn)擊 Itmes屬性右邊的“…”也一樣),選擇Items Editor選項(xiàng)。彈出Items編輯對(duì)話框(與TreeView的Items Editor差不多),輸入樹型結(jié)構(gòu)文檔。在這里,點(diǎn)擊“New Item”按鈕可以新建一個(gè)項(xiàng),“NewSubItem”按鈕用來設(shè)置這個(gè)項(xiàng)的子項(xiàng)。“Delete”用來刪除某個(gè)項(xiàng),包括它的子項(xiàng)。項(xiàng)司性編輯框中,Caption為這個(gè)項(xiàng)的標(biāo)題,另外兩個(gè)為項(xiàng)的圖標(biāo)。

  編寫列表框的OnClick事件代碼如攏?/P>

void __fastcall TForm1::ListBox1Click(TObject *Sender)

{

switch(ListBox1->ItemIndex)

   {

     case 0:    ListView1->ViewStyle=vsIcon;

                break;

     case 1:    ListView1->ViewStyle=vsSmallIcon;

                break;

     case 2:    ListView1->ViewStyle=vsList;

                break;

     case 3:    ListView1->ViewStyle=vsReport;

                break;

   }

}

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


  把ListView中的ViewStyle屬性改為vsReport,否則你將得不到上面的那種顯示方式。

  最后,編譯并運(yùn)行這個(gè)程序,選擇不同的類型,我們可以看到TreeView控件的效果。

  56)問:在TreeView、ListView中的圖標(biāo)管理能再說一下嗎?

  答:圖形列表組件很難理解的,主要問題是不太容易掌握它使用圖標(biāo)的方式。圖形列表組件使用一個(gè)名為ImageList的組件管理所有的圖標(biāo),ImageList給每個(gè)圖標(biāo)提供一個(gè)索引號(hào),這樣在TreeView或ListView組件引用時(shí)就不必指出圖標(biāo)的名字而直接指定索引號(hào)就可以了。用ImageList集中管理圖標(biāo),用戶使用圖標(biāo)索引號(hào)的方式的確從某種角度減輕了編程人員的負(fù)擔(dān),但是也使得他們在編程時(shí)必須記住一大堆編號(hào)代表的各是哪一種圖標(biāo),這就在一定程度上削弱了ImageList的優(yōu)勢,也許在C++Builder以后的版本中能有更好的方法。

  57)問:如何動(dòng)態(tài)的創(chuàng)建一個(gè)列表視圖呢?

  答:我們舉例說明。我先建立如圖的界面。

并編寫如下的代碼:

//------------------------------
#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//------------------------------
#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

//------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)

{

const char Names[6][3][10] =

   {{"廣東省","廣州市","華南"},

    {"上海市", "上海市","華東"},

    {"北京市", "北京市","華北"},

    {"遼寧省", "沈陽市","東北"},

    {"湖北省", "武漢市","華中"},

    {"云南省", "昆明市","西南"}};//準(zhǔn)備各項(xiàng)的文字

  TListColumn  *NewColumn;//創(chuàng)建一個(gè)欄

  TListItem  *ListItem;//創(chuàng)建一個(gè)Items

  ListView1->ViewStyle = vsReport;//定義顯示方式

  Button3->Enabled=false;

  NewColumn = ListView1->Columns->Add();//增加欄

  NewColumn->Caption = "省份";//添置欄的名稱

  NewColumn = ListView1->Columns->Add();

  NewColumn->Caption = "省會(huì)";

  NewColumn = ListView1->Columns->Add();

  NewColumn->Caption = "方位";

  for (int i = 0; i < 6; i++)

  {

    ListItem = ListView1->Items->Add();

    ListItem->Caption = Names[i][0];//添置父節(jié)點(diǎn)

    ListItem->SubItems->Add(Names[i][1]);//添置子節(jié)點(diǎn)

    ListItem->SubItems->Add(Names[i][2]);

  }

}/*此處有些朋友總感覺為什么還要?jiǎng)?chuàng)建TListColumn  *NewColumn;

  TListItem  *ListItem;其實(shí)我們只要這樣想就可以了,我們再手功創(chuàng)建時(shí)打開Columns、Items時(shí)等于又創(chuàng)建了一個(gè)項(xiàng)目,他們并不存在,我們卻要用,所以只能用這種方法來動(dòng)態(tài)創(chuàng)建了J*/

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

void __fastcall TForm1::Button1Click(TObject *Sender)

{

TListItem  *temp;

temp=ListView1->Items->Add();

temp->Caption=Edit1->Text;

temp->SubItems->Add(Edit2->Text);

temp->SubItems->Add(Edit3->Text);

}

//------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)

{

ListView1->Items->Clear();        

}

//------------------------------
void __fastcall TForm1::RadioButton1Click(TObject *Sender)

{

ListView1->ViewStyle = vsReport;

Button3->Enabled=false;

}

//------------------------------
void __fastcall TForm1::RadioButton2Click(TObject *Sender)

{

ListView1->ViewStyle = vsIcon;

Button3->Enabled=true;

}

//------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)

{

ListView1->AlphaSort(); //這個(gè)函數(shù)的作用是把列表視圖中的項(xiàng)按照它們的標(biāo)簽字母順序排列,成功返回true。      

}

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


  58)問:我要想對(duì)TreeView、ListView里面的項(xiàng)進(jìn)行操作如何來進(jìn)行呢?

  答:我們一般都是通過OnChange或OnChangeing事件來完成的,我們通過一個(gè)例子來看一下他們的應(yīng)用及區(qū)別,我們在窗體中放上一個(gè)TreeView和一個(gè)Memo組件,并在TreeView的OnChange和OnChangeing分別寫如下代碼:

//------------------------------
#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//------------------------------
#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

//------------------------------
void __fastcall TForm1::tvwChange(TObject *Sender, TTreeNode *Node)

{

        if(Node->Text=="遼寧")

        Memo1->Lines->Add("I'm change!") ;

}

//------------------------------
void __fastcall TForm1::tvwChangeing(TObject *Sender, TTreeNode *Node,

      bool &AllowChange)

{

        AllowChange=false;

        if(Node->Text=="遼寧")

        Memo1->Lines->Add("I'm changeing!") ;

}

//------------------------------
   運(yùn)行效果如下:

    只有OnChangeing起了作用,為什么呢?再看下面代碼:

//------------------------------
#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//------------------------------
#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

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

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

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

void __fastcall TForm1::tvwChange(TObject *Sender, TTreeNode *Node)

{

        if(Node->Text=="遼寧")

        Memo1->Lines->Add("I'm change!") ;

}

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

void __fastcall TForm1::tvwChangeing(TObject *Sender, TTreeNode *Node,

      bool &AllowChange)

{

        //AllowChange=false;這與把此句寫成AllowChange=true是一樣的

        if(Node->Text=="遼寧")

        Memo1->Lines->Add("I'm changeing!") ;

   兩個(gè)事件都起作用了,并且OnChangeing先于Onchange發(fā)生,所以原因很顯然:這一切都是OnChangeing的參數(shù)AllowChange造成的,所以要注意對(duì)這個(gè)參數(shù)的使用。

   在ListView中只要把上面的Node->Text改成Item->Caption就可以了。

8.圖形類組件
  59)問:Windows是一個(gè)圖形系統(tǒng),C++Builder是怎樣處理圖形的呢?

答:C++Builder通過提供圖形組件來處理圖形,其中比較常用的有圖像組件(Image)、幾何圖形組件(Shape)和畫板組件(PaintBox)。前兩個(gè)組件位于Additional頁中,畫板組件位于System頁中。

  在BCB中,F(xiàn)orm、Image、BitMap、PaintBox等都具有繪圖能力,這些組件中都有Canvas屬性。

  60)問:圖像控件有哪些特殊的屬性?

  答:圖像組件可以顯示各種以文件形式存儲(chǔ)在磁盤上的圖形。它有這樣一些特殊的屬性。

  AutoSize屬性,當(dāng)屬性值為True時(shí),圖像組件會(huì)自動(dòng)調(diào)節(jié)尺寸以便適應(yīng)圖像組件的大小。缺省值為True。

  Stretch屬性,當(dāng)該屬性為True時(shí),圖像的尺寸自動(dòng)調(diào)整并填滿整個(gè)圖像組件的范圍。但I(xiàn)CO文件無法產(chǎn)生這種效果。缺省值為False。

  Transparent屬性,確定是否允許圖像中指定的顏色透明,從而使組件下面的物體顯示出來。缺省值為False。

  Center屬性,當(dāng)該屬性為True時(shí),圖像居中顯示;否則,從左上角開始顯示。

  屬性Picture,你可以在設(shè)計(jì)階段利用這個(gè)屬性指定所要顯示的圖片,也可以在運(yùn)行期間再顯示。前面一種情況下,你可以單擊Picture屬性的Value列中的省略號(hào)按鈕,這時(shí)會(huì)出現(xiàn)一個(gè)圖片編輯對(duì)話框,單擊對(duì)話框中的Load按鈕就可以選擇載入要顯示的圖片了。

  61)問:如果是在程序運(yùn)行期間載入圖片,應(yīng)該怎么辦?

  答:如果是在程序運(yùn)行期間載入圖片,那么可以使用TPicture類的方法LoadFromFile,這個(gè)方法可以載入存儲(chǔ)在磁盤上的圖像文件。例如要載入D盤根目錄下的picture.bmp,可以這樣調(diào)用:

  Image1->Picture->LoadFromFile("d:\\picture.bmp");

  這個(gè)控件可處理的圖片文件的類型有:.BMP文件、.ICO文件、.EMF和.WMF等多種圖像文件。如果你試圖載入一種無法識(shí)別的文件類型,將會(huì)產(chǎn)生異常錯(cuò)誤。

  62)問:能說一下AutoSize與Stretch的區(qū)別嗎?

  答:好的,在窗體上放置兩個(gè)圖像組件,將左邊的圖像組件的AutoSize屬性為True,所以載入任何圖片后,組件的尺寸與圖片的尺寸完全相同。而且如果你增大或減小圖像組件的尺寸,圖片的顯示仍然不變。將右邊的圖像組件的AutoSize屬性設(shè)置為False,將它的Stretch屬性設(shè)置為True。當(dāng)你增大或減小圖像組件的尺寸,圖片將按比例增大或縮小,也就是說圖片始終充滿整個(gè)組件。

  63)問:TShape控件有什么重要屬性?

  答:這個(gè)組件可以顯示一些常見的幾何圖形,例如矩形、圓、橢圓等。幾何圖形組件有幾個(gè)比較重要的屬性:Brush,Pen 和Shape。

  Brush屬性,用來設(shè)置幾何圖形內(nèi)部的填充特性,包括填充的圖案(Style)和顏色(Color)等。

  Pen屬性,用來設(shè)置幾何圖形的外框特性,包括畫筆的顏色(Color)、線型(Style)和線寬(Width)及Mode關(guān)系等。

  屬性Shape,用來指出所顯示的幾何圖形類型。這個(gè)屬性可以有六種不同的值,分別表示六種不同的幾何圖形;

 ?。?)stEllipse表示橢圓。

 ?。?)stRectangle表示矩形。

 ?。?)stRoundRect表示圓角矩形。

 ?。?)stRoundSquare表示圓角正方形。

 ?。?)stSquare表示正方形。

 ?。?)stCircle表示圓。

  在設(shè)計(jì)階段,你可以使用鼠標(biāo)改變圖形的尺寸。在運(yùn)行期間,可以通過Height和Width屬性改變圖形的尺寸。

  64)問:屬性Brush前面有一個(gè)加號(hào),它是什么意思?

  答:它表示這個(gè)屬性是可以展開的,也就是說,它還包含一些子屬性。單擊加號(hào),可以發(fā)現(xiàn)它的子屬性是:Color和Style。

  Color屬性包含一系列C++Builder預(yù)定義的顏色,你可以從中為顯示的幾何圖形選擇一種填充顏色。

  Style屬性確定了幾何圖形的填充樣式,它可以分別取這樣8種值:bsBDiagonal, bsClear, bsCross, bsDiagCross, bsDiagonal, bsHorizontal, bsSolid和bsVertical。

  屬性Pen也象屬性Brush一樣有子屬性。它的子屬性是Color, Mode, Style和Width。其中最常用的就是Style和Width,它們分別表示線型和線寬。子屬性Style可以取這樣一些值來畫邊框:

  psSolid
  表示實(shí)線。
  
  psDash
  表示破折號(hào)。
  
  psDot
  表示圓點(diǎn)。
  
  psDashDot
  表示破折號(hào)和圓點(diǎn)。
  
  psDashDotDot
  表示破折號(hào)、圓點(diǎn)、圓點(diǎn)。
  
  psClear
  表示沒有線。
  
  psInsideFrame
  表示內(nèi)框?qū)嵕€。
  
  65)問:這個(gè)畫板組件有什么作用?

  答:畫板組件主要為用戶提供一塊作圖區(qū)域,用戶可以使用繪圖語句在這個(gè)作圖區(qū)域上畫出各種不同的圖形。

  要注意的是,由于畫板組件沒有邊界,所以通常應(yīng)該把它放在一個(gè)有邊界的容器類組件上。

  畫板組件主要使用Canvas屬性來進(jìn)行繪圖工作。Canvas(畫布)是類TCanvas的對(duì)象,類TCanvas包含繪圖中使用的各種方法和屬性。下面我們首先介紹Canvas對(duì)象的各種屬性。

  畫筆(Pen)  Canvas對(duì)象中有一個(gè)畫筆成員,它確定繪制幾何圖形時(shí)使用的畫筆類型。剛才我們介紹了畫筆的線型和線寬。

  畫筆的Color屬性是繪圖時(shí)使用的前景色。

  畫筆的屬性Mode用來確定畫筆與屏幕上原有點(diǎn)的混合方式??山Y(jié)合當(dāng)前的顏色、屏幕的顏色或它們的反轉(zhuǎn)值,對(duì)線段的顏色重新定義。但不改變Color屬性。

  它可以取這樣一些值:

  pmBlack:表示用黑色繪圖;

  pmWhite:表示用白色繪圖;

  pmNot:畫筆繪制的點(diǎn)的顏色與原有的顏色相反;

  pmCopy:畫筆用Color屬性中定義的顏色繪圖。

  PmNotCopy:畫筆用Color屬性中定義的顏色的反轉(zhuǎn)色繪圖;

  PmMergePenNot:畫筆用Color屬性中定義的顏色與屏幕顏色的反轉(zhuǎn)色結(jié)合后繪圖;

  PmMaskNotPen:畫筆用屏幕顏色與Color屬性中定義的顏色結(jié)合后繪圖;

  PmMergeNotPen:畫筆用屏幕顏色與Color屬性中定義的顏色的反轉(zhuǎn)值結(jié)合后繪圖。

  Brush屬性,刷子屬性在前面已經(jīng)詳細(xì)介紹過,它可以確定圖形的填充模式和填充顏色。

  屬性ClipRect,用來確定繪圖區(qū)域的范圍。任何超出這個(gè)范圍的圖形不會(huì)顯示。

  66)問:在Canvas對(duì)象上,我們可以用怎樣的方法來完成作圖工作?

  答:Canvas對(duì)象有一些基本做圖方法:

  1.首先是MoveTo方法,MoveTo將筆的當(dāng)前位置設(shè)置到點(diǎn)(x,y)處,筆的當(dāng)前位置將保存到PenPos屬性中,要注意的是,改變筆的當(dāng)前位置用MoveTo方法,而不要修改PenPos屬性。函數(shù)形式為MoveTo(x,y)。

  2.LineTo方法,用來完成從當(dāng)前位置畫一條直線至點(diǎn)(x,y),并把筆的位置移動(dòng)到這一點(diǎn)。函數(shù)形式為LineTo(x,y)。

  在畫線時(shí)一般首先使用方法MoveTo移動(dòng)線的起始點(diǎn),然后再使用方法LineTo畫直線。

  3.方法Rectangle用來在畫布上用當(dāng)前畫刷繪制矩形,其中x1,y1是矩形的左上角坐標(biāo),x2,y2是矩形的右下角坐標(biāo)。因?yàn)檎叫螌?shí)際上就是一種特殊的矩形,所以你可以使用這個(gè)方法畫出正方形。函數(shù)形式為Rectangle(x1,y1,x2,y2)。

  4.方法Ellipset用來在畫布上給定的矩形邊界上畫一個(gè)橢圓,其中x1,y1是邊界矩形的左上角坐標(biāo),x2,y2是邊界矩形的右下角坐標(biāo)。所謂邊界矩形就是圓或橢圓的外接矩形。函數(shù)形式為Ellipse(x1,y1,x2,y2)。

  5.方法RoundRect用來繪制圓角矩形:其中x1,y1,x2,y2分別是圓角矩形虛擬的左上角和右下角。x3,y3是圓角的長短半徑。函數(shù)形式為RoundRect(x1,y1,x2,y2)。

  6.方法Polygon可以畫出多邊形。函數(shù)形式為Polygon(Tpoint p,int Point_Size)。

  參數(shù)P是類Tpoint的一個(gè)數(shù)組,每一個(gè)Tpoint對(duì)象包含一個(gè)點(diǎn)的X和Y坐標(biāo)。Points_Size用來指示數(shù)組的大小。這個(gè)是實(shí)心多邊形,Polyline是畫多邊形的,二者用法基本相同。

  67)問:在顯示區(qū)域輸出文本信息,我們是不是還象DOS下用printf函數(shù)來實(shí)現(xiàn)?

  答:printf是一個(gè)控制臺(tái)函數(shù),不能在窗口程序中使用,一般我們TextOut輸出文本,其聲明:void _fastcall TextOut(int X,int Y,const AnsiString Text);其中x,y是輸出字符串起始點(diǎn)的坐標(biāo),text是要輸出的文本。當(dāng)然你要用Lable也是可以的J

 

9.多頁組件
  68)問:我覺得C++Builder的組件模板的管理方式很好,在這個(gè)模板中通過單擊頁就可以在各個(gè)頁之間進(jìn)行切換,在C++Builder中我應(yīng)該怎樣來實(shí)現(xiàn)呢?

答:我們可以用多頁組件來實(shí)現(xiàn),它的好處就是可以在有限的空間中盡量多地存放信息,而且便于把信息分類。就拿組件模板來說吧,在那么小的屏幕中放置了上百個(gè)組件,而且并不顯得凌亂,這都是多頁組件的功勞。

  如果窗體上要放置大量的組件,而且這些組件又是分組使用的,那么可以考慮使用多頁組件。這樣做可以使窗體更加簡潔明了。多頁組件既有多頁的特性,又是一個(gè)容器組件,它就像窗體一樣可以包含其他的組件。

  C++Builder提供了幾種功能相似的多頁組件,它們是:Win32頁中的TabControl,PageControl組件,Win31頁中的TabSet和TabbedNoteBook組件。從它們所在的頁的不同就可以知道,前兩個(gè)組件是應(yīng)用在32位系統(tǒng)中的組件,無論從性能還是風(fēng)格上來看,這兩個(gè)組件都更適合在Windows 95以上的板本中使用。后面兩種組件是為喜愛Windows 3.1風(fēng)格的用戶保留的,其實(shí)我們完全可以只使用前兩種組件。

  69)問:TabControl組件和PageControl組件他們看起來簡直是一模一樣?

  答:初看起來這兩種組件的確差不多,我們可以通過下面的操作可以說明這一點(diǎn)。

 ?。?)在窗體上放置這兩個(gè)組件,通過修改Height和Width屬性把它們的尺寸設(shè)置成相同的。

 ?。?)在對(duì)象編輯器中,單擊TabControl的屬性Tabs中的省略號(hào)按鈕,這時(shí)會(huì)彈出一個(gè)字符串編輯器。在這個(gè)編輯器中分三行輸入第一頁,第二頁和第三頁。然后點(diǎn)擊OK按鈕。

  (3)在窗體中選取PageControl組件,用鼠標(biāo)右鍵單擊該組件,在彈出的快捷菜單中選擇NewPage命令,PageControl組件將生成一個(gè)缺省名為“TabSheetN”的頁,其中N是從1開始的整數(shù)。第一次運(yùn)行New Page命令生成的頁名為TabSheet1,第二次生成的名為TabSheet2,以此類推。我們使用這個(gè)命令生成三個(gè)頁。

  與TabControl組件不同的是,你可以直接單擊頁來切換頁面。單擊頁在切換頁面的同時(shí)也選中了整個(gè)PageControl組件。如果要選擇某個(gè)頁,可以先單擊頁切換到該頁,然后再單擊頁面就可以了。

4)在對(duì)象編輯器中,選擇TabSheet1,TabSheet2和TabSheet3的Caption屬性,把它分別修改為第一頁,第二頁和第三頁。

  這樣看起來他們就完全一樣。

  70)問:但要是一樣,為什么有兩個(gè)不同的組件呢,用一個(gè)不就行了,好象他們并不真的完全一樣?

  答:你說的對(duì),千萬不要被他們的外表假象所蒙蔽,實(shí)際上它們并不一樣。TabControl是一種“假”多頁組件,而PageControl才是“真”多頁組件。

  我們知道多頁組件把所要顯示的信息放在不同的頁中,實(shí)際上每個(gè)頁都是一個(gè)窗體,并可以通過頁來進(jìn)行頁的切換。TabControl組件雖然有多個(gè)頁,但是實(shí)際上只有一個(gè)頁的模板,也就是說,每次用戶單擊頁時(shí),這個(gè)頁都要根據(jù)頁模板更新一次,以便對(duì)用戶的選擇作出響應(yīng)。

  很顯然,如果需要在每個(gè)頁上顯示不同的組件,那么TabControl肯定無法勝任這種工作。因?yàn)槟忝看螕Q頁時(shí),必須用代碼更新頁模板,這在C++Builder中實(shí)在不是一個(gè)好辦法。如果每個(gè)頁所顯示的組件相同只是內(nèi)容有變化,那么使用TabControl會(huì)更加合適,因?yàn)樗牡南到y(tǒng)資源比較少。

  而PageControl則是每頁對(duì)應(yīng)一個(gè)頁模板。所以,它適宜于每頁都不同的情況。

  71)問:TabControl組件有哪些常用的屬性?

  答:HotTrack屬性用來確定當(dāng)鼠標(biāo)指向頁時(shí),頁上的標(biāo)簽是否自動(dòng)被加亮顯示。缺省值為False。

  MultiLine屬性用來確定當(dāng)頁一行顯示不下時(shí)是否顯示到下一行。缺省值False表示在一行無法顯示完時(shí),在行的右邊自動(dòng)出現(xiàn)一個(gè)雙向箭頭,可以用來移動(dòng)頁。

  TabHeight屬性用來設(shè)置頁的高度。缺省?表示頁的高度將自動(dòng)適應(yīng)頁上文本的高度。

  TabWidth屬性用來設(shè)置頁的寬度。缺省值0表示頁的寬度將自動(dòng)適應(yīng)頁上文本的寬度。

  TabPosition屬性為tpTop時(shí),表示將頁放在TabControl組件的上面,為tpBottom時(shí)則表示放在下面。

  TabControl組件上的每一個(gè)頁都有自己的索引,最左邊的頁的索引為0,緊接著的頁的索引為1,以此類推。TabIndex屬性返回當(dāng)前被按下的頁。

  Tabs屬性用來設(shè)置頁的個(gè)數(shù)及其標(biāo)題,在設(shè)計(jì)時(shí)是使用一個(gè)字符串編輯器來實(shí)現(xiàn)的。

  72)問:TabControl控件有哪些比較重要的事件呢?

  答:TabControl有兩個(gè)比較重要的事件OnChange和OnChanging。每當(dāng)頁被選中后就會(huì)發(fā)生OnChange事件,這時(shí)可以根據(jù)屬性TabIndex判斷哪個(gè)頁被選中,然后再采取響應(yīng)的動(dòng)作。

  OnChanging事件正好發(fā)生在頁被選中之前,也就是正好在一個(gè)頁切換到另一個(gè)頁之前。這個(gè)事件使得我們可以在頁切換之前采取某些行動(dòng),例如在某些條件沒有設(shè)置之前不準(zhǔn)離開這一頁。

  其實(shí)這兩個(gè)事件以前我們已經(jīng)詳細(xì)的研究過,這里就不再舉例說明了。

73)問:PageControl組件好像比TabControl組件功能更強(qiáng)大,它是怎樣使用的?

  答:與TabControl相比,PageControl組件的功能確實(shí)更加強(qiáng)大,但是卻并不復(fù)雜。PageControl中的每一個(gè)頁都是一個(gè)TTabSheet組件,這個(gè)組件實(shí)際上是一個(gè)容器,你可以在上面放置各種控件。每個(gè)TTabSheet組件都有自己的屬性。

  實(shí)際上這里有兩層關(guān)系。最頂層的是PageControl組件,它負(fù)責(zé)管理多個(gè)TTabSheet組件,而每個(gè)TTabSheet組件也管理著放在它上面的組件。

  74)問:PageControl組件有哪些比較重要的屬性呢?

  答:ActivePage這個(gè)屬性顯示當(dāng)前被選中的頁,它也可以用來切換頁。

  MultiLine屬性用來確定當(dāng)頁一行顯示不下時(shí)是否顯示到下一行。缺省值False表示在一行無法顯示完時(shí),在行的右邊自動(dòng)出現(xiàn)一個(gè)雙向箭頭,可以用來移動(dòng)頁。缺省值為False。

  TabHeight屬性用來設(shè)置頁的高度。缺省值0表示頁的高度將自動(dòng)適應(yīng)頁上文本的高度。

  TabWidth屬性用來設(shè)置頁的寬度。缺省值0表示頁的寬度將自動(dòng)適應(yīng)頁上文本的寬度。

  TabPosition這個(gè)屬性的值為tpTop時(shí),頁將放在TabControl組件的上面,而為tpBottom時(shí)將顯示在下面。

  此外,還有運(yùn)行時(shí)態(tài)屬性:

  Pages這個(gè)只讀屬性是PageControl組件上所有的頁組成的數(shù)組。

  PageCount這個(gè)屬性返回PageControl組件上的頁數(shù)。

  75)問: PageControl的每一頁都是一個(gè)TTabSheet組件,那TTabSheet有些什么屬性呢?

  答:TabVisible 這個(gè)屬性用來屏蔽某一頁的顯示。也說是說,它的值為False的時(shí)候PageControl組件將不顯示這個(gè)頁了,但是這個(gè)頁還存在,你還可以把這個(gè)屬性設(shè)置為True來恢復(fù)它的顯示。在程序運(yùn)行期間不能刪除頁,只能屏蔽頁的顯示。

  PageIndex是頁的索引號(hào),

  此外,還有運(yùn)行時(shí)態(tài)屬性。

  PageControl屬性返回該頁所在的PageControl組件。

  TabIndex屬性返回該頁在所有可見頁中的索引號(hào)。

  因?yàn)樵诔绦蜻\(yùn)行時(shí)是不能刪除頁的,所以PageIndex索引號(hào)是固定不變的。但是頁可以被屏蔽,當(dāng)沒有頁被屏蔽時(shí),TabIndex與PageIndex完全相同;當(dāng)有頁被屏蔽時(shí),TabIndex就與PageIndex就不同了。TabIndex是這一頁在所有可見頁中的索引號(hào),也就是說,第一個(gè)可見頁的TabIndex是0,第二個(gè)可見頁的TabIndex是1,以此類推。

  76)問:能設(shè)計(jì)一個(gè)例子讓我更好的理解一下它們嗎?

  答:好的 ,首先在TabControl組件的頁面上放置一個(gè)編輯框組件。

  然后在PageControl組件的Tab1頁中放置一個(gè)編輯框組件。

  接著將PageControl組件切換到Tab2頁,放置一個(gè)文本編輯框組件。

  最后,編譯并運(yùn)行這個(gè)程序。

  點(diǎn)擊tabControl組件的tab1到tab3標(biāo)簽,可以看出,編輯框出現(xiàn)在組件的每一頁中。

  點(diǎn)擊PageControl組件的tab1到tab3標(biāo)簽,可以看出,每一頁組件都不相同。

10.菜單組件
  77)問:菜單是Windows常用的用戶界面。對(duì)于一個(gè)能夠?qū)嶋H應(yīng)用的程序,菜單是必不可少的組成部分。C++Builder中是怎樣實(shí)現(xiàn)菜單的?

答:C++Builder為我們提供了兩種菜單組件:一種是主菜單組件MainMenu;另一種是彈出菜單PopMenu組件。

  主菜單組件的作用是在窗體上生成菜單條。菜單組件剛放到窗體上時(shí),菜單是不可見的,當(dāng)雙擊它打開菜單編輯器并且增加了菜單項(xiàng)后,菜單條才出現(xiàn)在窗體的頂部。設(shè)計(jì)時(shí)的菜單條與運(yùn)行時(shí)的菜單條完全一樣。

  下面我們介紹利用菜單編輯器進(jìn)行菜單設(shè)計(jì)的過程。

  首先要打開菜單編輯器

  從組件模板上的Standard選項(xiàng)卡中選擇MainMenu組件,放置到窗體上。然后,用鼠標(biāo)右鍵單擊菜單組件,然后在彈出菜單中選擇Menu Designer。當(dāng)然,你也可以雙擊菜單組件打開菜單編輯器。

  被加亮顯示的小方框就是一個(gè)空白菜單項(xiàng)。

  接著要添加菜單項(xiàng)

  選中這個(gè)菜單項(xiàng),這時(shí)對(duì)象編輯器中將出現(xiàn)這個(gè)菜單項(xiàng)的屬性。

  我們在菜單項(xiàng)的Caption屬性中輸入“文件(&File)”,其中“&F”可以生成一個(gè)快捷鍵,這樣用戶就可以通過鍵盤操作了,并且F下面出現(xiàn)了下劃線(注意:由于是系統(tǒng)原因,”&”一定要在英文狀態(tài)下輸入)。當(dāng)我們輸入完標(biāo)題并按下回車鍵時(shí),C++Buildr會(huì)自動(dòng)給這個(gè)菜單項(xiàng)賦一個(gè)名字,這里的名字是N1。如果你不滿意這個(gè)名字可以修改Name屬性。

  添加完菜單項(xiàng)后會(huì)自動(dòng)出現(xiàn)一個(gè)空白的子菜單項(xiàng)等待你輸入。

  現(xiàn)在菜單編輯器中的輸入焦點(diǎn)移到了這個(gè)空白子菜單項(xiàng)上,同時(shí)對(duì)象編輯器將對(duì)應(yīng)顯示這個(gè)子菜單項(xiàng)的屬性。你可以在Caption屬性中輸入子菜單項(xiàng)的標(biāo)題“打開(&Open)”,然后按下回車鍵。菜單編輯器會(huì)打開一個(gè)新的子菜單項(xiàng),并把輸入焦點(diǎn)移動(dòng)到這個(gè)子菜單項(xiàng)上。這樣,就可以給菜單項(xiàng)增加一系列的子菜單了。

  同樣方法添加退出菜單。

  要開始編輯下一個(gè)菜單項(xiàng),可以用鼠標(biāo)單擊菜單項(xiàng)“文件”的右邊的虛線框,它表示一個(gè)空白的菜單項(xiàng)。


78)問:當(dāng)菜單項(xiàng)中的子菜單項(xiàng)屬于不同類別時(shí),有必要用分隔條把子菜單項(xiàng)進(jìn)行分組,菜單組件是怎樣實(shí)現(xiàn)這個(gè)功能的?

  答:我們在退出和保存兩個(gè)菜單項(xiàng)中間加入選擇分隔條,在退出菜單項(xiàng)上點(diǎn)擊鼠標(biāo)右鍵,從彈出菜單中選擇Insert,這時(shí),一個(gè)空白的菜單項(xiàng)就插入了,將它的Caption屬性設(shè)置為“–”這個(gè)減號(hào)符就可以了。

  79)問:那么,我們又怎樣給菜單項(xiàng)設(shè)置熱鍵呢?

  答:每個(gè)菜單項(xiàng)都有一個(gè)屬性ShortCut,利用這個(gè)屬性就可以給這個(gè)菜單項(xiàng)設(shè)置熱鍵了?,F(xiàn)在我們給打開文件菜單項(xiàng)添加熱鍵。單擊這個(gè)菜單項(xiàng),選擇屬性ShortCut,出現(xiàn)一個(gè)下拉菜單,其中包括一系列的熱鍵的組合。選擇Ctrl+O,這個(gè)熱鍵中就被賦給了退出菜單項(xiàng)。

  80)問:快捷鍵與熱鍵這兩個(gè)概念我已經(jīng)弄糊涂了,您能給我解釋一下嗎?

  答:好的,快捷鍵與熱鍵相同的方面是,它們都是通過鍵盤來訪問。

  一個(gè)菜單項(xiàng)可以同時(shí)擁有快捷鍵和熱鍵。所謂快捷鍵通常只是一個(gè)字母,而熱鍵通常是一個(gè)組合鍵。另外它們的激活方式不一樣,例如一個(gè)子菜單項(xiàng)有一個(gè)快捷鍵O和一個(gè)熱鍵Ctrl+O,那么使用熱鍵就可以直接激活這個(gè)子菜單項(xiàng),而使用快捷鍵你必須首先選中該子菜單項(xiàng)上一層的菜單項(xiàng),然后按下快捷鍵才可以激活這個(gè)子菜單項(xiàng)。

  81)問:您講解的菜單到現(xiàn)在還只有菜單項(xiàng)和子菜單兩級(jí),如果我希望子菜單還有自己的子菜單,應(yīng)該怎么辦?

  答:這種嵌套的菜單項(xiàng)實(shí)際上就是級(jí)聯(lián)菜單。這里,我們給顏色菜單項(xiàng)添加子菜單項(xiàng),選擇顏色菜單,單擊鼠標(biāo)右鍵,在彈出的快捷菜單中選擇Create Submenu命令,這時(shí)在子菜ハ鈧薪魷忠桓鮒趕蠐業(yè)募罰被共艘桓黽讀說ァ?/P>

  當(dāng)然,你也可以用Ctrl+方向鍵右鍵。

  82)問:很多菜單項(xiàng)的旁邊有復(fù)選標(biāo)記,請(qǐng)問菜單編輯器是否提供了這個(gè)功能呢?

  答:復(fù)選標(biāo)記就是在菜單項(xiàng)的標(biāo)題的前面出現(xiàn)的勾號(hào)。復(fù)選標(biāo)記經(jīng)常用于一些狀態(tài)設(shè)置的菜單項(xiàng),當(dāng)處于該狀態(tài)時(shí)就會(huì)出現(xiàn)復(fù)選標(biāo)記,否則復(fù)選標(biāo)記消失。

  現(xiàn)在,我們給回繞菜單項(xiàng)設(shè)置復(fù)選標(biāo)記,在對(duì)象編輯器中把它的屬性Checked改為True,這樣這個(gè)菜單項(xiàng)就會(huì)顯示復(fù)選標(biāo)記。要取消復(fù)選標(biāo)記可以把Checked屬性再次設(shè)置為False。


83)問:我有時(shí)要設(shè)計(jì)一組互相排斥的菜單項(xiàng),也就是單選菜單項(xiàng),應(yīng)該怎么辦呢?

  答:要使一組菜單項(xiàng)成為單選菜單項(xiàng),必須滿足幾個(gè)條件。

  首先,這一組菜單必須在同一個(gè)下拉菜單中。

  其次,它們的RadioItem屬性必須都設(shè)置成了True。

  最后,它們的GroupIndex屬性必須相同。

  這一組中唯一被選中的菜單項(xiàng)的前面將會(huì)顯示一個(gè)圓點(diǎn)標(biāo)記。

  84)問:我怎樣使菜單項(xiàng)失效呢?

  答:只要把菜單項(xiàng)的Enabled屬性設(shè)置為False,就可以使菜單項(xiàng)失效,這時(shí)菜單項(xiàng)是灰色的。在設(shè)計(jì)時(shí)和運(yùn)行時(shí)你可以任意設(shè)置菜單項(xiàng)的Enabled屬性。

  85)問:菜單項(xiàng)有些什么常用的事件呢?

  答:菜單項(xiàng)只有一種事件OnClick,在實(shí)際編輯中這個(gè)事件是一定要響應(yīng)的。

  86)問:我們一般在主菜單之外還會(huì)提供一個(gè)快捷菜單,就像C++Builder一樣,在窗體中單擊右鍵隨時(shí)都可以打開一個(gè)彈出菜單。C++Builder是怎樣實(shí)現(xiàn)彈出菜單的?

  答:彈出菜單有時(shí)候又稱為快捷菜單。彈出菜單與主菜單的區(qū)別是:主菜單是固定的,而彈出菜單是活動(dòng)的;主菜單有多組菜單項(xiàng),而彈出菜單只有一組。彈出菜單的設(shè)計(jì)方法與主菜單基本相同,也是使用菜單編輯器來完成的。 

posted on 2007-06-29 11:17 東東會(huì)會(huì) 閱讀(3222) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++Builder 基礎(chǔ)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久免费一区| 亚洲精品国产精品国自产观看| 中国日韩欧美久久久久久久久| 欧美激情视频在线播放| 欧美高清视频一区二区| 欧美高清视频www夜色资源网| 免费在线日韩av| 欧美激情网站在线观看| 亚洲激情啪啪| 欧美精彩视频一区二区三区| 欧美精品在线一区| 国产精品久久久久国产a级| 国产精品一区二区三区久久| 韩国一区二区在线观看| 亚洲美女淫视频| 欧美亚洲专区| 牛牛影视久久网| 亚洲精品综合精品自拍| 亚洲男人av电影| 久久五月激情| 欧美亚韩一区| 黄色成人在线网站| 国产精品99久久不卡二区| 久久国产手机看片| 91久久久在线| 亚洲综合色婷婷| 免费观看成人网| 国产亚洲欧洲997久久综合| 91久久精品国产91久久性色| 亚洲一区二区精品| 欧美成人亚洲成人日韩成人| 亚洲素人在线| 欧美激情视频网站| 国产自产高清不卡| 亚洲一区三区电影在线观看| 欧美高清在线一区| 午夜精品久久久久久99热软件| 噜噜爱69成人精品| 国产日韩综合| 午夜精品在线| 99国产一区二区三精品乱码| 久久久噜噜噜久久久| 国产精品日韩在线一区| 亚洲婷婷免费| 亚洲三级免费电影| 久久一区二区精品| 黑人巨大精品欧美黑白配亚洲| 亚洲一区二区三区激情| 亚洲国产另类久久精品| 美女999久久久精品视频| 海角社区69精品视频| 欧美在线视频播放| 亚洲一区二区三区乱码aⅴ| 欧美精品一区二区三区在线播放 | 亚洲国产va精品久久久不卡综合| 亚洲欧美成人在线| 99re6热只有精品免费观看| 欧美大片免费看| 亚洲日本一区二区| 亚洲第一主播视频| 亚洲高清在线观看| 亚洲精品国产精品乱码不99按摩| 欧美在线|欧美| 亚洲一区二区三区激情| 国产精品国产三级国产普通话99| 亚洲国产欧美一区| 欧美激情精品久久久久| 欧美日韩免费观看一区三区 | 亚洲影院高清在线| 91久久精品国产91久久性色tv| 久热精品在线视频| 日韩手机在线导航| 一区二区激情| 国产精品日本一区二区 | 亚洲国产精品黑人久久久| 久久免费高清视频| 亚洲电影免费观看高清完整版在线| 麻豆精品一区二区av白丝在线| 美女日韩欧美| 中国av一区| 亚洲一本大道在线| 国产一区美女| 亚洲大胆女人| 欧美视频三区在线播放| 久久精品亚洲精品| 美女露胸一区二区三区| 亚洲午夜一区二区| 欧美一二区视频| 亚洲激情电影在线| 亚洲欧洲在线观看| 国产欧美日韩另类视频免费观看| 久久久久se| 欧美日韩国产免费| 欧美一级在线视频| 久久综合狠狠综合久久综合88| 夜夜躁日日躁狠狠久久88av| 亚洲欧美日本在线| 亚洲激情专区| 性欧美8khd高清极品| 亚洲美女视频网| 久久经典综合| 亚洲午夜精品一区二区| 久久久久久97三级| 性刺激综合网| 欧美日韩国产免费| 欧美freesex交免费视频| 国产精品都在这里| 亚洲国产日韩欧美综合久久 | 国产精品日日摸夜夜添夜夜av| 久久综合久久美利坚合众国| 欧美日韩精品免费观看视频完整 | 欧美成人免费一级人片100| 欧美精品久久99| 另类亚洲自拍| 国产在线精品一区二区中文| 亚洲韩日在线| 在线精品一区二区| 午夜久久资源| 亚洲影视在线播放| 欧美高清视频www夜色资源网| 久久精品欧美日韩| 国产精品mm| 99亚洲视频| 一卡二卡3卡四卡高清精品视频| 亚洲欧美在线一区| 亚洲欧美国产高清| 欧美日韩视频在线一区二区| 亚洲福利视频专区| 亚洲激情第一区| 蜜臀久久99精品久久久久久9| 久久综合综合久久综合| 国产综合色产| 久久精品日产第一区二区三区 | 国模精品一区二区三区| 日韩天天综合| 亚洲天堂偷拍| 国产精品日韩二区| 亚洲私拍自拍| 久久se精品一区精品二区| 国产欧美韩国高清| 欧美一进一出视频| 久久精品国产亚洲一区二区三区 | 久久精品123| 蘑菇福利视频一区播放| 亚洲国产精品久久91精品| 久久综合色播五月| 91久久线看在观草草青青| 亚洲美女性视频| 欧美三级欧美一级| 亚洲在线一区二区三区| 欧美一区二区成人| 国语精品中文字幕| 美女诱惑黄网站一区| 亚洲区在线播放| 亚洲男人的天堂在线| 国产欧美一区二区精品性色| 久久精品最新地址| 亚洲高清久久久| 夜夜嗨av一区二区三区网站四季av | 亚洲激情在线播放| 欧美激情一区二区三区蜜桃视频 | 一本色道久久综合精品竹菊 | 亚洲一区二区三区四区五区黄| 亚洲免费中文| 欧美一二三视频| 亚洲视频你懂的| 欧美成人在线影院| 亚洲精品国产精品久久清纯直播 | 久久久免费精品视频| 欧美成人影音| 亚洲性视频h| 国内精品视频666| 欧美激情一区二区久久久| 一区二区免费在线视频| 久久精品一区四区| 日韩视频一区二区三区在线播放免费观看| 欧美肉体xxxx裸体137大胆| 欧美中在线观看| 99国产麻豆精品| 另类av一区二区| 亚洲欧美日韩精品在线| 在线播放一区| 国产精品美女久久| 免费成人黄色| 香蕉久久夜色精品| 日韩亚洲欧美高清| 欧美成人午夜激情| 午夜久久久久| 99riav国产精品| 亚洲高清在线视频| 国产午夜精品一区二区三区视频 | 禁久久精品乱码| 国产精品区一区二区三| 欧美顶级少妇做爰| 久久精品在线播放| 性久久久久久| 亚洲欧美一区二区激情| 亚洲视频香蕉人妖| 亚洲日韩欧美视频一区| 欧美成人日本|