Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
isual c++ 提 供 了 功 能 強 大 的 類 庫, 基 本 上 應 用 開 發 的 要 求, 但 對 于 某 些 特 殊 要 求 的 界 面, 如 圖 像 兼 文 字 的 按 紐, 列 表 框 中 插 入 圖 像, 中 國 式 報 表 等 等, 仍 顯 得 力 不 從 心, 因 而 很 有 必 要 創 建 擴 展MFC 類 庫, 以 滿 足 實 際 開 發 的 需 求。But,Toolkit Pro 是MFC開發中最全面界面控件套包,它提供了Windows開發所需要的11種主流的Visual C++ MFC控件。 根據需要可進行下載體驗!
本文通過實例說明MFC工具欄的創建、設計和使用方法,包括三個demo。
demo1:創建一個工具欄
C++代碼
//摘抄自MSDN
demo1 (創建一個工具欄)
1.Create a toolbar resource.
/*可以先插入一個新的工具欄資源
添加分隔符,將按鈕向右拖動一小下
刪除按鈕,將按鈕拖動出工具欄
*/
2.Construct the CToolBar object.
/*
工具欄是 CToolBar 對象,聲明為應用程序的 CMainFrame 類的數據成員。也就是說,工具欄對象嵌入到主框架窗口對象中。這意味著 MFC 在創建框架窗口時創建工具欄,在銷毀框架窗口時銷毀工具欄。
*/
3.Call the Create (or CreateEx) function to create
the Windows toolbar and attach it to the CToolBar object.
4.Call LoadToolBar to load the toolbar resource.
/*
工具欄創建發生在 CMainFrame::OnCreate 中。MFC 在創建框架窗口之后且在窗口可見之前調用 OnCreate。
在 OnCreate 中調用適當的函數來停靠或浮動工具欄、設置它的樣式等。
應用程序向導”生成的默認 OnCreate 執行以下工具欄任務:
1.調用 CToolBar 對象的 Create 成員函數來創建基礎 CToolBarCtrl 對象。
2.調用 LoadToolBar 來加載工具欄資源信息。
3.調用函數來啟用停靠、浮動和工具提示。
*/
class CMainFrame : public CMDIFrameWnd
{
// ...
// Implementation
// ...
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
// Generated message map functions
protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
DECLARE_MESSAGE_MAP()
};
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//框架類中m_wndMyToolBar成員變量先調用CreateEx函數,再調用LoadToolBar函數
if (! m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
! m_wndToolBar.LoadToolBar(IDR_MYTOOLBAR))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
//調用CToolBar中的成員函數設置工具欄可停靠的位置
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
//調用框架類中的成員函數設置哪里可以被停靠
EnableDocking(CBRS_ALIGN_ANY);
//Points to the control bar to be docked.
DockControlBar(&m_wndToolBar);
return 0;
}
demo2:停靠和浮動工具欄
C++代碼
demo2 (停靠和浮動工具欄)
/*
如果使用“應用程序向導”來生成應用程序的主干,向導將要求您選擇是否想要可停靠的工具欄。
默認情況下,“應用程序向導”生成代碼來執行將可停靠工具欄放置在應用程序中所需的三個操作:
1.在框架窗口中啟用停靠。
2.為工具欄啟用停靠。
3.停靠工具欄(靠向框架窗口)。
如果這些步驟中的任何一個缺少,應用程序都將顯示標準工具欄。
后兩個步驟對應用程序中的每一個可停靠工具欄都必須執行。
*/
CFrameWnd::EnableDocking()//在框架窗口中啟用停靠
/*
若要將工具欄停靠到某個框架窗口,則必須啟用該框架窗口(或目標)以允許停靠。
這可通過使用 CFrameWnd::EnableDocking 函數來實現,該函數采用一個 DWORD 參數,這是一組指示框架窗口的哪一個邊接受停靠的樣式位。
如果一個工具欄即將停靠并且有多個邊可以停靠,則在傳遞給 EnableDocking 的參數中指示的邊按以下順序使用:頂邊、底邊、左邊、右邊。
如果希望能夠將控制條停靠在任意位置,請將 CBRS_ALIGN_ANY 傳遞給 EnableDocking。
*/
CControlBar::EnableDocking()//為工具欄啟用停靠
/*
準備好停靠目標后,必須以相似的方式準備工具欄(或源)。為想要停靠的每一個工具欄調用 CControlBar::EnableDocking,指定工具欄應停靠的目標邊。如果在 CControlBar::EnableDocking 調用中所指定的邊沒有一個與框架窗口中為停靠啟用的邊匹配,則工具欄無法停靠(它將浮動)。
工具欄一旦浮動,將保持為浮動工具欄,不能停靠到框架窗口。
如果希望工具欄永久浮動,請調用參數為 0 的 EnableDocking。然后調用 CFrameWnd::FloatControlBar。工具欄將保持浮動,永遠不能在任意位置停靠。
*/
CFrameWnd::DockControlBar()//停靠工具欄
/*
當用戶試圖將工具欄放置在允許停靠的框架窗口某一邊時,框架調用 CFrameWnd::DockControlBar。
另外,可以隨時調用該函數將控制條停靠在框架窗口中。這通常在初始化過程中完成。
框架窗口的具體某個邊上可停靠多個工具欄。
*/
CFrameWnd::FloatControlBar()//浮動工具欄
/*
從框架窗口分離可停靠工具欄稱為浮動工具欄。調用 CFrameWnd::FloatControlBar 來執行該操作。指定要浮動的工具欄、將放置的點以及決定浮動工具欄是水平還是垂直的對齊樣式。
當用戶拖動工具欄離開停靠位置并將它放置在一個未啟用停靠的位置時,框架調用該函數。
這可以是框架窗口的內部或外部的任意位置。同 DockControlBar 一樣,也可以在初始化過程中調用該函數。
可停靠工具欄的 MFC 實現不提供一些支持可停靠工具欄的應用程序中有的擴展功能。諸如可自定義工具欄這樣的功能不提供。
*/
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//...
//部分代碼略
//...
//調用CToolBar中的成員函數設置工具欄可停靠的位置
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
//調用框架類中的成員函數設置哪里可以被停靠
EnableDocking(CBRS_ALIGN_ANY);
//Points to the control bar to be docked.
DockControlBar(&m_wndToolBar);
return 0;
}
demo3:點擊菜單項顯示和隱藏工具欄
C++代碼
demo3 (點擊菜單項顯示和隱藏工具欄)
CFrameWnd::ShowControlBar//顯示和隱藏菜單項
void ShowControlBar( CControlBar* pBar, BOOL bShow, BOOL bDelay );
void CMainFrame::OnViewNewtool()
{
ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE);//控制顯示和隱藏
}
void CMainFrame::OnUpdateViewNewtool(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());//為菜單項打標記
}
MFC擴展類庫
在平時練習的時候我們可以自己手動進行,但是一旦接受一些項目,應用程序開發等,對界面的要求就會高出許多。這時候就有必要借助這些“半成品”實現界面美化提升效率。這里簡單介紹一下,具體可點進去查看每個的詳情以及教程,案例!
Toolkit Pro:
Codejock軟件公司的Xtreme Toolkit Pro是屢獲殊榮的VC界面庫,是MFC開發中最全面界面控件套包,它提供了Windows開發所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
BCGControlBar ("Business Components Gallery ControlBar")是MFC擴展庫,使您可以創建具有完全自定義選項(功能區、可自定義工具欄、菜單等)以及一組專業設計的豐富Microsoft Office和Microsoft Visual Studio的應用程序 GUI控件,例如圖表、日歷、網格、編輯器、甘特圖和許多其他控件。
BCGControlBar庫擁有500多個經過全面設計、測試和充分記錄的MFC擴展類。可以輕松地集成到你的應用程序中,并為你節省數百個開發和調試時間。
轉載自:http://www.jizhuomi.com/software/494.html
關注我或者點擊下方“了解更多”獲取一手開發資訊哦!
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.
VC++控件工具箱:
用來接收用戶的命令,應用程序在接收到用戶命令后,通常需要進行一些后臺工作。按鈕可以響應單擊或雙擊動作,在按鈕接收到鼠標動作后,向其父窗口發送相應的控件通知,用戶可以對這些控件通知進行消息映射,從而進行相應的處理。
在一個對話框中,可以定義一個默認按鈕,這只要選中按鈕屬性中的“Default”選項。如果在對話框活動的時候按下了Enter鍵,則等同于單擊了默認按鈕。MFC提供了CButton類支持按鈕控件。
用來顯示某種可能的選擇,該項選擇是獨立的,用戶可以選中或取消該選項。在選項被選中的時候核選標記出現,選項被取消時核選標記消失。MFC中由CButton類對核選框進行支持,用戶可以通過SetCheck()函數和GetCheck()函數設置或獲取核選框當前的狀態。
BST_UNCHECKED==((CButton*)GetDlgItem(IDC_CHECK_RES1))->GetCheck()
((CButton*)GetDlgItem(IDC_CHECK_RES1))->SetCheck(true);
用來接收用戶輸入的字符串。通過選擇編輯框的選項,編輯框可以接收字符串、數字、密碼等;編輯框還可以設置成接收多行字符串的模式;可以自動進行大小寫轉換。編輯框可能向父窗口發送多種控件通知,如果用戶需要,可以對這些控件通知進行處理。MFC提供了CEdit類支持編輯框控件。
GetDlgItem(IDC_***)->SetWindowText(Cstring);
GetDlgItem(IDC_***)->GetWindowText(Cstring);
列表框和編輯框的組合,用戶除了可以在列表中對已經存在的選項進行選擇外,還可以輸入新的選擇。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("***"))
用來選擇一系列的可能選擇,用戶通過滾動條可以在這些選擇中瀏覽。在列表框中,可以進行單項選擇,也可以進行多項選擇,這取決于用戶在控件屬性對話框中的設置。MFC提供了CListBox類對列表框控件進行支持。
用來包圍具有邏輯關系的一組控件,在這些控件的周圍加上邊界和標題。需注意的是,組成框僅僅是在視覺效果上對控件進行“成組”,真正的“成組”工作還需要另外一些工作。僅僅在視覺上展現出一組的邏輯關系,并不添加任何代碼
用來選擇某種可能的選擇,與 (Check Box)復選框不同,該選項不是獨立的。
一般是幾個單選按鈕組成一組,同組中的單選按鈕僅有一個按鈕被選中。
MFC同樣使用CButton類對單選按鈕控件進行支持,
SetCheck()函數和GetCheck()函數對單選按鈕也是適用的。
用來在指定的位置顯示特定的字符串,一般用來標識附近另一個控件的內容。顯示在靜態文本控件中的字符串一般不再改變,但是在需要的時候,必須為其指定一個不同食物ID號,通過調用相應的函數來進行設置。MFC提供了CStatic類支持靜態控件。
顯示位圖(Bitmap)和圖標(Icon),圖形繪制與顯示,主要是其方形的區域適合顯示,同樣方形區域也可利用(Static Text)靜態文本框。
這包括水平滾動條和垂直滾動條,除了在視覺效果上的方向不同外,水平滾動條在被滾動時發生WM_HSCROLL消息,而垂直滾動條在被滾動時發送WM_VSCROLL消息。MFC提供了CScrollBar進行支持。
通常用來在程序中接受一系列離散的數值。
用戶可以設置滑塊控件的取值范圍,并可以為控件加上刻度標記以顯示特定位置的含義。
MFC提供了CSliderCtrl類進行支持。
包括一對緊靠在一起的上下箭頭,使用微調按鈕可以增大或者縮小某個特定的數值。
微調按鈕往往都需要一個“伙伴”控件,這通常都是一個編輯框。
當微調按鈕的向上箭頭被單擊時,編輯框中的數字就增大;反之則減小。MFC提供了CPinButtonCtrl類進行支持。
在進行一項需要較長時間的操作時來反應當前的進度。
當操作的進度不斷前進時,進度條就用特色顏色填充進度條框。用戶可以設定進度條的范圍和當前位置。
MFC提供了CProgressCtrl類進行支持。
CProgressCtrl* progressbar = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS_1);
progressbar->SetRange(0, 4);
progressbar->SetPos(0);
熱鍵控件看起來就像一個編輯框,但是在熱鍵控件中能夠立刻反應用戶剛剛按下的鍵組合,這在設置程序的熱鍵時特別有用。
熱鍵控件只是在“視覺”上顯示了按鍵組合,設置熱鍵的工作還需要用戶添加代碼完成。
MFC提供了CHotKey類進行支持。
按一定的排列順序顯示一系列帶圖標的字符串。
列表控件提供了四種顯示模式:大圖標(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 ++;
顯示一系列項目的層次關系,最典型的例子是顯示磁盤上的文件與文件夾。
如果有子項目的話,單擊樹形控件中的項目可以展開或者收縮其子項目。
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); } }
包含大量的控件,可以滿足用戶顯示或者獲取大量數據分類顯示的要求,典型例子是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;
}
用來播放一段AVI格式的視頻剪輯。用戶可以控制視頻剪輯的播放、停止和定位,但也僅限于這些功能。動畫控件設置不能播放音頻剪輯,如果用戶需要更高層次的視頻或者音頻的支持,請選用MCIWnd控件。
MFC提供了CAnimateCtrl類對動畫控件進行支持。
編輯控件(Edit Control)功能的擴展。在高級編輯框中,除了簡單的輸入和編輯字符串外,用戶還可以為字符或段落指定特定的格式,用戶甚至還可以向高級編輯框中插入OLE項。
高級編輯框基本上實現了一個帶格式的文本編輯器功能,而只需要用戶添加少量的接口。
MFC提供了CRichEditCtrl類進行支持。
向用戶提供了一種直觀的選擇日期和時間的方法、日期/時間選擇器在外觀上類似于一個組合框,但是當用戶單擊下拉箭頭時就會展開一個日歷控件供用戶選擇,而一旦用戶做出了選擇,日期/時間選擇器會自動顯示新的日期/時間。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);
如下圖,看似與真正的日歷類似,操作也類似,直觀的為用戶提供了觀察和顯示當前日期的途徑。MFC提供了CMonthCalCtrl類進行支持。
IP地址控件用來輸入和編輯IP地址,MFC提供了CIPAddressCtrl類進行支持。
該控件外觀類似于一個編輯框,但是可以自動對輸入的字符按3個一組進行區分和加間隔圓點。IP地址控件為開發支持Internet技術的程序提供了方便。
在普通組合框(Combo Box)的基礎上還支持圖像列表。
可以在組合框中顯示特定的圖標表示相應的選擇,而不僅僅是顯示文本。
MFC提供了CComboBoxEx類進行支持。
控件使用的時候,它的Class必須有一個類的支持這個窗口類可以VC的類,例如:Button、Edit.在頭文件增加一個CEdit類的成員變量:CEdit m_Text(即點擊右鍵添加變量),然后按照Edit控件使用即可。
1.用于在 MFC 應用程序上添加超鏈接,就像html中的超鏈接一樣。你點下可以鏈接到一個網頁上去。拖控件到頁面上,并綁定一個變量(m_linkCtrl),里面的內容全部是按照標準的html中href的用法寫的。寫錯了自然鏈接不了的。
可以去瞧下html里面的href屬性是怎/么設置的.另外要注意的是字符串中雙引號的處理(記得加個轉義符\),添加單擊響應消息
m_linkCtrl.SetWindowTextW(_T("<a href=\"http://blog.csdn.net/miko_xiaoming\">Miko's Note</a>"));
PNMLINK pNMLink = (PNMLINK) pNMHDR;
ShellExecuteW(NULL, L"open", pNMLink->item.szUrl, NULL, NULL, SW_SHOWNORMAL); //在瀏覽器中打開
2.同按鈕(Button)控件一樣,響應相應的消息
如下圖,實現多選按鈕選擇功能,使用時添加相應菜單
可以直接作為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還可以用來設置/得到對話框的標題文本。
福利來啦~
學習從來不是一個人的事情,要有個相互監督的伙伴,對于C/C++感興趣可以關注小編在后臺私信我:【編程交流】一起來學習哦!可以領取一些C/C++的項目學習視頻資料哦!
T之外,畫畫也是我的一大愛好。
在當今基于C++的圖形界面開發領域,能與Qt相抗衡的也只有MFC,MFC是微軟公司的基礎類庫,自然得天獨厚,比如開發深層次的Windows應用,MFC當然遠超Qt,但Qt也有殺手锏,那就是跨平臺。這兩點大家一目了然。下面我們再來比較它們的其他特點。
(1)開發速度
就整體而言,MFC可能會快捷一些,因為Windows平臺的開發工具大多很智能,因為立足于Windows的開發人群很廣,從菜鳥到專業人士(開發人員一多,技術參考就多,周圍可以咨詢問題的人就多)。相比較而言,Qt基于Linux,可用的開發工具不多,而且這些工具大都比較專業,多是第三方的產品,加上這些工具的集成度不高,支持的第三方庫也沒有支持MFC的第三方庫多,因而從這一點看,MFC略勝一籌。不過,Qt自從被諾基亞公司收購后,官方發布了跨平臺集成開發環境Qt Creator,之后的走向就不好說了,作者個人的總體感覺是Qt Creator和VS差距比較大,還需要改進。
從庫本身來說,Qt集成的功能比MFC龐大,而且使用的封裝技術(信號/槽)倍受贊許,比如Qt Script為Qt提供了嵌入式腳本,Qt界面庫支持CSS,所以Qt構建出來的界面比MFC要好,且實現過程也比較容易。為了降低使用Windows SDK開發的難度以及提高使用Windows SDK開發的效率,MFC采用的是淺層封裝(最新的2008 sp1加入了BCG的高級界面庫,可能有所改善)Windows SDK。這個方面相比而言,Qt庫比MFC優秀。不過,這兩個庫都久經時間的考驗,穩定性都很高,幾乎沒有什么Bug。
(2)運行效率
MFC采用淺層封裝,運行效率比較高,加上VC對Windows進行了針對性的優化,因而整體性能是比較高的,但是如果加入第三方庫就不敢保證整體的高性能了。Qt庫比較龐大,封裝層次較深,所以運行效率比MFC低,但是在如今主流計算機系統的配置下,人們還會介意這點性能差別嗎?(反正大家都不介意C#對性能略微拉低的影響了。)
(3)應用范圍
如今Windows的普及率無人能及,MFC的使用人數自然就多,相比而言,Qt主要是Linux下的開發人員在使用。MFC不支持嵌入式開發(主要是指手機平臺),而Qt有對應的支持模塊,雖然這一手機開發領域被Java碾壓,但總歸還是有Qt的使用空間。
(4)學習難度
Qt的封裝方式比較明晰,和系統隔離得比較好,作者個人覺得學習的門檻不高。而MFC則較難精通,因為深入開發之后還需要了解SDK,否則開發出的程序比較初級。
(5)偽對象vs真對象
歸根結底,Qt和MFC的差異在于其設計的差異。MFC的根本目的是讓開發者調用封裝好的、用C語言編寫的Windows API。但是,這絕非好的面向對象的程序設計模式,因為在很多場合,我們必須提供一個包含15個結構成員的C語言的struct(結構類型),但是其中只有一個結構成員是我們需要使用的,或者必須用在調用函數中使用參數的方式來獲得我們需要的結構成員。MFC還有許多讓人摸不著頭腦的地方,例如函數名沒有任何連續性,假如我們創建了一個graphical類,直到調用了creat()以后該類才會被創建。然而對于dialogs類,必須要等到調用OnInitDialog()才能創建這個類的實例對象。奇怪的是到了views,創建該類的函數名竟然成了OnInitUpdate(),使用VC/MFC中的庫函數調用總是要十分小心,不如Qt那樣一看函數名就知道對應函數的作用是什么。
(6)消息循環
MFC是事件驅動的架構。必須對任何操作對應的特定消息做出響應。Windows中應用程序發送的信息數以千計,遺憾的是,要厘清這些紛繁蕪雜的消息很困難,通過參考這方面的文檔資料并不能很好地解決這些問題。
Qt的消息機制建立在SIGNAL()發送和SLOT()接收的基礎上。這個機制是對象間建立聯系的核心機制。利用SIGNAL()可以傳遞任何參數,它的功能非常強大,可以直接傳遞信號給SLOT(),因此可以清楚地理解要發生的事情。一個類所發送的信號數量通常非常少(4個或者5個),相關的幫助文檔資料也非常齊全。這讓我們會覺得到一切盡在掌握之中。信號/槽(Signal/Slot)機制類似于Java中的listener機制,不過這種機制更加輕量級,功能更齊全。
(7)創建界面
MFC無法創建大小動態可變的子窗口 ,必須重新手動修改代碼來改變窗口的位置(這恰好解釋了為什么Windows里的對話框dialog是不可以改變的),這個問題在軟件進行多語言化版本設計時更加嚴重,因為許多國家或地區在表達相同意思時可能需要更長的詞匯和句子,于是軟件開發者必須對每種語言的版本重新修改自己的軟件。
在Qt中,界面需要的任何設計都可以手動編寫出來,因為它很簡單:為了得到一個按鈕(button),可以將代碼寫為“button = new PushButton( "buttonName", MyParentName );”,如果想在按下某個按鈕以后調用某段執行代碼,則可以編寫為“connect(button, SIGNAL(clicked()), qApp, SLOT(action()));”。Qt擁有非常簡單而又不失強大的設計機制,不使用它實在可惜。
Qt還提供了一個圖形用戶工具——Qt Designer,可以用來協助建立用戶界面。可以使用Qt Designer修改所使用的任何控件的屬性,不用將這些控件拖放到設計嚴格限定的位置,因為可以通過設計機制更完美地組織這些控件。
Qt Designer這個工具所生成的代碼可閱讀、可理解。所生成的代碼單獨放在一個文件中,在編程的同時,我們可以隨心所欲地多次重新生成用戶界面。
Qt Designer可以讓我們完成許多在MFC中不可能完成的任務,比如用預先填好的內容生成列表視圖(listview),在每個頁簽(tab)上使用不同的視圖(view)。
(8)幫助文檔
用戶選擇圖形開發環境的時候,幫助文檔是否周全是左右用戶選擇圖形開發環境的重要因素。Visual開發環境的幫助文檔MSDN(這個還要單獨掏錢購買)非常龐大,有10個CD-ROM光盤容量之大,它包羅萬象,涵蓋廣泛,但難免有泥沙俱下、主題模糊、關鍵信息不突出的遺憾。MSDN的鏈接設計也很糟糕,通過鏈接很難從一個類跳轉到它的父類或者子類以及相關的類。如果搜索一個關鍵字,結果找到的內容不管是否直接關聯,只要包含這個關鍵字的信息統統都會搜索出來,讓用戶再從中選擇。
Qt的文檔設計得相當優秀,可以到https://doc.qt.io/上面一睹它的芳容。Qt的文檔完備且詳細地覆蓋了Qt的方方面面,然而文檔的整體容量竟然僅有18MB。其中每一個類和方法都被詳盡描述,巨細靡遺,舉例充實。通過Trolltech公司提供的鏈接或者是Qt Assistant工具可以方便地從一個類或者方法跳轉到其他的類。文檔還包含了一個初學者教程和一些典型應用的例子。同時還提供了FAQ和郵件列表,方便用戶通過用戶群或通過Internet來查閱。如果我們購買了授權,在一天之內就會得到Trolltech公司的技術支持。實際上,Qt優秀的幫助文檔使得尋求外部幫助的機會大大減少。Trolltech公司的宗旨之一是:有如此優秀的Qt產品及其幫助文檔,其他外部的技術支持就是多余的。
總之,MSDN用熟了也很好用、很全面,相關的背景知識、例子都能找到,而且網上還有豐富的范例程序可以參考。同樣的,僅憑Qt的幫助文檔也絕對不足以解決所有問題,以作者的親歷,在網上只找到了一個Qt中文論壇,提過幾個問題,有的問題給出了解決辦法,有的問題則沒人回答,最后還要靠自己試。
(9)Unicode編碼
使用MFC,如果要顯示Unicode編碼的字符,在編譯鏈接時必須用到特殊的參數(還要改變可執行文件執行的入口),必須在每個string前面加上T,將char修改成TCHAR,每個字符串處理函數(strcpy()、strdup()、strcat()等等)都要改變成另外的字符串處理函數名。更令人惱火的是,支持Unicode的軟件竟然不能和不支持Unicode編碼的DLL一起工作。這是一個很嚴重的問題,但是我們卻別無選擇。
使用Qt,字符串用QString類來處理,QString類與生俱來就采用Unicode編碼,因而不需要改變任何東西:不需要在編譯/鏈接時增添參數,不需要修改代碼,只需要使用QString類即可。QString類功能強大、應用廣泛,也不用擔心Unicode問題。QString類提供了轉換為char * 和UTF8的函數。MFC的CString類設計相比于Qt的QString類設計則有著巨大的不同,CString類以char *為基礎提供的功能很少,它的特點是當需要char *類型時,可以直接使用CString類。乍看起來這好像是個優點,實質上有很大缺陷,特別是可以直接修改char *內容而不用更新類,在轉變為Unicode時就會遭遇到很大的麻煩(CString類隨編譯選項可以是Unicode版)。相反,QString類在內部以Unicode編碼方式來存儲字符串,需要時提供char *功能,實際上很少用到char *,因為整個Qt的API用文本的方式響應QString參數。QString還附帶了許多其他的功能,比如自動分享QString的內容。總之QString是一個非常強大的類,需要用到它的地方很多。
(10)支持軟件的多語種功能
MFC可以支持軟件的多語種功能,需要將每一個語種的字符串放在一個字符串表中,在代碼中需要之處調用LoadString(IDENTIFIET),然后把這些字符串資源轉化到DLL中,這些字符串對應到所需要的語言,改變圖形界面,再通過程序調用這個DLL。整個過程是如此的煩瑣,可謂牽一發而動全身。
Qt支持軟件多語種的方式有所不同,只需要將字符串置于函數tr()中,可以直接在代碼中改變字符串的引用。Qt Linguist(Qt的一個工具)能夠提取所有待翻譯的字符串并按照對應語種的用戶界面顯示出來,這個工具非常適合進行用戶界面的多語種翻譯,它功能齊全:通過查詢字典數據顯示出對應語種的字符串內容,正確顯示出Unicode編碼,以快捷方式檢測出未翻譯的字符串,檢測字符串修改的情況。這個工具甚至可以提供給沒有任何編程經驗的翻譯人員用于翻譯軟件的用戶界面。該軟件的發布遵循GPL版權規則,開發者可以根據具體的開發需求來修改它。翻譯之后的文檔保存在XML中,符合軟件復用的原則。由此可見,為軟件增加一種新的語言版本僅僅是用Qt Linguist工具生成一個新的文件而已。
(11)資源問題
使用MFC時,一部分開發過程要依靠“資源”(resources),在很多的案例中開發者都必須使用它們。這樣會導致如下后果:除了Visual Studio,很難使用其他的工具來完成開發。資源編輯器僅有有限的功能,比如通過Dialog編輯器不能改變所有的屬性。
然而,Qt并沒有資源的概念,這就解決了MFC所遇到的問題。Qt提供了一個界面設計器以可視化的方式來設計界面,并把設計后生成的代碼存儲到一個腳本文件中。
(12)價格
用戶一旦購買了Visual Studio,將免費獲得MFC SDK。Qt在UNIX上可以免費獲得遵守GPL版權規則的版本(現在可以免費獲得Windows平臺上的GPL版本)。如果要開發不公開源代碼的軟件,則必須購買Qt的授權。在特定平臺下,每個開發者購買一個永久性授權,并可獲得一年的技術支持。
(13)發布
在發布基于MFC的軟件時,必須依靠存儲在客戶計算機上的MFC,但是這是不安全的,同樣是MFC42.dll,基于相同的庫可得到3個不同的版本。因而需要檢查是否擁有正確的MFC42.dll版本,如果版本不對,就升級它。但是,升級MFC42.dll會改變很多軟件的行為。這讓開發者感到很不“爽”,如果用戶在安裝軟件以后導致用戶的計算機死機了,該怎么辦呢?
Qt則沒有這個風險,因為Qt壓根就沒有“升級整個系統”的概念。不過,如果開發的軟件不是基于同一個版本的Qt來運行,還是會有潛在的問題。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。