VC++學習筆記(四)
1。mfc單文件結構
2。新增左擊滑鼠,按下鍵盤事件
3。訊息:視窗訊息,控制元件的通知訊息,命令訊息
第5章對話方塊和常用控制元件
5.1 對話方塊的使用
5.2 控制元件的建立和使用方法
5.3 常用控制元件
5.4 通用對話方塊和訊息對話方塊
5.1對話方塊的使用
5.1.1模式和無模式對話方塊
Ø 模式對話方塊
u 指當對話方塊被彈出,使用者必須在對話方塊中作出相應的操作,在退出對話方塊之前,對話方塊所在的應用程式不能繼續執行。
u 無模式對話方塊
u 指當對話方塊被彈出後,一直保留在螢幕上,可繼續在對話方塊所在的應用程式中進行其它操作;需要使用對話方塊時,單擊對話方塊所在的區域即可啟用。
在建立和退出對話方塊視窗時的方式不同:
u 建立時,模式對話方塊由系統自動分配記憶體空間,對話方塊退出時,對話方塊物件自動刪除。無模式對話方塊需要來指定記憶體,退出時還需刪除對話方塊物件。
u 退出時,兩種對話方塊所使用的終止函式不一樣。模式對話方塊通過呼叫CDialog:: EndDialog來終止,無模式對話方塊則是呼叫CWnd::DestroyWindow來終止。
u 函式CDiaolog::OnOK和CDiaolog::OnCancel是呼叫EndDialog的,因此無模式對話方塊必須用DestroyWindow來過載OnOK 和OnCancel
u 需要正確刪除表示對話方塊的物件。對模式對話方塊,在建立函式返回後即可刪除物件。無模式對話方塊不是同步的,在建立函式呼叫後立即返回,因而不知道何時刪除物件,但可以通過過載CWnd::PostNcDestroy函式並執行清除操作。
5.1對話方塊的使用
5.1.2使用對話方塊編輯器
Ø 開啟對話方塊編輯器
將專案工作區視窗切換到ResourceView頁面,雙擊Dialog目錄下任意一個對話方塊ID。或者,選擇“Insert”à“Resource”選單命令(或按快捷鍵Ctrl+R),選擇Dialog項,單擊New。
5.1對話方塊的使用
在對話方塊中新增和編輯控制元件
(1)控制元件新增的方法
在對話方塊中新增一個控制元件的方法有下列幾種:
u 在控制元件工具欄中單擊某控制元件,滑鼠箭頭在對話方塊內變成“十”字形狀;在對話方塊指定位置單擊滑鼠左鍵,再拖動選擇框可改變控制元件的大小和位置。
u 在控制元件工具欄中單擊某控制元件,滑鼠箭頭對話方塊內變成“十”字形狀;在指定位置處單擊滑鼠左鍵不放,拖動滑鼠至滿意位置,釋放滑鼠鍵。
u 用滑鼠左鍵點中控制元件工具欄中的某控制元件,並按住滑鼠鍵不放;在移動滑鼠到對話方塊的指定位置的過程中,會看到一個虛線框,下面帶有該控制元件的標記;釋放滑鼠鍵。
5.1對話方塊的使用
(2)單個控制元件的選取
Ø滑鼠選取
保證選擇按鈕( )是被選中的,移動滑鼠指標至指定的控制元件上,單擊滑鼠左鍵。
Ø助記符選取
在相應的控制元件上右擊。選擇“Properties”選單項,對話方塊中的“Caption”框是用來輸入控制元件的標題,在標題中的某個字母之前鍵入“&”符號,則該字母就是此控制元件的助記符。
ØTab鍵選取
利用Tab鍵,可在對話方塊內的控制元件中進行選擇。每按一次Tab鍵依次選取對話方塊中的下一個控制元件,若按住Shift鍵,再單擊Tab鍵則選取上一個控制元件。
(3)多個控制元件的選取
u在對話方塊內按住滑鼠左鍵不放,拖出一個大的虛框,釋放滑鼠,則被該虛框所包圍的控制元件都將被選取。
u先按住Shift鍵不放,用滑鼠選取控制元件,直到所需要的多個控制元件選取之後再釋放Shift鍵。若在選取時,對已選取的控制元件再選取一下,則該控制元件取消選取。
u一旦單個控制元件被選取後,其四周由選擇框包圍著,選擇框上還有幾個(通常是八個)藍色實心小方塊,拖動它可改變控制元件的大小,如圖。
u多個控制元件被選取後,其中只有一個控制元件的選擇框有幾個藍色實心小方塊,這個控制元件稱為主要控制元件,而其他控制元件的選擇框的小方塊是空心的。如圖。
5.1對話方塊的使用
(4)控制元件的移動、刪除和複製
當單個控制元件或多個控制元件被選取後,按方向鍵或用滑鼠拖動控制元件的選擇框可移動控制元件。若在滑鼠拖動過程中還按住Ctrl鍵則複製控制元件。若按Del鍵可將選取的控制元件刪除。
(5)設定控制元件的Tab鍵次序
一是改變用Tab鍵選擇控制元件的次序,二是當兩個或兩個以上的控制元件構成一組時,需要它們的Tab鍵次序連續。
對話方塊內控制元件的Tab鍵次序設定步驟如下:
u 首先,選擇“Layout”à“Tab Order”命令,或按Ctrl+D,此時每個控制元件的左上方都有一個數字,表明了當前Tab鍵次序,如圖。
u 其次,按新的次序依次用滑鼠單擊各個控制元件,新的Tab鍵即可生成。
u 最後,單擊對話方塊或按Enter鍵結束Tab Order 方式。
5.1對話方塊的使用
對話方塊內的控制元件的佈局
5.1對話方塊的使用
u 大多佈置控制元件的命令使用前,需要選取多個控制元件,且“主要控制元件”起到了關鍵作用。多個控制元件的佈置過程中,常需要重新設定“主要控制元件”。設定的方法是按住Ctrl或Shift鍵,用滑鼠單擊所要指定的控制元件。
u 系統提供了網格、標尺等輔助工具。在圖5.5的控制元件佈局工具欄的最後兩個按鈕分別用來網格和標尺的切換。一旦網格顯示,新增或移動控制元件時都將自動定位在網格線上。“Layout”選單下的“Guide Settings”命令提供了設定網格單元大小的功能,如圖。
Ø 測試對話方塊
5.1對話方塊的使用
5.1.3對話方塊的程式設計
Ø 新增對話方塊資源
選擇“Insert”à“Resource”選單命令(或按Ctrl+R),若單擊Dialog項左邊的“+”號,將展開對話方塊資源的不同型別選項,如圖。
5.1對話方塊的使用
Ø 改變對話方塊的屬性
在對話方塊模板的非控制元件的區域內左擊,用下列方式之一開啟屬性對話方塊:
u 選擇“View”選單à“Properties”命令或按Alt+Enter健。
u 用滑鼠右擊對話方塊模板,選取Properties命令。
如圖,General是對話方塊屬性的預設顯示頁面,其中列有對話方塊的識別符號名稱框、標題框等,具體說明如表。
5.1對話方塊的使用
Ø 向對話方塊內新增控制元件
Ø 新增一個類:注意:以字母c開頭
在對話方塊模板的非控制元件的區域內雙擊,如圖的對話方塊。
單擊[OK],彈出如圖的對話方塊。可以為對話方塊資源定義一個新類名c123。
5.1對話方塊的使用
Ø 訊息對映首先新增“按鈕”
單擊[OK]按鈕,出現“MFC ClassWizard”對話方塊,如圖。
5.1對話方塊的使用
選定IDC_BUTTON1的BN_CLICKED,雙擊左鍵或單擊[Add Function]按鈕,如圖。
對話方塊中,可以為新增的成員函式名重新定義,單擊[OK]。選定成員函式OnButton1項,雙擊左鍵或單擊[Edit Code]按鈕,在此成員函式新增程式碼。
u 不同資源物件(控制元件、選單命令等)的訊息是不相同的。例如,按鈕控制元件IDC_BUTTON1的訊息有兩個:BN_CLICKED和BN_DOUBLECLICKED,分別表示當用戶單擊或雙擊該按鈕時產生的訊息。
u 一般不需要對圖5.10對話方塊中的[OK](確定)與[Cancel](取消)按鈕進行訊息對映,因為系統已自動設定了這兩個按鈕的動作,當用戶單擊這兩個按鈕都將自動關閉對話方塊。
5.1對話方塊的使用
Ø 程式在三處新增新使用者程式碼
(1)在標頭檔案(MyDlg.h檔案)中宣告訊息處理函式OnButton1:
protected:
//{{AFX_MSG(CMyDlg)
afx_msg void OnButton1();
//}}AFX_MSG
(2)在MyDlg.cpp原始檔開頭部分的訊息對映入口,新增訊息對映巨集:
BEGIN_MESSAGE_MAP(CMyDlg, CDialog) // 訊息對映開始
//{{AFX_MSG_MAP(CMyDlg)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP() // 訊息對映結束
表明訊息及其處理函式之間的聯絡。單擊按鈕控制元件IDC_BUTTON1時,系統將自動呼叫OnButton1函式。
(3)在MyDlg.cpp檔案中寫入一個空的訊息處理函式的模板,以便使用者填入具體程式碼,如下面的框架:
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
}
5.1對話方塊的使用
Ø 在程式中使用對話方塊
(1)利用專案工作區的ClassView標籤項,將Ex_SDIHello.cpp原始檔開啟;
(2)在Ex_SDIHello.cpp原始檔的前面加上包含類CMyDlg的標頭檔案:
#include "MyDlg.h"
(3)在InitInstance函式體中的“return TRUE;”語句之前新增下列程式碼:
CMyDlg dlg;
dlg.DoModal();
DoModal是模式對話方塊最常用的函式,它負責對話方塊的顯示和終止。
(4)編譯並執行。在程式的一開始就出現使用者自己設計的對話方塊,單擊[Button1]按鈕將彈出“歡迎進入對話方塊的設計!”的訊息對話方塊來。
5.2控制元件的建立和使用方法
5.2.1控制元件的建立方法
控制元件的建立方式有以下兩種:
1。一種是在對話方塊模板中用編輯器指定控制元件,也就是說,將控制元件的父視窗指定為對話方塊,這樣做的好處是明顯的,因為當應用程式啟動該對話方塊時,Windows系統就會為對話方塊建立控制元件;而當對話方塊消失時,控制元件也隨之清除。
2。另一種方式是將控制元件看作是任一視窗的子視窗,並通過呼叫相應的Create函式來建立。
[例Ex_SDIHello] 在上例Ex_SDIHello的基礎上用子視窗方式建立控制元件。
(1)開啟CMyDlg的標頭檔案MyDlg.h,新增一個按鈕類CButton指標變數:
class CMyDlg : public CDialog
{
// Construction
public:
CMyDlg(CWnd* pParent = NULL); // standard constructor
CButton *m_btnWnd;
…
}
5.2控制元件的建立和使用方法
(2)按Ctrl+W快捷鍵開啟對話方塊,切換到Message Maps頁面,在Object IDs列表中選定“CMyDlg”項,並在Message列表中找到WM_INITDIALOG訊息,雙擊滑鼠左鍵,然後單擊[Edit Code]按鈕,新增下列程式碼:
BOOL CMyDlg::OnInitDialog()
{ CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_btnWnd = new CButton(); // 構造按鈕控制元件
m_btnWnd ->Create("你好", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
CRect(20, 20, 120, 60), this, 201); // 建立
CFont *font = this->GetFont(); // 獲取對話方塊的字型
m_btnWnd->SetFont(font); // 設定控制元件字型
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
Create用來建立一個按鈕控制元件,第一個引數指定按鈕的標題,第二個引數指定控制元件的風格,第三個引數指定它在父視窗中的位置和大小,第四個引數指定父視窗指標,最後一個引數是指定該控制元件的標識值。
(3)編譯並執行,
結論:採用第一種辦法
5.2控制元件的建立和使用方法
5.2.2控制元件的資料交換和資料校驗 ddx交換,ddv校驗
例如,為CMyDlg類的按鈕控制元件IDC_BUTTON1新增並使用其成員變數m_MyBtn,則其相應的過程如下:
(1)啟動MFC ClassWizard,切換到Member Variables頁面,如圖。
(2)選定Class name為CMyDlg,然後在Control IDs列表中,選定所要關聯的控制元件ID號IDC_BUTTON1,雙擊滑鼠左鍵或單擊[Add Variable]按鈕,如圖。
5.2控制元件的建立和使用方法
(3)在Member variable name框中填好與控制元件相關聯的成員變數m_MyBtn,單擊[OK],在Control IDs列表中出現剛才新增的內容。
需要說明的是,
u DDV/DDX技術中,允許為同一個控制元件關聯多個數據成員變數,但必須保證這些變數名是互不相同的(control(控制元件類),value(具體資料))且這些變數在同一個型別不能有多個變數。
u 如果新增的成員變數是一個數值型別,則在MFC ClassWizard對話方塊的Member Variables頁面下方還要求使用者輸入變數的範圍,這就是控制元件的資料校驗設定。
u 同樣方法為edit新增m_stredit
(4)單擊[OK],發現ClassWizard作了以下三方面的修改。
u 1在MyDlg.h檔案中,新增與控制元件關聯的成員變數的宣告,程式碼如下:
// Dialog Data
//{{AFX_DATA(CMyDlg)
enum { IDD = IDD_DIALOG1 };
CButton m_MyBtn;
CString m_strEdit;
//}}AFX_DATA
5.2控制元件的建立和使用方法
u 2在MyDlg.cpp檔案中的CMyDlg建構函式實現程式碼處,新增資料成員變數的初始程式碼:
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{ //{{AFX_DATA_INIT(CMyDlg)
m_strEdit = _T("");
//}}AFX_DATA_INIT
}
u 3在MyDlg.cpp檔案中的DoDataExchange函式體內,新增控制元件的DDX/DDV程式碼。
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{ CDialog::DoDataExchange(pDX); // 呼叫此函式作為DDX的開始
//{{AFX_DATA_MAP(CMyDlg)
DDX_Control(pDX, IDC_BUTTON1, m_MyBtn);
DDX_Text(pDX, IDC_EDIT1, m_strEdit);
DDV_MaxChars(pDX, m_strEdit, 20);
//}}AFX_DATA_MAP
}
5.2控制元件的建立和使用方法
(5)為一個控制元件定義一個關聯的資料成員變數後,就可以使用CWnd::UpdateData 控制元件相關資料的輸入和讀取
True:控制元件傳給變數
False:變數傳給控制元件
函式實現控制元件的控制,包括控制元件相關資料的輸入和讀取。
執行該程式,當在編輯框中輸入“Hello”後,單擊[Button1]按鈕,則此時該按鈕的名稱就變成了編輯框控制元件中的內容“Hello”,如圖。
void c123::OnButton1() c123--button1—click
{
// TODO: Add your control notification handler code here
UpdateData();
m_mybtn.SetWindowText(m_stredit);
}
5.2控制元件的建立和使用方法
5.2.3控制元件的通用屬性
5.2控制元件的建立和使用方法
5.2.4控制元件的訊息
控制元件的程式設計和使用過程中,可以向控制元件傳送訊息來完成特定的任務,或者是根據控制元件產生的訊息執行自己的程式碼(主要)。
應用程式建立一般控制元件或公共控制元件之後,控制元件的狀態發生改變時,控制元件就會向其父視窗傳送訊息,這個訊息稱為“通知訊息”。對於每個訊息,系統都會用一個MSG結構來記錄,MSG具有下列結構:
typedef struct tagMSG { // msg
HWND hwnd; // 接收到訊息的視窗控制代碼
UINT message; // 訊息
WPARAM wParam; // 訊息的附加資訊,它的含義取決於message
LPARAM lParam; // 訊息的附加資訊,它的含義取決於 message
DWORD time; // 訊息傳送時的時間
POINT pt; // 訊息傳送時,游標的螢幕座標
} MSG;
對於一般控制元件來說,通知訊息通常是一條WM_COMMAND訊息,這條訊息的wParam引數的低位字中含有控制元件識別符號,wParam引數的高位字則為通知程式碼,lParam引數則是指向控制元件的控制代碼。
5.2控制元件的建立和使用方法
對於公共控制元件,通知訊息通常是一條WM_NOTIFY訊息,wParam引數是傳送通知訊息的控制元件的識別符號,lParam引數是指向NMHDR結構的指標。對於有些控制元件的通知訊息,lParam引數是指向一個更大的結構,且結構中的第一個成員還必須具有NMHDR結構。
對於控制元件的WM_COMMAND或是WM_NOTIFY訊息,都可以用ClassWizard對它們加以對映。
儘管控制元件的各自通知訊息並不相同,但下列的通知訊息是所有Windows控制元件所共有的:
NM_CLICK 在控制元件中單擊滑鼠左按鈕
NM_DBLCLK 在控制元件中雙擊滑鼠左按鈕
NM_RCLICK 在控制元件中單擊滑鼠左按鈕
NM_RDBLCLK 在控制元件中雙擊滑鼠右按鈕
NM_RETURN 當控制元件具有輸入焦點時按下ENTER鍵
NM_SETFOCUS 控制元件得到輸入焦點
NM_KILLFOCUS 控制元件失去輸入焦點
NM_OUTOFMEMORY 沒有足夠的記憶體使控制元件完成操作
新增訊息對映
類嚮導-c123-c123-oncommand:
BOOL c123::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
WORD aa=HIWORD(wParam);
WORD bb=LOWORD(wParam);
if((bb==IDC_BUTTON2)&&(aa==BN_CLICKED))
MessageBox("abc");
return CDialog::OnCommand(wParam, lParam);
}
5.3常用控制元件
根據控制元件的特性和功能,一般可將其分為三類:Windows公共控制元件、ActiveX控制元件以及MFC新增的一些控制元件等。
5.3常用控制元件
5.3.1靜態控制元件和按鈕
Ø靜態控制元件
一個靜態控制元件是用來顯示一個字串、框、矩形、圖示、點陣圖或增強的圖元檔案。它可以被用來作為標籤、框或用來分隔其它的控制元件。一個靜態控制元件一般不接收使用者輸入,也不產生通知訊息。
在對話方塊編輯器的控制元件工具欄中,屬於靜態控制元件的有:靜態文字( )、組框( )和靜態圖片(新增bmp圖片資源-設定圖片為bmp格式-選擇)( )三種。
5.3常用控制元件
Ø 按鈕
(1)按鍵按鈕
通常可以立即產生某個動作,執行某個命令,常被稱為命令按鈕。兩種風格:標準按鍵按鈕和預設按鍵按鈕。從外觀上來說,預設按鍵按鈕是在標準按鍵按鈕的周圍加上一個黑色邊框,這個黑色邊框表示該按鈕已接受到鍵盤的輸入焦點,只須按回車鍵就能按下該按鈕。具體設定的方法是在按鍵按鈕屬性對話方塊的Style頁面中選中“Default button”項。
(2)單選按鈕
外形是在文字前有一個圓圈,被選中時,就標上一個黑點,可分為一般和自動兩種型別。自動型別中,若選中同組按鈕中的某個單選按鈕,則其餘的單選按鈕的選中狀態就會清除,保證了多個選項始終只有一個被選中。
(3)複選框
外形是在文字前有一個空心方框,被選中時,複選框中就加上一個“ü”標記,三態複選框還有種處於灰框狀態,表示“不確定”。設定成三態複選框的方法是在複選框屬性對話方塊的Style頁面中選中“Tri-state”項。
5.3常用控制元件
Ø 按鈕的訊息
常見的只有兩個:BN_CLICKED和BN_DOUBLE- CLICKED。
Ø 按鈕選中操作
u 最常用的按鈕操作是設定或獲取一個或多個按鈕的選中狀態。CButton類的成員函式SetCheck和GetCheck設定或獲取指定按鈕的選中狀態,原型:
void SetCheck( int nCheck );
int GetCheck( ) const;
nCheck和GetCheck函式返回的值可以是:0表示不選中,1表示選中,2表示不確定(僅用於三態按鈕)。
u 對於多個單選按鈕的選中狀態的設定或獲取,需要使用CWnd類的成員函式CheckRadioButton和GetCheckedRadioButton,原型:
void CheckRadioButton( int nIDFirstButton, int nIDLastButton, int nIDCheckButton );
int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton );
nIDFirstButton和nIDLastButton指定這組單選按鈕的第一個和最後一個按鈕ID值,nIDCheckButton指定要設定選中狀態的按鈕ID值,函式GetCheckedRadioButton返回被選中的按鈕ID值。
5.3常用控制元件
[例Ex_Ctrls1] 用靜態圖片、單選按鈕、複選框和按鍵按鈕控制元件,設計介面。開始,所有單選按鈕都是灰顯的,不能選擇,選中“允許”複選框後,所有單選按鈕可以使用,選定一個單選框後,單擊[應用]。
(1)用MFC AppWizard(exe)建立一個名為Ex_CommCtrls的基於對話方塊的應用程式。在建立的第一步,將應用程式型別選擇為Dialog Based,按[Finish]。自動顯示出該程式的對話方塊資源模板內容。
(2)開啟屬性對話方塊將其標題改為“使用Windows常用控制元件”。
(3)用編輯器為對話方塊新增如下表所示的一些控制元件。
(4)四個單選按鈕的Tab次序應連續,從IDC_RADIO1到IDC_RADIO4依次增加。
(5)按Ctrl+W快捷鍵,切換到Member Variables頁面,在Class name中選擇CEx_CommCtrlstDlg,選中複選框控制元件ID號IDC_CHECK1,雙擊滑鼠或單擊Add Variables按鈕。
5.3常用控制元件
(6)切換到ClassWizard的Messsage Maps頁面,為複選框IDC_CHECK1和按鈕IDC_BUTTON1增加BN_CLICKED的訊息對映,新增程式碼:
void CEx_CommCtrlsDlg::OnCheck1()
{ UpdateData();
for (int i=0; i<4; i++)
GetDlgItem(IDC_RADIO1 + i)->EnableWindow(m_bEnabled);
}
void CEx_CommCtrlsDlg::OnButton1()
{ UpdateData();
if (!m_bEnabled) return;
int nID = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO4);
if (nID == IDC_RADIO1)
{ MessageBox("1"); }
if (nID == IDC_RADIO2)
{ MessageBox("2"); }
if (nID == IDC_RADIO3)
{ MessageBox("3"); }
if (nID == IDC_RADIO4)
{ MessageBox("4"); }
}
5.3常用控制元件
(7)定位到CEx_CommCtrlsDlg::OnInitDialog函式體中,新增下列程式碼:
BOOL CEx_CommCtrlsDlg::OnInitDialog()
{ CDialog::OnInitDialog();
…
CheckRadioButton(IDC_RADIO1, IDC_RADIO4, IDC_RADIO1); //設定第一個單選按鈕為選中
OnCheck1(); ---why?
return TRUE; // return TRUE unless you set the focus to a control
}
(8)編譯並執行。
5.3常用控制元件
5.3.2編輯框
Ø 編輯框的屬性和風格
5.3常用控制元件
Ø 編輯框的基本操作
(1)口令設定
預設的口令字元是“*”,應用程式可以用成員函式CEdit::SetPasswordChar 來定義自己的口令字元,其函式原型如下:
void SetPasswordChar( TCHAR ch );
(2)選擇文字
用滑鼠來選擇文字的操作方法:在要選擇的文字的一端按下滑鼠左鍵並拖動滑鼠,到另一端釋放滑鼠鍵。
用鍵盤來選擇文字的方法:在按游標方向移動鍵的同時,按住Shift鍵。
應用程式中可以通過程式設計選擇文字,需要通過呼叫成員函式CEdit::SetSel 來實現。與該函式相對應的還有CEdit::GetSel和CEdit::ReplaceSel,分別用來獲取編輯框中前選擇的開始和結束的位置以及替換被選擇的文字。
(3)設定編輯框的頁面邊距
設定編輯框的頁面邊距可以使文字在編輯框顯示更具滿意效果trim,應用程式可通過呼叫成員函式CEdit::SetMargins來實現,函式原型:
void SetMargins( UINT nLeft, UINT nRight );
(4)剪帖板操作
編輯框自動支援文字的複製、貼上、剪下的鍵盤操作,對應的快捷健為Ctrl+C、Ctrl+V和Ctrl+X。若應用程式呼叫CEdit::Undo函式時,還可撤消當前的操作,再呼叫一次該函式,則恢復剛才的操作。
5.3常用控制元件
(5)獲取多行編輯框文字
一種是使用DDX/DDV,將編輯框控制元件所關聯的變數型別選定為CString後,則不管多行編輯框的文字有多少都可用此變數來儲存。這種方法不能單獨獲得多行編輯框中的某一行文字。
另一種方法是使用編輯框CEdit類的相關成員函式來獲取文字。例如,下面的程式碼將顯示編輯框中第二行的文字內容:
char str[100];--在標頭檔案定義
if (m_Edit.GetLineCount()>=2) // 判斷多行編輯框的文字是否有兩行以上
{ int nChars;
nChars = m_Edit.LineLength(m_Edit.LineIndex(1)); // 獲取第二行文字的字元個數
// 0表示第一行,1表示第二行,依次類推。LineIndex用於將文字行轉換成
// 能被LineLength識別的索引
m_Edit.GetLine(1,str,nChars); // 獲取第二行文字
str[nChars] = '\0';
MessageBox(str);
}
5.3常用控制元件
Ø 編輯框的通知訊息
[例Ex_Ctrls2] 使用靜態文字、組框、編輯框以及按鈕等控制元件,設計介面。使用者在“成績1”、“成績2”和“成績3”編輯框中輸入成績後,單擊[計算平均分]按鈕,將顯示出這三個成績的平均分。
(1)開啟前面的Ex_CommCtrls。
(2)嚮應用程式中新增一個對話方塊資源,開啟屬性對話方塊將其標題改為“使用編輯框”,ID號改為IDD_EDIT。
(3) 用編輯器為對話方塊新增如下表所示的一些控制元件。
(4)雙擊對話方塊模板或按Ctrl+W快捷鍵,為對話方塊資源IDD_EDIT建立一個對話方塊類CEditDlg。
5.3常用控制元件
(5)開啟ClassWizard的Member Variables標籤,在Class name中選擇CEditDlg,選中所需的控制元件ID號,雙擊滑鼠或單擊Add Variables按鈕。依次為控制元件增加成員變數。
(6)切換到ClassWizard的Messsage Maps標籤頁,為CEditDlg增加WM_INITDIALOG的訊息對映,並新增下列程式碼:
BOOL CEditDlg::OnInitDialog()
{ CDialog::OnInitDialog();
m_strAve = "0.00";
UpdateData(FALSE);// 將成員變數資料傳給控制元件,並在控制元件中顯示
return TRUE;
}
5.3常用控制元件
(7)用ClassWziard為按鈕IDC_BUTTON1新增BN_CLICKED的訊息對映,並增加下列程式碼:
void CEditDlg::OnButton1()
{ UpdateData(); // 將控制元件顯示的資料傳給成員變數
double ave = (double)(m_nScore1+m_nScore2+m_nScore3)/3.0;
m_strAve.Format("%6.2f", ave);
UpdateData(FALSE); // 將成員變數資料傳給控制元件並顯示
}
(8)定位到CEx_CommCtrlsDlg::OnButton