第十二章 Win32環境程式設計 這一章節可以說是本書精華之一,Win32程式設計算是比較複雜的部分,但是我們以最簡單的敘述帶領著大家進入Win32程式設計的殿堂,讓你寫出來的程式具有一定的水準以上。若能將本章與下一章的技巧靈活運用,更能讓大家寫出高階的視窗程式。

Slides:



Advertisements
Similar presentations
—— 海淀区高三化学《考试说明》解读 2015 年 1 月 29 日 学习《考试说明》 备考理综化学.
Advertisements

第七章 常用控件 7.1 控件概述 7.2 常用内部控件 本章要求 返回目录 第七章 常用控件 (Common Control)
一、页面设置:版心和页边距 1 、版心: 宽度 —— 版面中文字部分的宽度。(纸张宽度 — 左右页边距) 高度 —— 版面中文字部分的高度。(纸张高度 — 上下页边距) 2 、页边距:纸张边缘与文字之间的距离。
第二章 VB的编程机制 【授课时间】第3周,第2次课 【授课题目】 2.1 面向对象程序设计概述 2.2 VB中的对象
C#程式設計 第二部分 第5-6章 C# 程式設計 - 南華大學資管系.
第九章 認識勞退新制及因應之道 大葉大學 助理教授 邱祈豪.
第三章 以Borland C++ Builder開發 視窗介面為基之I/O控制技術
新建本科院校 应用型人才培养若干问题探析 张德江.
第 9 章 表单控件的使用 本章提要:VFP表单控件工具栏上的21个基类控件及表单集,它们的常用属性、方法、事件及主要功能等。为叙述的方便,将VFP的基类控件及表单集按主要功能分为五类: 1.输出类:标签、图像、线条、形状。 2.输入类:文本框、编辑框、微调控件、列表框、组合框。 3.控制类:命令按钮、命令按钮组、复选框、选项按钮组、计时器。
第7章 樹與二元樹 (Trees and Binary Trees)
计算机应用基础 Excel部分.
第三章 使用者基本介面設計 課程名稱:程式設計 授課老師:李春雄 博士
第5章 窗体和控件 5.1 窗体概述 5.2 使用向导创建窗体 5.3 向窗体添加控件 5.4 窗体的再设计 5.5 利用窗体操作数据
第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
网 络 课 程 马 鞍 学 网 络 山 课 程 大 络 网 Visual Basic程序设计 第 一 讲 最容易接受的编程语言
Visual Basic.NET 程序设计语言课程内容
《计算机网络技术》 asp.net 程序设计 文本类控件 笪静.
第二十三章 InterNet網路程式設計 有沒有想過自己寫個Service呢?想不想自己也寫一套發信程式呢?在這一章節裡,我們將介紹socket的觀念以及BCB在Internet上開發應用程式的方法。
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
程式簡介、VB、物件導向 國立北門高中 林明璋.
第十章 進階輸出入元件(一) StringGrid 10-1 核對框(CheckBox)
第二十八章 開發新的VCL元件 雖然BCB內提供了很多VCL元件,但是一定還有一些我們常常需要用的介面並沒有製作成VCL元件,或是一些個人化的介面,我們也有需要做成VCL元件。在第十三章,我們將介紹如何自行開發新的VCL元件。
進階輸出入元件(一) 本書第三章已介紹Form 、Label 、Edit 及Button 等最基本的輸出入元件, 本章將繼續介紹一些可以提昇輸出入視覺效果的元件, 例如CheckBox 、RadioButton 及RadioGroup 等17 個進階元件, 學習本章將可提昇使用介面的親和性。 核對框(CheckBox)
課程名稱:程式設計 授課老師:________
第九章 常用控制項(ㄧ) 資訊教育研究室 編著 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
Chapter 5 進階伺服器控制項.
第二十九章 DLL / LIB函式庫開發 當我們開發程式到一個階段之後,我們一定會希望各個Component的程式碼可以分開的越清楚越好。而這一章最主要就是要告訴各位讀者,我們常在Windows系統中看到的dll或是lib的檔案該怎麼實作?做出這樣的library我們又該如何運用?為什麼使用dll或是lib有利於我們開發程式?以上這些疑問都將會在這一章中得到解答。
第13章 WinForms基础知识.
第10章VBA会计应用与实践 第11章会计凭证管理模块设计与实现
基础综合 C++ Builder 显示与输入接口
页眉 基础综合 C++ Builder 按钮组件
第9章 Windows窗体应用程序设计 9.1 窗体设计 9.2 常用的控件设计 9.3 多个窗体之间的数据传递 9.4 多文档窗体
第二十三章 元件的製作 23-1 類別轉為元件 23-2 繼承可視元件 23-3 複合式元件.
Visual C++ Windows Programming
第18章 B4J的跨平台應用程式開發 18-1 B4J的GUI設計工具與介面控制項 18-2 使用B4J的介面控制項
Visual Basic程序设计 第八章 过程 -子程序和函数
数据库原理及应用 《数据库原理及应用》课程组 荆楚理工学院.
第十一讲 VB常用标准控件(2).
第十一章 Heap 結構.
Visual Basic程序设计基础 计算机科学学院.
JavaScript 靜宜大學 資管系 楊子青.
第五章 Windows窗体界面设计 5.1 鼠标事件与键盘事件 5.2 Windows窗体基本控件 5.3 菜单与工具栏
第十二章 事件 12-1 KeyPress 12-2 KeyDown及KeyUp
form1 卡拉OK pictureBox1 fish1.bmp pictureBox2 fish2.bmp label1 卡拉OK字幕機
程式設計 Visual Basic簡介 週次:1 建國技術學院 資管系 饒瑞佶 2003年9月17日.
視窗程式設計 (Windows Programming)
数据分析绘图工具 ——Origin6.0.
第十三章 Win32 API及Registry 我們將利用Win32 API結合上一節所介紹的元件寫一個類似檔案總管的介面,也將介紹Registry的特性,進而利用Registry讓我們的程式更加有彈性。
高等学校计算机基础教育教材 Visual Basic 6.0 程序设计 上海中医药大学现代教育技术中心 计算机教学部 1.
第二章 创建用户界面 本章重点和难点 2.1 基本属性 2.2 创建窗体 2.3 Visual Basic的常用控件 2.4 制作菜单.
第六章 擷取輸入裝置的訊息和事件 鍵盤、滑鼠,是我們最常使用的輸入工具。我們是不是常常希望可以再按下某個按鈕後就可以有哪些功能出現呢?沒錯,這就是這一章節的重點,在第四章,我們提到了有關鍵盤、滑鼠、以及RS-232介面的事件及訊息偵測,讓我們更能掌控電腦週邊的硬體。
MS Windows XP 作業系統使用操作簡介.
樹 2 Michael Tsai 2013/3/26.
程式設計 Visual Basic簡介 週次:2 建國技術學院 資管系 饒瑞佶 2003年9月17日.
第九章 各種對話方塊的建立 視窗介面可以說是最友善的人和電腦間的溝通介面,然而對話方塊就好像是電腦和使用者之間的對話通道。開檔案有開檔案的方式、存檔有存檔的介面、印表機設定、字型選擇、尋找字串、置換字串等等,在Win32的環境中,這類的對話方塊實在是太多了。在這一章我們將帶領大家進入設計對話方塊的世界。
第4章 Excel 2007电子表格.
第11章 实用扩展控件 11.1 RichTextBox控件 11.2 TreeView和ListView控件 11.3 其他扩展控件 结束.
菜单、状态栏和工具栏 菜单 状态栏 工具栏 编写代码 创建用户界面 Debug and Deploy 使用 Visual
網路遊戲版 幸福農場168號.
第7章 表单控件设计.
第 12 章 視窗介面進階.
用int类型(4字节)去存具体时间(8字节).
第7章 樹與二元樹(Trees and Binary Trees)
資料結構使用Java 第9章 樹(Tree).
程式的時間與空間 Time and Space in Programming
Visual Basic 程序设计及应用教程 (6.0版)
進階資料結構(2) Disjoint Sets
Computer Science & Information Management
1、复选框和单选按钮 2、框架 3、列表框和组合框 4、滚动条 5、鼠标器事件 6、键盘
MenuStrip by Szeto CY Visual C# 2008.
Presentation transcript:

第十二章 Win32環境程式設計 這一章節可以說是本書精華之一,Win32程式設計算是比較複雜的部分,但是我們以最簡單的敘述帶領著大家進入Win32程式設計的殿堂,讓你寫出來的程式具有一定的水準以上。若能將本章與下一章的技巧靈活運用,更能讓大家寫出高階的視窗程式。

大綱 12-1. 檔案總管的介面 12-2. 標頭控制元件 12-3. 進度狀態顯示元件 12-4. 軌跡追蹤列 12-5. 上下控制元件 12-6. 日期時間 12-7. 熱鍵元件的使用(HotKey) 12-8. 常駐在System Tray的程式 本章習題

12-1. 檔案總管的介面 提到Win32的程式設計,最重要的範例就是檔案總管。 整個檔案總管都是使用Win32的介面來完成。而我們在這一章以及下一章,也都會圍繞著檔案總管來介紹大部分內容。下圖中就是檔案總管的介面,在這個介面裡,主要元件有ListView、TreeView、Splitter、以及StatusBar這四種VCL元件, Splitter ListView TreeView StatusBar

12-1. 檔案總管的介面 表單檢視元件(ListView) 範例12-1 在範例12-1,我們的介面相當簡單,除了一個輸入資料的介面外,就是一個ListView。除了提到這些可看見的VCL元件外,我們還有放入一個Popup menu以及一個ImageList在這個範例中。Popup menu主要是提供滑鼠右鍵的功能選單,,而ImageList則是要提供一些Image給ListView使用。

12-1. 檔案總管的介面 表單檢視元件(ListView) 新增Column個數

12-1. 檔案總管的介面 表單檢視元件(ListView) ViewStyle的不同 大圖示(vsIcon) 小圖示(vsSmallIcon) 清單(List) 詳細列表(Report)

12-1. 檔案總管的介面 表單檢視元件(ListView) 範例12-1執行結果

12-1. 檔案總管的介面 樹狀檢視元件(TreeView) TreeView是目前檔案總管中的重要元件之一,在檔案總管中TreeView負責顯示從桌面開始的所有樹狀結構。在這一小節裡,我們將會利用三個範例讓各位練習TreeView的各項使用實例。 談到Tree的使用,就必須談到什麼是『根節點』、『父節點』、『子節點』、以及『葉節點』。 根節點就是我們所謂的『root』,他是在整個Tree的最上方,以檔案總管來說,根節點就是『桌面』 父節點就是這個節點的底下還有一個以上的節點 子節點就是這個節點的上一層還有節點 葉節點就代表這個節點已經是這支樹的最後一個節點

12-1. 檔案總管的介面 樹狀檢視元件(TreeView) 範例12-2:利用簡單的程式來控制TreeView的各項動作。 我們主要是使用靜態的方式將一棵樹建立起來。這棵樹是利用BCB提供的介面去產生。

12-1. 檔案總管的介面 樹狀檢視元件(TreeView) 範例12-2執行結果

12-1. 檔案總管的介面 樹狀檢視元件(TreeView) 範例12-3:在程式中建構一個靜態的TreeView 在範例12-3,我們也是靜態產生Tree,但是這次我們不是從BCB的介面中產生,我們是從程式碼中產生。在範例12-3的介面中,全部都跟範例12-2一模一樣。 程式中,我們宣告了三個TreeNode(兩個也可以),經由這三個TreeNode之間的相互關係,我們完成了整顆樹的建立。在建樹的程式碼方面並不難,比較特別的就是要回到上一層我們使用的是『parent = parentParent』這樣的方法來取得上一層Node的記憶體位址。至於一開始我們有保留Root的位址這只是一個習慣,因為從BCB中也是可以判斷哪個Node是Root,在範例12-3中這樣做只是為了方便以及寫程式者的習慣。

12-1. 檔案總管的介面 樹狀檢視元件(TreeView) 範例12-3:程式碼 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"); parent = son; son = TreeView1->Items->AddChild(parent, "Son_2_1"); son = TreeView1->Items->AddChild(parent, "Son_2_1_1"); son->StateIndex = 1; parent = parent->Parent->Parent; son = TreeView1->Items->AddChild(parent, "Parent3"); } 樹狀檢視元件(TreeView) 範例12-3:程式碼 void __fastcall TForm1::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->StateIndex = 0;

12-1. 檔案總管的介面 樹狀檢視元件(TreeView) 範例12-4:在程式中建構一個TreeView,主要程式碼我們分成三個部分 第一部份是動態新增所需要的變數宣告,這部分是宣告在main.cpp的上方,歸類於全域變數 第二部份就是有關新增/刪除TreeNode部分的程式碼 最後一部分就是一些瑣碎的功能,這些程式碼包括了展開以及收合的功能,也有在StatusBar上面顯示目前的狀況,還有一個就是選擇要不要顯示Root。

12-1. 檔案總管的介面 樹狀檢視元件(TreeView) 範例12-4:程式碼 宣告 //宣告兩個變數..用來存放Root Address和Node的Address TTreeNode *root = NULL; TTreeNode *node = NULL;

12-1. 檔案總管的介面 樹狀檢視元件(TreeView) 範例12-4:程式碼 動態新增Node void __fastcall TForm1::N1Click(TObject *Sender) { //新增一個Node,在新增的時候會自動判斷是不是新增Root,在新增的時候利用InputQuery來當作輸入介面 AnsiString Buf; if (root == NULL) { //如果現在root還是NULL的話..表示要新增一個root if (InputQuery("輸入", "請輸入TreeNode的名稱", Buf)) { //使用InputQuery當作輸入介面 root = TreeView1->Items->AddChild(NULL, Buf); //將新增的Node加入到TreeView中 root->ImageIndex = 0; root->SelectedIndex = 1; root->StateIndex = -1; //設定該Node的一些基本屬性 StatusBar1->SimpleText = "新增 Root 節點"; //在StatusBar顯示目前的運作情況 TreeView1->AlphaSort(); //新增之後利用AlphaSort對整個Tree排序 } else { //新增一般的Node //必須得先選一個node才能繼續產生Child,不然如果沒有Parent那來的Child if (TreeView1->Selected != NULL) { //使用InputQuery當作輸入介面 if (InputQuery("輸入", "請輸入TreeNode的名稱", Buf)) { //將新增的Node加入到TreeView中 node = TreeView1->Items->AddChildFirst(TreeView1->Selected, Buf); node->ImageIndex = 2; node->SelectedIndex = 3; node->StateIndex = -1; //設定該Node的一些基本屬性 StatusBar1->SimpleText = "新增一個 Node "; //在StatusBar顯示目前的運作情況 TreeView1->AlphaSort(); //新增之後利用AlphaSort對整個Tree排序 12-1. 檔案總管的介面 樹狀檢視元件(TreeView) 範例12-4:程式碼 動態新增Node

12-1. 檔案總管的介面 樹狀檢視元件(TreeView) 範例12-4:程式碼 動態刪除Node void __fastcall TForm1::N2Click(TObject *Sender) { if (TreeView1->Selected != NULL) { //如果有Node被選取..也選擇要刪除才執行 if (TreeView1->Selected == root) { //判斷是不是Root TreeView1->Selected->Delete(); root = NULL; //如果是root被刪除..要將root的point設成null StatusBar1->SimpleText = "刪除 Root 節點"; } else { StatusBar1->SimpleText = "刪除一個 Node";

12-1. 檔案總管的介面 樹狀檢視元件(TreeView) Sort AlphaSort:根據我們每個Node的Caption中的值去做排序 CustomSort:讓我們自己寫函式去做排列 SortType stBoth:當Date或是Text有任何一種改變時就重新Sort stDate:當Node的資料改變時就重新Sort一次 stNone:永遠不排序 stText :當Node的Text改變時重新Sort

12-1. 檔案總管的介面 分隔元件(Splitter) 分隔元件最主要的功能就是讓兩個元件在你拉動的時候自動分配元件的大小。例如在檔案總管中,我們可以將游標停放在TreeView和ListView的中間,接著游標就會變成一個雙箭頭的游標,然後我們就可以按著滑鼠的左鍵左右移動滑鼠,這時候TreeView和ListView的視窗會隨著滑鼠的移動自動改變大小。 拉動之後可以 自動調整大小

12-1. 檔案總管的介面 狀態列元件(StatusBar) 範例12-6 StatusBar基本應用 void __fastcall TForm1::Button1Click(TObject *Sender) { StatusBar1->SimpleText = "你剛剛按下了Button1"; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { StatusBar1->SimpleText = "你剛剛按下了Button2"; void __fastcall TForm1::Button3Click(TObject *Sender) { StatusBar1->SimpleText = "你剛剛按下了Button3"; void __fastcall TForm1::Edit1Change(TObject *Sender) { StatusBar1->SimpleText = "你剛剛修改了Edit1"; void __fastcall TForm1::Edit2Change(TObject *Sender) { StatusBar1->SimpleText = "你剛剛修改了Edit2";

12-1. 檔案總管的介面 狀態列元件(StatusBar) 範例12-7:StatusBar進階應用 使用一個按鈕、一個Edit、一個Image、以及一個StatusBar。在Status Bar上總共有四個欄位,跟上一個範例不一樣。 在Status Bar上面按下滑鼠右鍵,選擇『Panels Editor』會出現StatusBar的Panel編輯畫面。

12-1. 檔案總管的介面 狀態列元件(StatusBar) 範例12-7:程式碼 (Part I) void __fastcall TForm1::Button1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { StatusBar1->Panels->Items[0]->Text = "你按下了Button 1"; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { StatusBar1->Panels->Items[0]->Text = "你沒按下Button 1"; void __fastcall TForm1::Edit1Change(TObject *Sender) { StatusBar1->Panels->Items[1]->Text = "Edit1 的文字是 : " + Edit1->Text; void __fastcall TForm1::FormDragDrop(TObject *Sender, TObject *Source, int X, int Y) { //設定Form上的DragDrop的Function,主要是用來讓Image在Form上可以做Drag的動作 TImage *buf = (TImage *)Source; buf->Left = X; buf->Top = Y;

12-1. 檔案總管的介面 狀態列元件(StatusBar) 範例12-7:程式碼 (Part II) void __fastcall TForm1::FormDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept) { Accept = true; //讓Form可以被允許DragOver } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1StartDrag(TObject *Sender, TDragObject *&DragObject) { StatusBar1->Panels->Items[2]->Text = "正在拉圖片"; //當啟動Drag的時候顯示 "正在拉圖片" void __fastcall TForm1::Image1EndDrag(TObject *Sender, TObject *Target, int X, int Y) { StatusBar1->Panels->Items[2]->Text = "沒在拉圖片"; //結束Drag的時候顯示 "沒在拉圖片" void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { //利用Form上面的MouseMove事件抓取滑鼠游標,並且在StatusBar上將游標顯示出來 AnsiString Buf; Buf = "( " + IntToStr(X) + " , " + IntToStr(Y) + " )"; StatusBar1->Panels->Items[3]->Text = "滑鼠游標 (X , Y) : " + Buf;

12-1. 檔案總管的介面 狀態列元件(StatusBar) 範例12-7 執行結果

12-2. 標頭控制元件 標頭控制元件所提供的功能,一般來說我們都會直接利用ListView來完成,而不是單純的去拉一個標頭控制元件下來用。因為HeaderControl一般都是用來區分是不是同類型的資料,例如在ListView中我們顯示檔案的話,檔名就會集體放在檔名那一個Column,檔案大小也都會放在同一個Column……等,所以才會說大部分的使用都是利用ListView來完成。 但是如果想要在Header部分加上一些圖片等花俏的功能,還是得使用HeaderControl

12-3. 進度狀態顯示元件 我們在安裝應用程式(或是使用一些應用程式)的過程中,常常會有一條光棒跑出來告訴我們目前工作正進行了多少百分比,這個元件我們稱做進度狀態列元件。 進度狀態列元件可以給使用程式的使用者非常高層次的訊息(可以馬上了解現在的情況),也可以讓使用者預估時間,也可以增加整個程式User Friendly的程度。 在Borland C++ Builder 6中,有『ProgressBar』、『Cgauge』這兩個元件可以用來表示目前的完成度為何,其中ProgressBar位在Win32的頁面中,而Cgauge在Sample這一頁裡。

12-3. 進度狀態顯示元件 範例12-9:ProgressBar & CGauge操作實例 ProgressBar重要屬性說明 Max Progress Bar跑到100%時的那個值。 Min Progress Bar在0%時的那個值。 Orientation 有Horizontal和Vertical兩種不同的屬性值,主要是用來決定Progress Bar是要往右增加或是往上增加。 Position 決定目前Progress Bar的光棒的所在位置。 Smooth 決定移動的光棒要用平滑的模式或是一格一格的模式呈現出來。

12-3. 進度狀態顯示元件 範例12-9:ProgressBar & CGauge操作實例 CGauge重要屬性說明 屬性 說明 BackColor CGauge在顯示Progress Bar的地方的顏色 Color 除了Progress Bar的地方的顏色。如果Progress Bar 不是標準的長條狀,就有可能會需要用到Color這個屬性。 ForeColor Progress Bar本身的顏色。 Kind CGauge的表示種類,有『HorizontalBar』、『Needle』、『Pie』、『Text』、以及『VerticalBar』這五種不同的表示方法。 MaxValue Progress Bar跑到100%時的那個值。 MinValue Progress Bar在0%時的那個值。 Progress 決定目前Progress Bar的光棒的所在位置。跟ProgressBar這個元件的Position屬性功能一樣。 ShowText 決定是否要在Progress Bar上面顯示出目前完成的百分比數字。

12-3. 進度狀態顯示元件 範例12-9:ProgressBar & CGauge操作實例 執行結果

12-3. 進度狀態顯示元件 不管在執行ProgressBar或是CGauge的時候,整個程式幾乎都陷入了停頓狀態,也就是停止回應﹔反過來說,當我們需要使用到ProgressBar或是CGauge的功能時,通常也是因為正在跑一個非常大的迴圈。現在有一個問題產生了,不管是在跑一個非常大的迴圈(CPU使用率100%)或是跑Progress的元件,都會讓程式停止回應,這時候該怎麼辦?我們在這邊將提出一個簡單的解決方案 『ApplicationProcessMessages()』這個函式,這個函式可以讓我們的介面程式在執行中取得一些CPU Time,也因為這樣,我們的介面就不會再發生『沒有回應』的情況了。

12-3. 進度狀態顯示元件 大家在寫過幾個程式之後,一定也會發現ProcessMessages()這個函式會有無效的時候,其實不是無效,而是剛剛好ProcessMessages()運作原理剛好跟你程式的做法無法match,這時候又該怎麼辦呢? 在這邊非常建議各位採用Thread的做法,雖然有些情況下不加入ProcessMessages()也可以正常運作,雖然有時候加入了ProcessMessages()就可以正常運作,但是最終的解決方法仍然是使用Thread的做法,因為Thread才是真正將所有的工作分成『執行緒』後才交給CPU去執行,所以不管現在程式在跑什麼東西,只要有開Thread,不管同時間有多少程式在跑一定都可以使用到CPU Time。 關於Thread的介紹與使用,我們將在後面章節提到。

12-3. 進度狀態顯示元件 其實除了上面介紹的這兩個元件以外,還有其他很多元件都可以用來表示類似這方面的功能,例如曲線圖、圓餅圖、Shape,或是任何一個可以顯示圖形或是文字的都可以,只是需要程式設計師自己設計表現的模式。

12-4. 軌跡追蹤列 軌跡追蹤列通常都是為了讓使用者可以有比較方便的方法設定數值。 例如在寫一個骰子的程式時(一次丟多個骰子),我們一定要輸入各點數會出現的機率,這時候我們就可以利用TrackBar這個元件,採用『拉』的方式來設定好各點數出現的機率。概觀的說,凡是需要設定『數值』時,都可以利用TrackBar來完成,這樣可以增加不少User Friendly的效果喔!

12-4. 軌跡追蹤列 範例12-10:TrackBar操作實例 TrackBar重要屬性說明 屬性 說明 Frequency LineSize 當你使用方向鍵控制TrackBar上面的指標時,按一下會移動多少格 Max TrackBar的最大值 Min TrackBar的最小值 Orientation 有Horizontal和Vertical兩種不同的屬性值,主要是用來決定TrackBar是要往右移動或是往上移動 PageSize 跟LineSize很像,不過LineSize是控制方向鍵對於TrackBar的移動數量,而PageSize是控制PageDown、PageUp對於TrackBar的移動數量 Position 目前TrackBar指標的位置 SelEnd 會顯示出一個Range的光棒在TrackBar上,這個光棒的結束位置就是在SelEnd這個位置。 SelStart 會顯示出一個Range的光棒在TrackBar上,這個光棒的結束位置就是在SelStart這個位置。一般來說SelStart的位置都設定在『0』,而SelEnd的位置跟Position的值是同步的。因為這樣就會將TrackBar已經被指標拉過的位置用其他顏色來表示 SliderVisible 決定指標要不要出現在TrackBar上 ThumbLength TrackBar的長度 TickMarks  決定標記點要在哪個方向 TickStyle 決定標記點產生的方式,Auto、Manual、或是None 範例12-10:TrackBar操作實例 TrackBar重要屬性說明

12-4. 軌跡追蹤列 範例12-10 程式碼 void __fastcall TForm1::TrackBar1Change(TObject *Sender) { Label1->Caption = "目前位置:" + IntToStr(TrackBar1->Position); Label2->Caption = "百分比率:" + \ FloatToStr((float)100 * (float)TrackBar1->Position / (float)TrackBar1->Max) + " %"; }

12-5. 上下控制元件 上下控制元件跟TrackBar非常的類似,都是用來設定(表現)數值,只是TrackBar一定是一個調整棒在那邊讓使用者拉,但是上下控制元件就不一樣了,你可以結合各種不同的VCL元件,例如可以跟Label或是Edit結合等等。在範例12-11中,我們將列出一些比較常跟上下控制元件結合的使用範例,也會提到『CspinEdit』這個類似上下控制元件。

12-5. 上下控制元件 範例12-11:UpDown & CSpinEdit操作範例 UpDown常用的屬性說明 屬性 說明 AlignButton 設定UpDown按鈕的方向要在那個方向 ArrowKeys 決定我們是不是可以使用方向鍵來控制UpDown元件 Associate 想要跟UpDown元件結合的VCL元件 Increment 每次按一次按鈕所增加或是減少的值 Max UpDown中會出現的最大的值,也就是Position這個屬性的值不可以超過這個值 Min UpDown中會出現的最小的值,也就是Position這個屬性的值不可以小於這個值 Orientation 有Horizontal和Vertical兩種不同的屬性值,主要是用來決定UpDown的按鈕是要上下方向或是左右方向 Position 目前UpDown所在的位置(顯示出來的值) Thousands 如果數值超過1000的時候,需要需要每三個數字打一個逗點

12-5. 上下控制元件 範例12-11:UpDown & CSpinEdit操作範例 CspinEdit常用的屬性說明 屬性 說明 AutoSelect 當CspinEdit剛好在focus的時候,Text中的值會自動被選取 EditorEnabled 設定我們可不可以直接Editor CspinEdit的Text Increment 每次按一次按鈕所增加或是減少的值 MaxValue CSpinEdit中會出現的最大的值,也就是Value這個屬性的值不可以超過這個值 MinValue CSpinEdit中會出現的最大的值,也就是Value這個屬性的值不可以低於這個值 Value 目前CSpinEdit所在的位置(顯示出來的值)

12-5. 上下控制元件 範例12-11:UpDown & CSpinEdit操作範例 程式碼 執行結果 void __fastcall TForm1::UpDown3Click(TObject *Sender, TUDBtnType Button) { if (Button == btPrev) ProgressBar1->Position--; else ProgressBar1->Position++; }

12-6. 日期時間 在BCB內有不少跟『日期/時間』相關的元件可以用,例如Win32頁次中的『DateTimePicker』及『MonthCalendar』,System頁次中的『Timer』,以及Sample頁次中的『Ccalendar』這幾個元件。 範例12-12我們將實做這幾個元件讓大家看看。

12-6. 日期時間 範例12-12 Timer Timer用白話一點的話來說就是『定時器』。也就是說我們可以利用Timer來做固定時間的定時器。除了可以利用Timer做時間的定時器外,在BCB中也有提供一些函式可以做時間的計算,例如時間間距的計算或是目前時間的回報等等。 在範例程式12-12中,我們將上面我們所說的三個功能寫出來當作範例,讓大家可以對Timer這個元件以及有關DateTime方面的函式更熟悉。

12-6. 日期時間 範例12-12 月曆 MonthCalendar & DateTimePicker & CCalendar 屬性 說明 CalColor 設定月曆中的各種顏色 Date 月曆中被選取的日期 FirstDayOfWeek 設定每個星期的第一天是星期幾 MultiSelect 可以選多個日期 ShowToday 在月曆上顯示出今天的日期 ShowTodayCircle 在今天的日期上會出現一個圈圈包住 WeekNumbers 出現這一週是今年的第幾週的數字

12-6. 日期時間 範例12-12 月曆 CCalendar重要屬性說明 屬性 說明 Day 目前選定的日子 GridLineWidth 表格格線的寬度 Month 目前選定的月份 StartOfWeek 設定每個星期的第一天是星期幾 UseCurrentDate 預設為目前的日期 Year 目前表格顯示出來的日期的年份

12-6. 日期時間 範例12-12 Timer執行畫面 & DateTime執行畫面

12-7. 熱鍵元件的使(HotKey) 熱鍵的使用在Windows系統中也是蠻重要的功能。雖然說目前大家都習慣使用滑鼠,但是如果想讓自己在使用軟體上能加快速度或是提昇效率,熱鍵的使用及建立就相當的重要了。例如在Word中,你要打個『頓號』可能得從〔插入〕〔符號〕這個選單中慢慢找,但是如果你將他設定成快速鍵,節省下來的時間可能高達30秒鐘。

12-7. 熱鍵元件的使(HotKey) 範例12-13:HotKey實作技巧 在BCB中有提供熱鍵的元件。在範例12-13中我們將會設計一個範例程式來展現熱鍵的實作技巧,以及使用熱鍵的好處。 在範例12-13中我們利用MainMenu這個元件當作我們要指定快速鍵的元件。設定好了之後按下快速鍵就會啟動相關的函式。

12-7. 熱鍵元件的使(HotKey) 範例12-13:HotKey實作技巧相關程式碼 void __fastcall TForm1::BitBtn1Click(TObject *Sender) { AnsiString StrBuf, HotKeyBuf; TMenuItem *ItemBuf; if (RadioGroup1->ItemIndex != -1) { StrBuf = RadioGroup1->Items->Strings[RadioGroup1->ItemIndex]; for (int i = 0 ; i < MainMenu1->Items->Count ; i++) if ((ItemBuf = MainMenu1->Items->Items[i]->Find(StrBuf)) != NULL) break; if (ItemBuf) ItemBuf->ShortCut = HotKey1->HotKey; } //--------------------------------------------------------------------------- void __fastcall TForm1::ShowHotKeySet(TObject *Sender) { ShowMessage("Set HotKey Success!\n");

12-7. 熱鍵元件的使(HotKey) 範例12-13:HotKey實作技巧 執行畫面

12-8. 常駐在System Tray的程式 有很多軟體常常會將自己的軟體最小化在右下角的系統列,例如防毒軟體或是一些常駐程式都會在系統列。 在BCB中也有這樣的元件提供給programmer使用,這個元件就是『TrayIcon』。 範例12-14:系統列程式實作技巧 TrayIcon的使用方法非常的簡單,在範例12-14中,我們除了放入一個TrayIcon外,我們也加入一個PopupMenu當做快速選單,也加入一個ImageList,並且放入多個Image在ImageList中,讓TrayIcon最小化的時候可以在系統列出現我們所設定的圖示。

12-8. 常駐在System Tray的程式 範例12-14:系統列程式實作技巧 主要程式碼 void __fastcall TForm1::N1Click(TObject *Sender) { //放置於系統列 if (TrayIcon1->Visible == false) N1->Enabled = false; N2->Enabled = true; TrayIcon1->Visible = true; TrayIcon1->Minimize(); } void __fastcall TForm1::N2Click(TObject *Sender) { //放置於桌面 if (TrayIcon1->Visible == true) N1->Enabled = true; N2->Enabled = false; TrayIcon1->Visible = false; TrayIcon1->Restore(); }

12-8. 常駐在System Tray的程式 範例12-14:系統列程式實作技巧 主要程式碼 void __fastcall TForm1::CheckBox1Click(TObject *Sender) { //設定要不要在系統列開啟動態的效果 if (CheckBox1->Checked) TrayIcon1->AnimateInterval = Edit1->Text.ToInt() * 1000; TrayIcon1->Animate = true; } else TrayIcon1->Animate = false; TrayIcon1->IconIndex = 0;

12-8. 常駐在System Tray的程式 範例12-14:系統列程式實作技巧 主要程式碼 void __fastcall TForm1::Edit1Change(TObject *Sender) { //設定動態效果的時間長短 if (CheckBox1->Checked) TrayIcon1->AnimateInterval = Edit1->Text.ToInt() * 1000; TrayIcon1->Animate = true; } else TrayIcon1->Animate = false; TrayIcon1->IconIndex = 0;

12-8. 常駐在System Tray的程式 範例12-14:系統列程式實作技巧 主要執行畫面

12-8. 常駐在System Tray的程式 其實要實做系統列的程式也不一定需要使用BCB提供的TrayIcon這個VCL元件,我們也可以直接利用Win32 API所提供的函式來完成這個功能,而且透過Win32 API的方式更能提供多樣化的功能。

本章習題 利用Win32 API實做出可以將程式最小化至系統列的應用程式。 除了MainMenu可以結合HotKey外,找出其他的元件搭配HotKey實做出應用程式。 試著拉出類似檔案總管的介面(不需要實做程式碼)。