MFC控制元件:
Windows標準控制元件:
windows標準控制元件由Windows 作業系統提供,在Windows 95中還提供了一些新增的控制元件。所有這些控制元件物件都是可程式設計的,我們可以使用Visual C++提供的對話方塊編輯器把它們新增到對話方塊中。Microsoft基礎類庫(MFC)提供了封裝這些控制元件的類,它們列於表6.1。
在MFC 中,類CWnd是所有視窗類的基類,很自然的,它也是所控制元件類的基類。
Windows標準控制元件在以下環境下提供:
windows 95
Windows NT 3.51及以後版本
win32s 1.3
注意:visual C++4.2及以後版本不再支援Win32s.
MFC基本常用控制元件基本用法VC++控制元件工具箱:
按鈕(Button)用來接收使用者的命令,應用程式在接收到使用者命令後,通常需要進行一些後臺工作。按鈕可以響應單擊或雙擊動作,在按鈕接收到滑鼠動作後,向其父視窗傳送相應的控制元件通知,使用者可以對這些控制元件通知進行訊息對映,從而進行相應的處理。
複選框(Check Box)用來顯示某種可能的選擇,該項選擇是獨立的,使用者可以選中或取消該選項。在選項被選中的時候核選標記出現,選項被取消時核選標記消失。MFC中由CButton類對核選框進行支援,使用者可以透過SetCheck()函式和GetCheck()函式設定或獲取核選框當前的狀態。
BST_UNCHECKED==((CButton*)GetDlgItem(IDC_CHECK_RES1))->GetCheck()
((CButton*)GetDlgItem(IDC_CHECK_RES1))->SetCheck(true);
編輯框(Edit Control)
用來接收使用者輸入的字串。透過選擇編輯框的選項,編輯框可以接收字串、數字、密碼等;編輯框還可以設定成接收多行字串的模式;可以自動進行大小寫轉換。編輯框可能向父視窗傳送多種控制元件通知,如果使用者需要,可以對這些控制元件通知進行處理。MFC提供了CEdit類支援編輯框控制元件。
GetDlgItem(IDC_***)->SetWindowText(Cstring); GetDlgItem(IDC_***)->GetWindowText(Cstring);
組合框(Combo Box)
列表框和編輯框的組合,使用者除了可以在列表中對已經存在的選項進行選擇外,還可以輸入新的選擇。MFC提供了CComboBox類對組合框控制元件進行支援。
CComboBox * AAA = (CComboBox*)(GetDlgItem(IDC_***)); AAA->AddString(_T("***")); AAA->SelectString(0, _T("***")); AAA->SetCurSel(0); int nSel = AAA->GetCurSel(); AAA->GetLBText(nSel, Cstring); if(strType.Trim() == _T("***"))
列表框(List Box)
用來選擇一系列的可能選擇,使用者透過捲軸可以在這些選擇中瀏覽。在列表框中,可以進行單項選擇,也可以進行多項選擇,這取決於使用者在控制元件屬性對話方塊中的設定。MFC提供了CListBox類對列表框控制元件進行支援。
組成框(Group Box)用來包圍具有邏輯關係的一組控制元件,在這些控制元件的周圍加上邊界和標題。需注意的是,組成框僅僅是在視覺效果上對控制元件進行“成組”,真正的“成組”工作還需要另外一些工作。僅僅在視覺上展現出一組的邏輯關係,並不新增任何程式碼
一般是幾個單選按鈕組成一組,同組中的單選按鈕僅有一個按鈕被選中。
靜態文字(Static Text)用來在指定的位置顯示特定的字串,一般用來標識附近另一個控制元件的內容。顯示在靜態文字控制元件中的字串一般不再改變,但是在需要的時候,必須為其指定一個不同食物ID號,透過呼叫相應的函式來進行設定。MFC提供了CStatic類支援靜態控制元件。
圖形控制元件(Picture Control)顯示點陣圖(Bitmap)和圖示(Icon),圖形繪製與顯示,主要是其方形的區域適合顯示,同樣方形區域也可利用(Static Text)靜態文字框。
捲軸(Scroll Bar)這包括水平捲軸和垂直捲軸,除了在視覺效果上的方向不同外,水平捲軸在被滾動時發生WM_HSCROLL訊息,而垂直捲軸在被滾動時傳送WM_VSCROLL訊息。MFC提供了CScrollBar進行支援。
滑塊控制元件(Slider Control)通常用來在程式中接受一系列離散的數值。
使用者可以設定滑塊控制元件的取值範圍,並可以為控制元件加上刻度標記以顯示特定位置的含義。
MFC提供了CSliderCtrl類進行支援。
進度條(Progress Control)在進行一項需要較長時間的操作時來反應當前的進度。
當操作的進度不斷前進時,進度條就用特色顏色填充進度條框。使用者可以設定進度條的範圍和當前位置。
MFC提供了CProgressCtrl類進行支援。
CProgressCtrl* progressbar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS_1); progressbar->SetRange(0, 4); progressbar->SetPos(0);
熱鍵控制(Hot Key)
熱鍵控制元件看起來就像一個編輯框,但是在熱鍵控制元件中能夠立刻反應使用者剛剛按下的鍵組合,這在設定程式的熱鍵時特別有用。
熱鍵控制元件只是在“視覺”上顯示了按鍵組合,設定熱鍵的工作還需要使用者新增程式碼完成。
MFC提供了CHotKey類進行支援。
列表控制(List Control)按一定的排列順序顯示一系列帶圖示的字串。
列表控制元件提供了四種顯示模式:大圖示(Icon)、小圖示(Small Icon)、列表(List)和報表(Report)。
使用者可以向列表控制元件中新增新的項,也可以控制列表控制元件的顯示模式。
MFC提供了CListCtrl類進行支援。
初始化:
struct INFO { int id; CString time; CString type; }info; CString id; int nRow=0; id.Format(_T("%d"), info.id); m_ListCtrl.InsertItem(nRow,id); m_ListCtrl.SetItemText(nRow, 1, info.time); m_ListCtrl.SetItemText(nRow, 2, info.type); nRow ++;
新增記錄:
struct INFO { int id; CString time; CString type; }info; CString id; int nRow=0; id.Format(_T("%d"), info.id); m_ListCtrl.InsertItem(nRow,id); m_ListCtrl.SetItemText(nRow, 1, info.time); m_ListCtrl.SetItemText(nRow, 2, info.type); nRow ++;
樹形控制元件(Tree Control)顯示一系列專案的層次關係,最典型的例子是顯示磁碟上的檔案與資料夾。
如果有子專案的話,單擊樹形控制元件中的專案可以展開或者收縮其子專案。
MFC提供了CTreeCtrl類進行支援。
初始化
void CConfigDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: 在此處新增訊息處理程式程式碼 CRect rcWnd; GetClientRect(&rcWnd); CRect rcChild = rcWnd; rcChild.top = rcWnd.top+10; rcChild.bottom -=10; rcChild.left += 160; rcChild.right -= 10; CRect laneRect = rcChild; if(::IsWindow(m_1Dlg)) m_1Dlg.MoveWindow(rcChild); if(::IsWindow(m_2Dlg)) m_2Dlg.MoveWindow(rcChild); if ( ::IsWindow( pTree.GetSafeHwnd() ) ) { pTree.MoveWindow(rcWnd.left+10,rcWnd.top+30,130,350,1); } }
樹節點切換
void CConfigDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR); // TODO: 在此新增控制元件通知處理程式程式碼 HTREEITEM hSelected=pNMTreeView->itemNew.hItem; if(hSelected!=NULL) { pTree.SelectItem(hSelected); int nDat = pTree.GetItemData(hSelected); switch(nDat) { case 1: /*MessageBox(_T("YNAME"));*/ if(m_pPreWnd) m_pPreWnd->ShowWindow(SW_HIDE); m_1Dlg.ShowWindow(SW_SHOW); m_pPreWnd = &m_1Dlg; break; case 3: /*MessageBox(_T("XNAME"));*/ if(m_pPreWnd) m_pPreWnd->ShowWindow(SW_HIDE); m_2Dlg.ShowWindow(SW_SHOW); m_pPreWnd = &m_2Dlg; break; default: break; } } *pResult = 0; }
改變位置
void CConfigDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: 在此處新增訊息處理程式程式碼 CRect rcWnd; GetClientRect(&rcWnd); CRect rcChild = rcWnd; rcChild.top = rcWnd.top+10; rcChild.bottom -=10; rcChild.left += 160; rcChild.right -= 10; CRect laneRect = rcChild; if(::IsWindow(m_1Dlg)) m_1Dlg.MoveWindow(rcChild); if(::IsWindow(m_2Dlg)) m_2Dlg.MoveWindow(rcChild); if ( ::IsWindow( pTree.GetSafeHwnd() ) ) { pTree.MoveWindow(rcWnd.left+10,rcWnd.top+30,130,350,1); } }
屬性表控制元件(Tab Control)
包含大量的控制元件,可以滿足使用者顯示或者獲取大量資料分類顯示的要求,典型例子是Windows工作列每個程式標籤。
每個屬性表又分為好幾個屬性頁,這些屬性頁由各自的標籤進行區分,這些屬性頁中都可以包容其他控制元件。
在顯示屬性表的時候,一次只能夠顯示一個屬性頁的全部內容,同時顯示其他屬性頁的標籤,使用者透過單擊標籤開啟相應的屬性頁。
MFC提供了CTabCtrl類進行支援。
初始化繫結變數
m_tab_Light.DeleteAllItems(); m_LightParkingDlg.DestroyWindow(); m_LightStatusDlg.DestroyWindow(); m_tab_Light.InsertItem(0, _T("0001")); // 插入第一個標籤 m_tab_Light.InsertItem(1, _T("0002")); // 插入第二個標籤 CRect tabRect; // 標籤控制元件客戶區的位置和大小 m_tab_Light.GetClientRect(&tabRect); // 獲取標籤控制元件客戶區Rect // 調整tabRect,使其覆蓋範圍適合放置標籤頁 tabRect.left += 2; tabRect.right -= 1; tabRect.top += 21; tabRect.bottom -= 2; m_LightParkingDlg.Create(IDD_DIALOG_LIGHT_PARKING, &m_tab_Light); // 建立第一個標籤頁 m_LightStatusDlg.Create(IDD_DIALOG_LIGHT_STATUS, &m_tab_Light); // 建立第二個標籤頁 //m_LightParkingDlg.InitData(); m_LightParkingDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(),SWP_SHOWWINDOW);
控制元件頁面切換
CRect tabRect; // 標籤控制元件客戶區的位置和大小 m_tab_Light.GetClientRect(&tabRect); // 獲取標籤控制元件客戶區Rect // 調整tabRect,使其覆蓋範圍適合放置標籤頁 tabRect.left += 2; tabRect.right -= 1; tabRect.top += 21; tabRect.bottom -= 2; switch (m_tab_Light.GetCurSel()) { case 0: m_LightStatusDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW); m_LightParkingDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW); break; case 1: m_LightParkingDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_HIDEWINDOW); m_LightStatusDlg.SetWindowPos(NULL, tabRect.left, tabRect.top, tabRect.Width(), tabRect.Height(), SWP_SHOWWINDOW); break; }
動畫控制元件(Animation):用來播放一段AVI格式的影片剪輯。使用者可以控制影片剪輯的播放、停止和定位,但也僅限於這些功能。動畫控制元件設定不能播放音訊剪輯,如果使用者需要更高層次的影片或者音訊的支援,請選用MCIWnd控制元件。
MFC提供了CAnimateCtrl類對動畫控制元件進行支援。
高階編輯框(Rich Edit)編輯控制元件(Edit Control)功能的擴充套件。在高階編輯框中,除了簡單的輸入和編輯字串外,使用者還可以為字元或段落指定特定的格式,使用者甚至還可以向高階編輯框中插入OLE項。
高階編輯框基本上實現了一個帶格式的文字編輯器功能,而只需要使用者新增少量的介面。
MFC提供了CRichEditCtrl類進行支援。
日期/時間選擇器(Date Time Picker)向用戶提供了一種直觀的選擇日期和時間的方法、日期/時間選擇器在外觀上類似於一個組合框,但是當用戶單擊下拉箭頭時就會展開一個日曆控制元件供使用者選擇,而一旦使用者做出了選擇,日期/時間選擇器會自動顯示新的日期/時間。MFC提供了CDateTimeCtrl類進行支援。
SYSTEMTIME times_1; //開始時間日期 SYSTEMTIME timee_1; //結束時間日期 CDateTimeCtrl* dtPickctrs_1 = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_START1); //獲取時間控制元件控制代碼 CDateTimeCtrl* dtPickctre_1 = (CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER_END1); memset(×_1,0,sizeof(times_1)); //時鐘初始化 memset(&timee_1,0,sizeof(timee_1)); dtPickctrs_1->GetTime(×_1); //獲取控制元件所選時間,儲存至變數 dtPickctre_1->GetTime(&timee_1); CString strTimeStart; //將時間轉換為字串 strTimeStart.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), times_1.wYear,times_1.wMonth,times_1.wDay,times_2.wHour,times_2.wMinute,times_2.wSecond); CString strTimeEnd; strTimeEnd.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), timee_1.wYear,timee_1.wMonth,timee_1.wDay,timee_2.wHour,timee_2.wMinute,timee_2.wSecond);
獲取系統時間
SYSTEMTIME time; ::GetLocalTime(&time);
日曆控制元件(Month Calender)
如下圖,看似與真正的日曆類似,操作也類似,直觀的為使用者提供了觀察和顯示當前日期的途徑。MFC提供了CMonthCalCtrl類進行支援。
IP地址控制元件(IP Adress)IP地址控制元件用來輸入和編輯IP地址,MFC提供了CIPAddressCtrl類進行支援。
該控制元件外觀類似於一個編輯框,但是可以自動對輸入的字元按3個一組進行區分和加間隔圓點。IP地址控制元件為開發支援Internet技術的程式提供了方便。
擴充套件組合框(Extended Combo Box)在普通組合框(Combo Box)的基礎上還支援影象列表。
可以在組合框中顯示特定的圖標表示相應的選擇,而不僅僅是顯示文字。
MFC提供了CComboBoxEx類進行支援。
使用者自定義控制元件(Custom Control)控制元件使用的時候,它的Class必須有一個類的支援這個視窗類可以VC的類,例如:Button、Edit.在標頭檔案增加一個CEdit類的成員變數:CEdit m_Text(即點選右鍵新增變數),然後按照Edit控制元件使用即可。
超連結控制元件(SysLink Control ):1.用於在 MFC 應用程式上新增超連結,就像html中的超連結一樣。你點下可以連結到一個網頁上去。拖控制元件到頁面上,並繫結一個變數(m_linkCtrl),裡面的內容全部是按照標準的html中href的用法寫的。寫錯了自然連結不了的。
可以去瞧下html裡面的href屬性是怎/麼設定的.另外要注意的是字串中雙引號的處理(記得加個轉義符\),新增單擊響應訊息
網路IP地址輸入輸出控制元件(Network Address Control):可以直接作為inet_addr(ip)的輸入,分隔符為逗號(,)
所有控制元件的公共屬性:ID:控制元件的資源標識。
Visiable:控制元件是否可見。
Disabled:控制元件是否被禁止、被禁止的控制元件無法接受鍵盤和滑鼠輸入。
Group:是否從這個空間開始一個新組。
Tab stop:在程式中是否可以用【Tab】鍵切換到這個控制元件。
Help ID:是否給控制元件分配一個幫助標識,幫助標識基於控制元件本身的資源標識。
Client edge:給控制元件增加一個凹陷的邊界,使整個控制元件看起來像是凹下去的一樣。
Static edge:給控制元件增加一個邊界。
Modal frame:給控制元件增加一個3維的框架,與Client edge相反,它是凸出來的。
Transparent:擁有此屬性的視窗是透明的,它下面的視窗不會被它遮掩住。
Accept files:擁有此屬性的視窗可以接收拖放檔案,如果一個檔案被拖動到這個控制元件上面,控制元件會收到WM_DROPFILES訊息。
No parent notify:表示控制元件不向其父視窗傳送WM_PARENTNOTIFY訊息。
Right aligned text:表示文字右對齊。
以上屬性可透過控制元件的屬性對話方塊進行設定,在屬性對話方塊中按【F1】鍵可以檢視屬性的幫助資訊。
每一種控制元件都由一個MFC控制元件類來管理,當透過資源編輯器在對話方塊上新增一個控制元件時,visualC++會自動為控制元件類生成一個例項,即物件,並呼叫建構函式,當對話方塊關閉時,其各個子控制元件物件被自動銷燬。
也可以不使用資源編輯器,自己在程式中寫程式碼建立、顯示控制元件並設定控制元件的屬性。
所有的控制元件類都來自CWnd,控制元件的某些操作和屬性設定需要用到CWnd本身的成員函式,CWnd某些函式經常用來操縱控制元件和設定控制元件屬性。
SetWindowText:設定控制元件上要顯示的標題文字,即用來設定控制元件的caption屬性
GetWindowText:得到控制元件的標題文字
EnableWindow:設定控制元件的Disabled屬性,即社會自控制元件是否可以接收鍵盤和滑鼠的輸入
SetWindowPos:改變視窗的大小、位置和Z軸次序。
MoveWindow:改變視窗的大小和位置
GetWindowRec:得到視窗的大小、位置(資訊存放在一個矩形結構中)。
GetClientRect:得到視窗客戶區的大小(資訊存放在一個矩形結構中 )
ShowWindow:設定視窗的可見性(即視窗是否可見)
SetWindowText/GetWindowText還可以用來設定/得到對話方塊的標題文字。
福利來啦~