第三章 界麵交互功能的使用
對話框和菜單是可視化編程的特色之一,從某種意義上講,也是衡量應用程序功能的一個方麵,合理的利用菜單和對話框等Windows界麵,可以大大的提高應用程序的人機交互功能,增加用戶與程序之間的交流機會。
在本章中,我們仍然以幾個比較常用的示例,將對對話框和菜單這兩種人機交互界麵進行比較詳細的講解。
3.1 對話框設計和使用
對話框是Windows操作係統中程序與用戶溝通的一種常見交互方式,對話框可以向用戶提供當前程序的運行狀況,也可以接受用戶輸入的信息,在CBuilder中,對話框的程序設計又有兩種方式——對話框函數和標準標準對話框,下麵將分別的予以介紹和說明。
3.1.1 對話框函數簡介
在CBuilder中的對話框函數大體上可以分為兩種——輸入對話框函數和輸出對話框函數,輸入對話框函數用於接收用戶在程序運行過程中輸入的信息,其中包括ShowMessage()函數、MessageDlg()函數,而輸出對話框函數則用於顯示一個對話框窗體,向用戶報告當前程序的運行狀態等信息,它包括InputBox()函數下麵就對各個函數分別的加以介紹。
1.ShowMessage()函數
對話框函數中的ShowMessage()函數用於在程序運行的過程中顯示一個包含一個字符串信息的對話框,用戶隻有對這個對話框進行正確的響應之後,才能夠關閉對話框,進行下一步的工作。
ShowMessage()函數的語法結構如下所示:
ShowMessage(const Msg: string);
下麵的示例程序就是用於在程序運行中產生一個對話框,在其中顯示一個字符串,具體的步驟如下所示:
2.開始工作
首先其中一個新的項目,在屏幕上就會彈出一個空白的窗體,向窗體上添加一個按鈕控件,控件的標題設置為“Hello”;
3.添加代碼
在程序的設計過程中用鼠標的左鍵雙擊窗體上的按鈕控件,在屏幕上就會彈出一個代碼窗口,在其中添加如下所示的按鈕響應代碼:
char *string;
//定義字符串變量
void __fastcall TForm1::Button1Click(TObject *Sender)
{
str="歡迎來到C++ Builder世界,在這裏將向您介紹showmessage函數的基本用法";
//為字符串變量賦值
ShowMessage(str);
//顯示對話框
}
4.運行程序
完成以上的工作後,選擇菜單“File”中的“Save All”選項,在彈出的窗口中選擇一個合適的文件名存儲文件,然後按鍵盤上的功能鍵F9運行程序。
在程序的運行過程中,用鼠標的左鍵單擊窗體中按鈕“Hello”,在窗體上就會彈出一個對話框,如圖3-1所示。
圖3-1 ShowMessage()函數輸出對話框
5.MessageDlg()函數
對話框函數中的MessageDlg()函數用於在程序運行的過程中顯示一個包含一個字符串、位圖和按鈕信息的對話框,用戶隻有對這個對話框進行正確的響應之後,才能夠關閉對話框,進行下一步的工作。
MessageDlg()函數的語法結構如下所示:
function MessageDlg(const Msg: string; AType: TMsgDlgType;AButtons: TMsgDlgButtons; HelpCtx: Longint): Word;
下麵的示例程序就是用於在程序運行中產生一個對話框,在其中顯示一個字符串,具體的步驟如下所示:
6.開始工作
首先其中一個新的項目,在屏幕上就會彈出一個空白的窗體,向窗體上添加一個按鈕控件,控件的標題設置為“Welcome”。
7.添加代碼
在程序的設計過程中用鼠標的左鍵雙擊窗體上的按鈕控件,在屏幕上就會彈出一個代碼窗口,在其中添加如下所示的按鈕響應代碼:
char *string;
//定義字符串變量
void __fastcall TForm1::Button1Click(TObject *Sender)
{
str="歡迎來到C++ Builder世界,在這裏將向您介紹showmessage函數的基本用法";
//為字符串變量賦值
MessageDlg(str, mtConfirmation, TMsgDlgButtons()< //顯示對話框
}
8.運行程序
在程序的運行過程中,用鼠標的左鍵單擊窗體中按鈕“Welcome”,在窗體上就會彈出一個對話框,如圖3-2所示。
圖3-2 MessageDlg()函數輸出對話框
9.InputBox()函數
對話框函數中的InputBox()函數用於在程序運行的過程中顯示一個包含一個字符串和按鈕信息的輸入對話框,用戶隻有對這個對話框進行正確的響應之後,才能夠關閉對話框,進行下一步的工作。
它的語法結構如下所示:
function InputBox(const ACaption, APrompt, ADefault: string): string;
下麵以一個示例來說明InputBox()函數的用法,具體的設計步驟如下:
10.開始工作
在程序的設計階段,向空白的窗體上放置一個按鈕控件、一個標簽和一個輸入文本框,如圖3-3所示。
圖3-3 輸入對話框
控件的作用如下:
?按鈕空間Button1:用來顯示一個數字輸入框;
?文本框空間Edit1:用來顯示信息輸入框中輸入數字的平方值。
11.添加代碼
並且在按鈕的響應事件中添加如下代碼:
AnsiString str;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
str=InputBox("平方計算器","請輸入原始數據:","");
//顯示一個輸入對話框
Edit1->Text=FloatToStr(StrToFloat(str)*StrToFloat(str));
//顯示輸入數據的平方值
}
12.運行程序
存儲文件,運行程序,如圖3-4(左)所示。然後單擊“數據數據”按鈕上,在窗體的上方就會出現一個如圖3-4(右)所示的輸入對話框。
圖3-4 輸入對話框
在輸入對話框中輸入一個正整數122,單擊“OK”按鈕,在程序運行的文本框中就會顯示出122的平方值,結果如圖3-5所示。
圖3-5 程序運行結果
3.1.2 標準對話框控件的應用
在CBuilder中為了方便用戶的開發工作,提供了10種標準的對話框控件——打開文件對話框、存儲文件對話框、打開圖片對話框、存儲文件對話框、打印對話框、打印設置對話框、字體設置對話框、顏色設置對話框、查找對話框和替換對話框。
以上這十種標準對話框的屬性和用法在這裏就不多加敘述了,下麵通過一個示例程序來說明打開文件對話框、字體設置對話框和顏色設置對話框的使用方法和各自所能夠實現的功能。
注意:
?在下麵的這個示例程序中,用戶在程序的運行過程中,可以有選擇的打開一個以*.txt為文件後綴的文本文件,並且在程序的運行過程中,還可以改變文本的顯示形式,如字體和顏色的設置等。
1.開始工作
首先啟動一個新的項目,選擇菜單File中的New Application項,在CBuilder 5的集成開發環境中就會彈出一個新建的窗體,在組件工具欄上選擇Standard選項後,在Memo組件的圖標上雙擊鼠標的左鍵,這時空白的窗體上就會出現一個Memo組件。
接著向窗體上添加4個Button組件、一個OpenDialog組件、一個SaveDialog組件、一個FontDialog組件和一個ColorDialog,添加組件後的窗體如圖3-6所示。
圖3-6 添加組件後的窗體
窗體中各個組件的屬性設置如下所示:
object Form1: TForm1
Left = 191
Top = 107
Width = 544
Height = 375
Caption = 'Form1'
object Memo1: TMemo
Left = 40
Top = 96
Width = 337
Height = 201
Lines.Strings = ( 'Memo1')
ScrollBars = ssBoth
end
object Button1: TButton
Left = 392
Top = 96
Width = 97
Height = 33
Caption = '打開文件'
end
object Button2: TButton
Left = 392
Top = 152
Width = 97
Height = 33
Caption = '存儲文件'
end
object Button3: TButton
Left = 392
Top = 208
Width = 97
Height = 33
Caption = '字體設置'
end
object Button4: TButton
Left = 392
Top = 264
Width = 97
Height = 33
Caption = '顏色設置'
end
object OpenDialog1: TOpenDialog
Left = 144
Top = 56
end
object SaveDialog1: TSaveDialog
Left = 112
Top = 56
end
object FontDialog1: TFontDialog
Left = 176
Top = 56
end
object ColorDialog1: TColorDialog
Left = 208
Top = 56
end
end
2.程序的初始化
程序的初始化過程,也就是對窗體FormCreate()事件的初始化。
在程序設計階段,用鼠標的左鍵雙擊窗體上的空白處,在屏幕上就會彈出一個代碼窗口,把光標移動到FormCreate()事件的過程處理代碼中,並且添加如下所示代碼:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->Memo1->Clear();
//清空文本框
Form1->OpenDialog1->Title="請選擇一個文本文件:";
//設置對話框標題
Form1->OpenDialog1->InitialDir="c:\\Windows";
//設置缺省文件目錄
Form1->OpenDialog1->Filter="All Files(*.*)|*.*|Text Files(*.txt)|*.txt";
//設置文件過濾條件
Form1->OpenDialog1->DefaultExt=String("TXT");
//設置缺省擴展名
Form1->SaveDialog1->Title="請選擇一個文本文件:";
//設置對話框標題
Form1->SaveDialog1->InitialDir="c:\\Windows";
//設置缺省文件目錄
Form1->SaveDialog1->Filter="All Files(*.*)|*.*|Text Files(*.txt)|*.txt";
//設置文件過濾條件
Form1->SaveDialog1->DefaultExt=String("TXT");
//設置缺省擴展名
Form1->Button2->Enabled=false;
//設置按鈕有效狀態
Form1->FontDialog1->Font=Form1->Memo1->Font;
Form1->ColorDialog1->Color=Form1->Memo1->Color;
//對話框的初始化
}
//-----------------------------------------------------------------------
程序說明:
在程序運行的初期,程序首先清空文本框中的文本顯示內容,這為用戶輸入文字和打開文件作好了準備工作,由於程序剛剛開始運行時,還沒有打開文件,所以“存儲文件”按鈕應該處於無效的狀態,這是通過語句Form1->Button2->Enabled=false;來實現的。
在程序的初始化過程中,還包括對OpenDialog組件的初始化,通過語句一條Form1->OpenDialog1->InitialDir:='c:\\windows';來設置組件所顯示對話框的缺省路徑為c:\windows,同時設置的文件顯示過濾器為'All Files(*.*)|*.*|Text Files(*.txt)|*.txt',這也就意味著,在程序運行的過程中,“打開”對話框顯示的文件隻有兩種選擇——要麼顯示所有的文件,要麼隻顯示以*.txt為後綴的文本文件。與OpenDialog組件的初始化相同,SaveDialog組件的初始化過程也是由兩條語句:
form1->SaveDialog1->InitialDir:='c:\\windows';
form1->SaveDialog1->Filter:='All Files(*.*)|*.*|Text Files(*.txt)|*.txt';
它們的功能在OpenDialog組件的初始化過程中已經講述過了。
在窗體FormCreate()事件的最後通過兩條語句
Form1->FontDialog1->Font=Form1->Memo1->Font;
Form1->ColorDialog1->Color=Form1->Memo1->Color;
完成對“字體”對話框和“顏色”對話框的初始化,把它們的初始狀態設置與Memo組件相一致。
至此,程序的初始化工作就完成了。
3.響應“打開文件”按鈕
在程序的設計階段,用鼠標的左鍵雙擊窗體上的“打開文件”按鈕,在彈出的如圖3-7所示代碼窗口的左側子窗口中選擇Tform1/Published/Button1Click選項,在代碼窗口的右側子窗口中就會顯示出組件“打開文件”的代碼響應過程。
圖3-7 彈出的代碼窗口
在其中添加如下所示的按鈕響應代碼:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Form1->OpenDialog1->Execute())
//打開一個對話框
{
Form1->Memo1->Lines->LoadFromFile(Form1->OpenDialog1->FileName);
//打開一個文件
Form1->Button2->Enabled=true;
//設置按鈕有效狀態
}
}
//-----------------------------------------------------------------------
在所添加的代碼段中,特別值得注意的是語句Form1->OpenDialog1->Execute;和語句Form1->Memo1->Lines->LoadFromFile(Form1->OpenDialog1->Filename);,其中前者的作用是顯示一個“打開文件”對話框,用戶可以在其中選擇一個文本文件,後者的作用是打開用戶在“打開文件”對話框中所選擇的文件。
當用戶打開文本文件後,窗體中的“存儲文件”按鈕就應該變為有效的狀態,這一功能是通過語句Form1->Button2->Enabled=true;來實現的。典型的“打開文”話框如圖3-8所示。
圖3-8 “打開”對話框
相應的,在“存儲文件”按鈕的事件響應中添加的代碼如下所示:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (Form1->SaveDialog1->Execute())
//顯示一個對話框
{
Form1->Memo1->Lines->SaveToFile(Form1->SaveDialog1->FileName);
//保存文件
}
}
4.響應屬性設置按鈕事件
在窗體中放置有一個FontDialog組件和一個ColorDialog組件,它們的作用是分別為文本框組件設置顯示字體和背景色。下麵以FontDialog組件為例來說明在程序中如何添加響應屬性設置按鈕事件的代碼,具體的設計步驟如下:
在程序的設計階段,用鼠標的左鍵雙擊組件FontDialog1,在屏幕上就會彈出一個代碼窗口,把光標移動到代碼窗口中,並且添加如下所示的按鈕事件響應代碼:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
if (Form1->FontDialog1->Execute())
//打開一個對話框
{
Form1->Memo1->Font=Form1->FontDialog1->Font;
//設置控件中文本顯示字體
}
}
在FontDialog組件的響應代碼中,語句Form1->FontDialog1->Execute;的作用是顯示一個對話框,用戶可以在其中為Memo組件中的文本設置字體、大小、風格以及顏色等,而Form1->Memo1->Font=Form1->FontDialog1->Font;語句的作用是將用戶在“字體”對話框中的選擇傳送給Memo組件。一個典型的字體設置對話框如圖3-9所示。
圖3-9 “字體”對話框
5.運行程序
做完以上的工作後,選擇菜單File中的Save All選項,在彈出的對話框中選擇合適的文件名保存文件,然後按鍵盤上的功能鍵F9運行程序,程序運行的初始畫麵如圖3-10所示。
圖3-10 程序運行的初始畫麵
首先用鼠標的左鍵單擊按鈕“打開文件”,在屏幕上就會彈出一個對話框,提示用戶選擇一個有效的文本文件,單擊“打開”按鈕,在Memo組件中就會顯示出文本文件中的內容,如圖3-11所示。
圖3-11 一個打開的文本文件
在程序運行的過程中,用戶可以通過單擊“顏色設置”按鈕和“字體設置”按鈕來改變係統的設置,如圖3-12所示為打開的“顏色”對話框,您可以十分方便的為文本設置係統顏色。
圖3-12 設置顏色
如圖3-13所示,為改變了字體和顏色後的效果(注明:字體為小6號,顏色為淡藍)。
圖3-13 字體和顏色效果
編輯文本後,單擊“存儲文件”按鈕,在窗體上就會彈出一個“另存為”對話框。在“另存為…”對話框中選擇一個有效的路徑和文件名,單擊“保存”按鈕就完成了文本文件的保存工作。
附程序完整源代碼如下所示:
程序清單
//-----------------------------------------------------------------------
#include #pragma hdrstop
#include "MemoControl.h"
//-----------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-----------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-----------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->Memo1->Clear();
//清空文本框
Form1->OpenDialog1->Title="請選擇一個文本文件:";
//設置對話框標題
Form1->OpenDialog1->InitialDir="c:\\PWin98";
//設置缺省文件目錄
Form1->OpenDialog1->Filter="All Files(*.*)|*.*|Text Files(*.txt)|*.txt";
//設置文件過濾條件
Form1->OpenDialog1->DefaultExt=String("TXT");
//設置缺省擴展名
Form1->SaveDialog1->Title="請選擇一個文本文件:";
//設置對話框標題
Form1->SaveDialog1->InitialDir="c:\\PWin98";
//設置缺省文件目錄
Form1->SaveDialog1->Filter="All Files(*.*)|*.*|Text Files(*.txt)|*.txt";
//設置文件過濾條件
Form1->SaveDialog1->DefaultExt=String("TXT");
//設置缺省擴展名
Form1->Button2->Enabled=false;
//設置按鈕有效狀態
Form1->FontDialog1->Font=Form1->Memo1->Font;
Form1->ColorDialog1->Color=Form1->Memo1->Color;
//對話框的初始化
}
//-----------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (Form1->OpenDialog1->Execute())
//打開一個對話框
{
Form1->Memo1->Lines->LoadFromFile(Form1->OpenDialog1->FileName);
//打開一個文件
Form1->Button2->Enabled=true;
//設置按鈕有效狀態
}
}
//-----------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (Form1->SaveDialog1->Execute())
//顯示一個對話框
{
Form1->Memo1->Lines->SaveToFile(Form1->SaveDialog1->FileName);
//保存文件
}
}
//-----------------------------------------------------------------------