1、在網頁中將滑鼠停在圖像上會出現:保存此圖像,列印此圖像四個選項的程序是什麼
LZ好,利用Visual C++打造自己的IE瀏覽器
IE瀏覽器作為微軟Windows系統捆綁銷售的一個瀏覽工具,用來瀏覽千姿百態的網頁,目前它已經占據了瀏覽器市場的半壁江山,成為Windows用戶不可或缺的工具。首先,它的界面設計的很漂亮,如扁平按紐(按鈕上的圖像為灰色,當滑鼠放在按鈕上時,按鈕突起,這種狀態稱為手柄,並且其上的圖像變得鮮艷醒目)、按鈕上的文字說明以及按鈕邊上的小黑三角形狀的下拉箭頭(單擊時顯示下拉菜單)、工具條上的地址輸入欄等,都體現了Windows2000的風格;其次,它的收藏欄可以收藏用戶喜愛的網路地址,這一切都為IE的流行打下了堅實的基礎。說了那麼多,也許讀者朋友們感覺到IE實現起來一定非常困難,其實IE也是個"紙老虎",實現它的難點主要是在界面效果和顯示收藏夾上,筆者在本實例中有針對性的敘述了IE界面、收藏網頁的顯示、網頁的瀏覽等功能的實現,仔細看過這篇文章後,相信讀者朋友們一定可以打造出一個屬於自己的瀏覽器。本實例中的程序代碼編譯運行後的界面效果如圖一所示:
圖一、瀏覽器的運行界面
一、實現方法
1、瀏覽器的界面實現
首先啟動Visual C++6.0,生成一個名為mfcie單文檔項目,注意在此過程中不要選擇工具條和狀態條選項,這樣才能更方便我們在後續工作中用代碼實現Windwos2000風格的工具條、狀態條;在工具條中添加地址欄;項目的視圖類的基類設置為ChtmlView,該類的Navigate2()成員函數專門用來現實超文本格式的文檔。在主框架類CmainFrame中定義CStatusBar m_wndStatusBar(狀態條對象)、CToolBar m_wndToolBar(工具欄對象)、CReBar m_wndReBar(、CComboBoxEx m_wndAddress(擴展的組合框對象,用來作為地址欄)、CAnimateCtrl m_wndAnimate(動畫控制項,用來在工具欄上顯示動畫)、圖像列表對象CImageList img(存放顯示在工具欄上的圖標)等對象。向當前項目AVI資源文件,ID標志IDR_MFCAVI,添加Bitmap(點陣圖)資源,ID標志分別為IDB_COLDTOOLBAR、IDB_HOTTOOLBAR,分別如下所示:
圖二、包含按鈕圖標的點陣圖
1)IE風格工具條
IE風格界面的實現主要在主框架類的CMainFrame::OnCreate()函數中實現,它的主要思想如下: CReBar對象用來作為工具條、地址欄、動畫控制項的容器,CImageList對象然後分別裝載工具欄上按鈕的熱點圖像和正常狀態下顯示的圖像,並將該對象附給工具條對象,使之建立關聯。為了顯示扁平工具欄,需要用CreateEx()函數創建CToolBar對象m_wndToolBar,用ModifyStyle()函數將工具欄的風格設為扁平類型,注意這里不能用CToolBar::Create() 或 CToolBar:: SetBarStyle()設置這種新風格。CToolBar 類不支持TBSTYLE_FLAT,要解決這個問題,必須繞過CToolBar類,使用CWnd::ModifyStyle()。要將某一個工具欄按鈕設置為附帶有下拉按鈕,可以調用SetButtonInfo()設置按鈕的風格為TBSTYLE_DROPDOWN。至於按鈕帶有中文提示,用工具欄的SetButtonText()就可以輕松實現了。下面是實現IE風格界面的代碼和注釋:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CImageList img; //圖像列表對象;
CString str; //字元串對象;
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndReBar.Create(this)) //創建CReBar對象;
{ TRACE0("Failed to create rebar\n");
return -1; }
if (!m_wndToolBar.CreateEx(this)) //使用CreateEx()函數創建工具條對象;
{ TRACE0("Failed to create toolbar\n");
return -1; }
//設置工具欄中的按鈕最大最小尺寸;
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50, 150);
//設置工具欄上的按鈕支持下拉箭頭風格;
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//向圖像列表裝載熱點圖像資源,IDB_HOTTOOLBAR為熱點圖像資源ID img.Create(IDB_HOTTOOLBAR, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
img.Detach();
//圖象列表裝載正常狀態的圖像資源,IDB_COLDTOOLBAR為圖像資源ID
img.Create(IDB_COLDTOOLBAR, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
img.Detach();
//設置工具條為扁平風格
m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT);
//設置工具條上的按鈕個數為9個;
m_wndToolBar.SetButtons(NULL, 9);
// 裝載字元串資源,設置按鈕上的文本和按鈕的標識號;
m_wndToolBar.SetButtonInfo(0, ID_GO_BACK, TBSTYLE_BUTTON, 0);
str.LoadString(IDS_BACK);
m_wndToolBar.SetButtonText(0, str);
m_wndToolBar.SetButtonInfo(1, ID_GO_FORWARD, TBSTYLE_BUTTON, 1);
str.LoadString(IDS_FORWARD);
m_wndToolBar.SetButtonText(1, str);
m_wndToolBar.SetButtonInfo(2, ID_VIEW_STOP, TBSTYLE_BUTTON, 2);
str.LoadString(IDS_STOP);
m_wndToolBar.SetButtonText(2, str);
m_wndToolBar.SetButtonInfo(3, ID_VIEW_REFRESH, TBSTYLE_BUTTON, 3);
str.LoadString(IDS_REFRESH);
m_wndToolBar.SetButtonText(3, str);
m_wndToolBar.SetButtonInfo(4, ID_GO_START_PAGE, TBSTYLE_BUTTON, 4);
str.LoadString(IDS_HOME);
m_wndToolBar.SetButtonText(4, str);
m_wndToolBar.SetButtonInfo(5, ID_GO_SEARCH_THE_WEB, TBSTYLE_BUTTON, 5);
str.LoadString(IDS_SEARCH);
m_wndToolBar.SetButtonText(5, str);
m_wndToolBar.SetButtonInfo(6, ID_FAVORITES_DROPDOWN,TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 6);
str.LoadString(IDS_FAVORITES);
m_wndToolBar.SetButtonText(6, str);
m_wndToolBar.SetButtonInfo(7, ID_FILE_PRINT, TBSTYLE_BUTTON, 7);
str.LoadString(IDS_PRINT);
m_wndToolBar.SetButtonText(7, str);
m_wndToolBar.SetButtonInfo(8, ID_FONT_DROPDOWN, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 8);
str.LoadString(IDS_FONT);
m_wndToolBar.SetButtonText(8, str);
// 設置工具欄上的按鈕尺寸和顯示在按鈕上的圖標尺寸;
CRect rectToolBar;
m_wndToolBar.GetItemRect(0, &rectToolBar);
m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(30,20));
//創建組合框,用來作為地址欄;
if (!m_wndAddress.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, AFX_IDW_TOOLBAR + 1))
{ TRACE0("Failed to create combobox\n");
return -1; }
//創建動畫控制項對象,並打開AVI資源IDR_MFCAVI;
m_wndAnimate.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 10, 10), this, AFX_IDW_TOOLBAR + 2);
m_wndAnimate.Open(IDR_MFCAVI);
//將工具條、地址欄、動畫控制項等添加到CReBar對象中;
m_wndReBar.AddBar(&m_wndToolBar);
m_wndReBar.AddBar(&m_wndAnimate, NULL, NULL, RBBS_FIXEDSIZE | RBBS_FIXEDBMP);
str.LoadString(IDS_ADDRESS);
m_wndReBar.AddBar(&m_wndAddress, str, NULL, RBBS_FIXEDBMP | RBBS_BREAK);
//再次設置工具條風格,使之有工具欄提示功能;
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);
//設置狀態條;
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))
{ TRACE0("Failed to create status bar\n");
return -1; }
…….//實現"Favorites"菜單的部分,該部分在第二部分介紹;
return 0;
}
2)工具條上的下拉菜單
當用戶點擊按鈕上的下拉箭頭時,將出現相應的菜單,為了實現這個功能,首先需要在CMainFrame.cpp文件的消息映射中添加消息映射:ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDown);在CmainFrame.h文件中添加消息映射函數聲明:afx_msg void OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult);最後添加下面的代碼:
void CMainFrame::OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult)
{
NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNotifyStruct;
CRect rect;
// 得到下拉箭頭的位置;
m_wndToolBar.GetToolBarCtrl().GetRect(pNMToolBar->iItem, &rect);
rect.top = rect.bottom;
::ClientToScreen(pNMToolBar->hdr.hwndFrom, &rect.TopLeft());
if(pNMToolBar->iItem == ID_FONT_DROPDOWN)
//判斷是否為選擇字體的下拉箭頭;
{
CMenu menu;
CMenu* pPopup;
menu.LoadMenu(IDR_FONT_POPUP);
pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left, rect.top + 1, AfxGetMainWnd());
}
else if(pNMToolBar->iItem == ID_FAVORITES_DROPDOWN)
{//判斷是否為顯示收藏網頁的下拉箭頭;
CMenu* pPopup;
pPopup = GetMenu()->GetSubMenu(3);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left,
rect.top + 1, AfxGetMainWnd());
}
*pResult = TBDDRET_DEFAULT;
}
3)工具條上的動畫實現
為了美化程序的界面,程序的復合工具條上放置了一個動畫控制項,用來在適當的時機播放一個動畫片段,實現動畫效果。下面的代碼實現了創建動畫控制項對象,並打開AVI資源IDR_MFCAVI:
m_wndAnimate.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 10, 10), this, AFX_IDW_TOOLBAR + 2);
m_wndAnimate.Open(IDR_MFCAVI);
CanimateCtrl類提供了Play()、Seek()、Stop()、Close()等函數用來為播放視頻文件服務,它們使用起來都非常簡單,這里就不再贅述了。
4)地址欄的操作
當用戶在地址欄上輸入網頁地址並按下回車鍵後,瀏覽器將顯示該網頁的內容,並將在地址欄中記錄下該地址。因為回車鍵按下後對應的消息ID為IDOK,為此,需要在CmainFrame類中添加消息映射ON_COMMAND(IDOK, OnNewAddressEnter)和消息響應函數afx_msg void OnNewAddressEnter()。該函數實現代碼如下:
void CMainFrame::OnNewAddressEnter()
{
CString str;
//獲取地址欄中的字元串;
m_wndAddress.GetEditCtrl()->GetWindowText(str);
((CMfcieView*)GetActiveView())->Navigate2(str, 0, NULL);//顯示該網頁;
//將該網址添加到地址欄對應的組合框中;
COMBOBOXEXITEM item;
item.mask = CBEIF_TEXT;
item.iItem = -1;
item.pszText = (LPTSTR)(LPCTSTR)str;
m_wndAddress.InsertItem(&item);
}
同理,還要在CmainFrame類中為地址欄(ID 為AFX_IDW_TOOLBAR + 1)添加消息映射ON_CBN_SELENDOK(AFX_IDW_TOOLBAR + 1,OnNewAddress)和消息響應函數OnNewAddress,用來處理用戶從地址欄組合框中選擇網址的操作,該函數的實現代碼如下:
void CMainFrame::OnNewAddress()
{
CString str;
m_wndAddress.GetLBText(m_wndAddress.GetCurSel(), str);
((CMFCIEView*)GetActiveView())->Navigate2(str, 0, NULL);
}
2、實現收藏菜單
一般IE的用戶都有個習慣,那就是將自己喜歡的網址保存起來,以方便今後快速的登陸,為了使我們的瀏覽器能夠顯示IE收藏過的網址,程序中設置了一個"Favorites"菜單,通過RegOpenKey()、RegQueryValueEx()等函數操作Windows的注冊表中的HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders項,將收藏的網址顯示到菜單上。為此,實例中定義了兩個函數,實現代碼如下所示:
TCHAR GetDir( ) //得到存放用戶收藏網址的目錄;
{
TCHAR sz[MAX_PATH];
TCHAR szPath[MAX_PATH];
HKEY hKey;
DWORD dwSize;
CMenu* pMenu;
// 得到"Favorites"菜單,並刪除空白的子菜單項;
pMenu = GetMenu()->GetSubMenu(3);
while(pMenu->DeleteMenu(0, MF_BYPOSITION));
// find out from the registry where the favorites are located.
if(RegOpenKey(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\
User Shell Folders"), &hKey) != ERROR_SUCCESS)
{
TRACE0("Favorites folder not found\n");
return 0;
}
dwSize = sizeof(sz);
RegQueryValueEx(hKey, _T("Favorites"), NULL, NULL, (LPBYTE)sz, &dwSize);
ExpandEnvironmentStrings(sz, szPath, MAX_PATH);
RegCloseKey(hKey);
Return szPath
}
int CMainFrame::BuildFavoritesMenu(LPCTSTR pszPath, int nStartPos, CMenu* pMenu)
{
CString strPath(pszPath);
CString strPath2;
CString str;
WIN32_FIND_DATA wfd;
HANDLE h;
int nPos;
int nEndPos;
int nNewEndPos;
int nLastDir;
TCHAR buf[INTERNET_MAX_PATH_LENGTH];
CStringArray astrFavorites;
CStringArray astrDirs;
CMenu* pSubMenu;
if(strPath[strPath.GetLength() - 1] != _T(』\\』))
strPath += _T(』\\』);
strPath2 = strPath;
strPath += "*.*";
// 掃描當前目錄,首先搜索*.URL文件,然後是可能含有*.URL文件的子目錄;
h = FindFirstFile(strPath, &wfd);
if(h != INVALID_HANDLE_VALUE)
{
nEndPos = nStartPos;
do
{
if((wfd.dwFileAttributes&
(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))==0)
{
str = wfd.cFileName;
if(str.Right(4) == _T(".url"))
{/*URL文件和INI文件格式類似,所以我們可以使用 GetPrivateProfileString() 來得到我們所需要的信息。*/
::GetPrivateProfileString(_T("InternetShortcut"), T("URL"),
_T(""),buf,INTERNET_MAX_PATH_LENGTH,
strPath2 + str);
str = str.Left(str.GetLength() - 4);
// 判斷是否已經重復;
for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
{
if(str.CompareNoCase(astrFavorites[nPos]) < 0)
break;
}
astrFavorites.InsertAt(nPos, str);//添加該字元串;
m_astrFavoriteURLs.InsertAt(nPos, buf);//保留相應的地址
++nEndPos;
}
}
} while(FindNextFile(h, &wfd));
FindClose(h);
// 將找到的項目添加到菜單中;
for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
{
pMenu->AppendMenu(MF_STRING | MF_ENABLED, 0xe00 + nPos, astrFavorites[nPos]);
}
// 搜索子目錄
nLastDir = 0;
h = FindFirstFile(strPath, &wfd);
ASSERT(h != INVALID_HANDLE_VALUE);
do
{
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{ //對目錄進行搜索;
if(lstrcmp(wfd.cFileName,_T(".")) == 0 || lstrcmp(wfd.cFileName, _T("..")) == 0)
continue;
for(nPos = 0 ; nPos < nLastDir ; ++nPos)
{
if(astrDirs[nPos].CompareNoCase(wfd.cFileName) > 0)
break;
}
pSubMenu = new CMenu;
pSubMenu->CreatePopupMenu();
// call this function recursively.
nNewEndPos = BuildFavoritesMenu(strPath2 + wfd.cFileName, nEndPos, pSubMenu);
if(nNewEndPos != nEndPos)
{
// 插入子菜單;
nEndPos = nNewEndPos;
pMenu->InsertMenu(nPos, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)pSubMenu->m_hMenu, wfd.cFileName);
pSubMenu->Detach();
astrDirs.InsertAt(nPos, wfd.cFileName);
++nLastDir;
}
delete pSubMenu;
}
} while(FindNextFile(h, &wfd));
FindClose(h);
}
return nEndPos;
}
3、顯示超文本
微軟ChtmView類的Navigate2函數可以實現超文本文件的顯示,GoBack()、GoForward()等函數可以分別實現網頁瀏覽的回退和前進操作。以響應"Favorite"菜單項為例,需要在程序的CmainFrame類中添加消息映射ON_COMMAND_RANGE(0xe00, 0xfff, OnFavorite)和消息響應函數OnFavorite,來響應ID為0xe00-0xfff范圍內的菜單單擊處理,具體實現代碼如下:
void CMainFrame::OnFavorite(UINT nID)
{
((CMFCIEView*)GetActiveView())->Navigate2(m_astrFavoriteURLs[nID-0xe00], 0, NULL);
}
二、編程步驟
1、 啟動Visual C++6.0,生成一個單文檔視圖結構的應用程序,將該程序命名為"mfcie",注意在生成項目的過程中不要選擇工具條和狀態條選項,項目的視圖類的基類設置為ChtmlView;
2、 按照上文中的說明,使用Class Wizard在程序的項目中添加相應的消息響應函數;
3、 向程序的項目中添加AVI、點陣圖資源;
4、 添加代碼,編譯運行程序。 415希望對你有幫助!
2、MFC 中 如何實現CComboBox組合框輸入字元後,如何自動補全 和 完全匹配,並標藍
用排序演算法結合容器保存和讀取數,
3、MFC怎麼使用
【MFC控制項的使用方法】
VC++6.0控制項工具箱:
2 圖形控制項(picture):常用於顯示點陣圖(Bitmap)和圖標(Icon)
3 靜態文本(Static Text):用來在指定的位置顯示特定的字元串,一般用來標識附近另一個控制項的內容。顯示在靜態文本控制項中的字元串一般不再改變,但是在需要的時候,也可以通過調用相應的函數來進行設置。MFC提供了CStatic類支持靜態控制項。
4 編輯框(Edit Box):用來接收用戶輸入的字元串。通過選擇編輯框的選項,編輯框可以接收字元串、數字、密碼等;編輯框還可以設置成接收多行字元串的模式;可以自動進行大小寫轉換。編輯框可能向其父窗口發送多種控制項通知,如果用戶需要,可以對這些控制項通知進行處理。MFC提供了CEdit類支持編輯框控制項。
5 組成框(Group Box):用來包圍具有邏輯關系的一組控制項,在這些控制項的周圍加上邊界和標題。需注意的是,組成框僅僅是在視覺效果上對控制項進行「成組」,真正的「成組」工作還需要另外一些工作。
6 按鈕(Button):用來接收用戶的命令,應用程序在接收到用戶命令後,通常需要進行一些後台工作。按鈕可以響應單擊或雙擊動作,在按鈕接收到滑鼠動作後,向其父窗口發送相應的控制項通知,用戶可以對這些控制項通知進行消息映射,從而進行相應的處理。在一個對話框中,可以定義一個默認按鈕,這只要選中按鈕屬性中的「Default」選項。如果在對話框活動的時候按下了Enter鍵,則等同於單擊了默認按鈕。MFC提供了CButton類支持按鈕控制項。
7 復選框(Check Box):用來顯示某種可能的選擇,該項選擇是獨立的,用戶可以選中或取消該選項。在選項被選中的時候核選標記出現,選項被取消時核選標記消失。MFC中由CButton類對核選框進行支持,用戶可以通過SetCheck()函數和GetCheck()函數設置或獲取核選框當前的狀態。
8 單選按鈕(Radio Button):用來選擇某種可能的選擇,與核選框不同,該選項不是獨立的。一般是幾個單選按鈕組成一組,同組中的單選按鈕可以有也只能有一個按鈕被選中。MFC同樣使用CButton類對單選按鈕控制項進行支持,SetCheck()函數和GetCheck()函數對單選按鈕也是適用的。
9 組合框(Combo Box):列表框和編輯框的組合,用戶除了可以在列表中對已經存在的選項進行選擇外,還可以輸入新的選擇。MFC提供了CComboBox類對組合框控制項進行支持。
10 列表框(List Box):用來選擇一系列的可能選擇,用戶通過滾動條可以在這些選擇中瀏覽。在列表框中,可以進行單項選擇,也可以進行多項選擇,這取決於用戶在控制項屬性對話框中的設置。MFC提供了CListBox類對列表框控制項進行支持。
11、12 滾動條(Scroll Bar):這包括水平滾動條和垂直滾動條,除了在視覺效果上的方向不同外,水平滾動條在被滾動時發生WM_HSCROLL消息,而垂直滾動條在被滾動時發送WM_VSCROLL消息。MFC提供了CScrollBar進行支持。
13 微調按鈕(Spin Button):包括一對緊靠在一起的上下箭頭,使用微調按鈕可以增大或者縮小某個特定的數值。微調按鈕往往都需要一個「夥伴」控制項,這通常都是一個編輯框。當微調按鈕的向上箭頭被單擊時,編輯框中的數字就增大;反之則減小。MFC提供了CPinButtonCtrl類進行支持。
14 進度條(Progress):在進行一項需要佔有較長時間的操作時來反應當前的進度。當操作的進度不斷前進時,進度條就用特色顏色填充進度條框。用戶可以設定進度條的范圍和當前位置。MFC提供了CProgressCtrl類進行支持。
15 滑塊控制項(Slider):通常用來在程序中接受一系列離散的數值。用戶可以設置滑塊控制項的取值范圍,並可以為控制項加上刻度標記以顯示特定位置的含義。MFC提供了CSliderCtrl類進行支持。
16 熱鍵控制(Hot Key):熱鍵控制項看起來就像一個編輯框,但是在熱鍵控制項中能夠立刻反應用戶剛剛按下的鍵組合,這在設置程序的熱鍵時特別有用。熱鍵控制項只是在「視覺」上顯示了按鍵組合,設置熱鍵的工作還需要用戶添加代碼完成。MFC提供了CHotKey類進行支持。
17 列表控制(List Control):按一定的排列順序顯示一系列帶圖標的字元串,列表控制項提供了四種顯示模式:大圖標、小圖標、列表和詳細信息。用戶可以向列表控制項中添加新的項,也可以控制列表控制項的顯示模式。MFC提供了CListCtrl類進行支持。
18 樹形控制項(Tree Control):用來顯示一系列項目的層次關系,最典型的例子是顯示磁碟上的文件與文件夾。如果有子項目的話,單擊樹形控制項中的項目可以展開或者收縮其子項目。MFC提供了CTreeCtrl類進行支持。
19 屬性表控制項(Tab Control):用來包含大量的控制項,可以滿足用戶顯示或者獲取大量數據的要求。每個屬性表又分為好幾個屬性頁,這些屬性頁由各自的標簽進行區分,這些屬性頁中都可以包容其他控制項。在顯示屬性表的時候,一次只能夠顯示一個屬性頁的全部內容,同時顯示其他屬性頁的標簽,用戶通過單擊標簽打開相應的屬性頁。MFC提供了CTabCtrl類進行支持。
20 動畫控制項(Animation):用來播放一段AVI格式的視頻剪輯。用戶可以控制視頻剪輯的播放、停止和定位,但也僅限於這些功能。動畫控制項設置不能播放音頻剪輯,如果用戶需要更高層次的視頻或者音頻的支持,請選用MCIWnd控制項。MFC提供了CAnimateCtrl類對動畫控制項進行支持。
21 高級編輯框(Rich Edit):編輯控制項功能的擴展。在高級編輯框中,除了簡單的輸入和編輯字元串外,用戶還可以為字元或段落指定特定的格式,用戶甚至還可以向高級編輯框中插入OLE項。高級編輯框基本上實現了一個帶格式的文本編輯器功能,而只需要用戶添加少量的介面。MFC提供了CRichEditCtrl類進行支持。
22 日歷控制項(Month Calender):看似與真正的日歷類似,操作也類似,直觀的為用戶提供了觀察和顯示當前日期的途徑。MFC提供了CMonthCalCtrl類進行支持。
23 日期/時間選擇器(Date Time Picker):向用戶提供了一種直觀的選擇日期和時間的方法、日期/時間選擇器在外觀上類似於一個組合框,但是當用戶單擊下拉箭頭時就會展開一個日歷控制項供用戶選擇,而一旦用戶做出了選擇,日期/時間選擇器會自動顯示新的日期/時間。MFC提供了CDateTimeCtrl類進行支持。
24 IP地址控制項(IP Adress):IP地址控制項用來輸入和編輯IP地址。該控制項外觀類似於一個編輯框,但是可以自動對輸入的字元按3個一組進行區分和加間隔圓點。IP地址控制項為開發支持Internet技術的程序提供了方便。MFC提供了CIPAddressCtrl類進行支持。
26 擴展組合框(Extended Combo Box):在普通組合框的基礎上還支持圖像列表。即,可以在組合框中顯示特定的圖標表示相應的選擇,而不僅僅是顯示文本。MFC提供了CComboBoxEx類進行支持。
所有控制項的公共屬性:
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還可以用來設置/得到對話框的標題文本。
4、C++中,CComboBox類,MFC組合框問題?
根據下拉數據的個數,從後面一個一個的刪除,只留下第一個。
m_ListBox.DeleteString(i);
5、誰能開發一個C++瀏覽器,如果誰能開發到,我給回報酬
利用Visual C++打造自己的IE瀏覽器
IE瀏覽器作為微軟系統捆綁銷售的一個瀏覽工具,用來瀏覽千姿百態的網頁,目前它已經占據了瀏覽器市場的半壁江山,成為Windows用戶不可或缺的工具。首先,它的界面設計的很漂亮,如扁平按紐(按鈕上的圖像為灰色,當滑鼠放在按鈕上時,按鈕突起,這種狀態稱為手柄,並且其上的圖像變得鮮艷醒目)、按鈕上的文字說明以及按鈕邊上的小黑三角形狀的下拉箭頭(單擊時顯示下拉菜單)、工具條上的地址輸入欄等,都體現了Windows2000的風格;其次,它的收藏欄可以收藏用戶喜愛的網路地址,這一切都為IE的流行打下了堅實的基礎。說了那麼多,也許讀者朋友們感覺到IE實現起來一定非常困難,其實IE也是個"紙老虎",實現它的難點主要是在界面效果和顯示收藏夾上,筆者在本實例中有針對性的敘述了IE界面、收藏網頁的顯示、網頁的瀏覽等功能的實現,仔細看過這篇文章後,相信讀者朋友們一定可以打造出一個屬於自己的瀏覽器。本實例中的程序代碼編譯運行後的界面效果如圖一所示:
圖一、瀏覽器的運行界面
一、實現方法
1、瀏覽器的界面實現
首先啟動Visual C++6.0,生成一個名為mfcie單文檔項目,注意在此過程中不要選擇工具條和狀態條選項,這樣才能更方便我們在後續工作中用代碼實現Windwos2000風格的工具條、狀態條;在工具條中添加地址欄;項目的視圖類的基類設置為ChtmlView,該類的Navigate2()成員函數專門用來現實超文本格式的文檔。在主框架類CmainFrame中定義CStatusBar m_wndStatusBar(狀態條對象)、CToolBar m_wndToolBar(工具欄對象)、CReBar m_wndReBar(、CComboBoxEx m_wndAddress(擴展的組合框對象,用來作為地址欄)、CAnimateCtrl m_wndAnimate(動畫控制項,用來在工具欄上顯示動畫)、圖像列表對象CImageList img(存放顯示在工具欄上的圖標)等對象。向當前項目AVI資源文件,ID標志IDR_MFCAVI,添加Bitmap(點陣圖)資源,ID標志分別為IDB_COLDTOOLBAR、IDB_HOTTOOLBAR,分別如下所示:
圖二、包含按鈕圖標的點陣圖
1)IE風格工具條
IE風格界面的實現主要在主框架類的CMainFrame::OnCreate()函數中實現,它的主要思想如下: CReBar對象用來作為工具條、地址欄、動畫控制項的容器,CImageList對象然後分別裝載工具欄上按鈕的熱點圖像和正常狀態下顯示的圖像,並將該對象附給工具條對象,使之建立關聯。為了顯示扁平工具欄,需要用CreateEx()函數創建CToolBar對象m_wndToolBar,用ModifyStyle()函數將工具欄的風格設為扁平類型,注意這里不能用CToolBar::Create() 或 CToolBar:: SetBarStyle()設置這種新風格。CToolBar 類不支持TBSTYLE_FLAT,要解決這個問題,必須繞過CToolBar類,使用CWnd::ModifyStyle()。要將某一個工具欄按鈕設置為附帶有下拉按鈕,可以調用SetButtonInfo()設置按鈕的風格為TBSTYLE_DROPDOWN。至於按鈕帶有中文提示,用工具欄的SetButtonText()就可以輕松實現了。下面是實現IE風格界面的代碼和注釋:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CImageList img; //圖像列表對象;
CString str; //字元串對象;
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndReBar.Create(this)) //創建CReBar對象;
{ TRACE0("Failed to create rebar\n");
return -1; }
if (!m_wndToolBar.CreateEx(this)) //使用CreateEx()函數創建工具條對象;
{ TRACE0("Failed to create toolbar\n");
return -1; }
//設置工具欄中的按鈕最大最小尺寸;
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50, 150);
//設置工具欄上的按鈕支持下拉箭頭風格;
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//向圖像列表裝載熱點圖像資源,IDB_HOTTOOLBAR為熱點圖像資源ID img.Create(IDB_HOTTOOLBAR, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
img.Detach();
//圖象列表裝載正常狀態的圖像資源,IDB_COLDTOOLBAR為圖像資源ID
img.Create(IDB_COLDTOOLBAR, 22, 0, RGB(255, 0, 255));
m_wndToolBar.GetToolBarCtrl().SetImageList(&img);
img.Detach();
//設置工具條為扁平風格
m_wndToolBar.ModifyStyle(0, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT);
//設置工具條上的按鈕個數為9個;
m_wndToolBar.SetButtons(NULL, 9);
// 裝載字元串資源,設置按鈕上的文本和按鈕的標識號;
m_wndToolBar.SetButtonInfo(0, ID_GO_BACK, TBSTYLE_BUTTON, 0);
str.LoadString(IDS_BACK);
m_wndToolBar.SetButtonText(0, str);
m_wndToolBar.SetButtonInfo(1, ID_GO_FORWARD, TBSTYLE_BUTTON, 1);
str.LoadString(IDS_FORWARD);
m_wndToolBar.SetButtonText(1, str);
m_wndToolBar.SetButtonInfo(2, ID_VIEW_STOP, TBSTYLE_BUTTON, 2);
str.LoadString(IDS_STOP);
m_wndToolBar.SetButtonText(2, str);
m_wndToolBar.SetButtonInfo(3, ID_VIEW_REFRESH, TBSTYLE_BUTTON, 3);
str.LoadString(IDS_REFRESH);
m_wndToolBar.SetButtonText(3, str);
m_wndToolBar.SetButtonInfo(4, ID_GO_START_PAGE, TBSTYLE_BUTTON, 4);
str.LoadString(IDS_HOME);
m_wndToolBar.SetButtonText(4, str);
m_wndToolBar.SetButtonInfo(5, ID_GO_SEARCH_THE_WEB, TBSTYLE_BUTTON, 5);
str.LoadString(IDS_SEARCH);
m_wndToolBar.SetButtonText(5, str);
m_wndToolBar.SetButtonInfo(6, ID_FAVORITES_DROPDOWN,TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 6);
str.LoadString(IDS_FAVORITES);
m_wndToolBar.SetButtonText(6, str);
m_wndToolBar.SetButtonInfo(7, ID_FILE_PRINT, TBSTYLE_BUTTON, 7);
str.LoadString(IDS_PRINT);
m_wndToolBar.SetButtonText(7, str);
m_wndToolBar.SetButtonInfo(8, ID_FONT_DROPDOWN, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 8);
str.LoadString(IDS_FONT);
m_wndToolBar.SetButtonText(8, str);
// 設置工具欄上的按鈕尺寸和顯示在按鈕上的圖標尺寸;
CRect rectToolBar;
m_wndToolBar.GetItemRect(0, &rectToolBar);
m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(30,20));
//創建組合框,用來作為地址欄;
if (!m_wndAddress.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, AFX_IDW_TOOLBAR + 1))
{ TRACE0("Failed to create combobox\n");
return -1; }
//創建動畫控制項對象,並打開AVI資源IDR_MFCAVI;
m_wndAnimate.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 10, 10), this, AFX_IDW_TOOLBAR + 2);
m_wndAnimate.Open(IDR_MFCAVI);
//將工具條、地址欄、動畫控制項等添加到CReBar對象中;
m_wndReBar.AddBar(&m_wndToolBar);
m_wndReBar.AddBar(&m_wndAnimate, NULL, NULL, RBBS_FIXEDSIZE | RBBS_FIXEDBMP);
str.LoadString(IDS_ADDRESS);
m_wndReBar.AddBar(&m_wndAddress, str, NULL, RBBS_FIXEDBMP | RBBS_BREAK);
//再次設置工具條風格,使之有工具欄提示功能;
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_FIXED);
//設置狀態條;
if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)))
{ TRACE0("Failed to create status bar\n");
return -1; }
…….//實現"Favorites"菜單的部分,該部分在第二部分介紹;
return 0;
}
2)工具條上的下拉菜單
當用戶點擊按鈕上的下拉箭頭時,將出現相應的菜單,為了實現這個功能,首先需要在CMainFrame.cpp文件的消息映射中添加消息映射:ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDown);在CmainFrame.h文件中添加消息映射函數聲明:afx_msg void OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult);最後添加下面的代碼:
void CMainFrame::OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult)
{
NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNotifyStruct;
CRect rect;
// 得到下拉箭頭的位置;
m_wndToolBar.GetToolBarCtrl().GetRect(pNMToolBar->iItem, &rect);
rect.top = rect.bottom;
::ClientToScreen(pNMToolBar->hdr.hwndFrom, &rect.TopLeft());
if(pNMToolBar->iItem == ID_FONT_DROPDOWN)
//判斷是否為選擇字體的下拉箭頭;
{
CMenu menu;
CMenu* pPopup;
menu.LoadMenu(IDR_FONT_POPUP);
pPopup = menu.GetSubMenu(0);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left, rect.top + 1, AfxGetMainWnd());
}
else if(pNMToolBar->iItem == ID_FAVORITES_DROPDOWN)
{//判斷是否為顯示收藏網頁的下拉箭頭;
CMenu* pPopup;
pPopup = GetMenu()->GetSubMenu(3);
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left,
rect.top + 1, AfxGetMainWnd());
}
*pResult = TBDDRET_DEFAULT;
}
3)工具條上的動畫實現
為了美化程序的界面,程序的復合工具條上放置了一個動畫控制項,用來在適當的時機播放一個動畫片段,實現動畫效果。下面的代碼實現了創建動畫控制項對象,並打開AVI資源IDR_MFCAVI:
m_wndAnimate.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, 10, 10), this, AFX_IDW_TOOLBAR + 2);
m_wndAnimate.Open(IDR_MFCAVI);
CanimateCtrl類提供了Play()、Seek()、Stop()、Close()等函數用來為播放視頻文件服務,它們使用起來都非常簡單,這里就不再贅述了。
4)地址欄的操作
當用戶在地址欄上輸入網頁地址並按下回車鍵後,瀏覽器將顯示該網頁的內容,並將在地址欄中記錄下該地址。因為回車鍵按下後對應的消息ID為IDOK,為此,需要在CmainFrame類中添加消息映射ON_COMMAND(IDOK, OnNewAddressEnter)和消息響應函數afx_msg void OnNewAddressEnter()。該函數實現代碼如下:
void CMainFrame::OnNewAddressEnter()
{
CString str;
//獲取地址欄中的字元串;
m_wndAddress.GetEditCtrl()->GetWindowText(str);
((CMfcieView*)GetActiveView())->Navigate2(str, 0, NULL);//顯示該網頁;
//將該網址添加到地址欄對應的組合框中;
COMBOBOXEXITEM item;
item.mask = CBEIF_TEXT;
item.iItem = -1;
item.pszText = (LPTSTR)(LPCTSTR)str;
m_wndAddress.InsertItem(&item);
}
同理,還要在CmainFrame類中為地址欄(ID 為AFX_IDW_TOOLBAR + 1)添加消息映射ON_CBN_SELENDOK(AFX_IDW_TOOLBAR + 1,OnNewAddress)和消息響應函數OnNewAddress,用來處理用戶從地址欄組合框中選擇網址的操作,該函數的實現代碼如下:
void CMainFrame::OnNewAddress()
{
CString str;
m_wndAddress.GetLBText(m_wndAddress.GetCurSel(), str);
((CMFCIEView*)GetActiveView())->Navigate2(str, 0, NULL);
}
2、實現收藏菜單
一般IE的用戶都有個習慣,那就是將自己喜歡的網址保存起來,以方便今後快速的登陸,為了使我們的瀏覽器能夠顯示IE收藏過的網址,程序中設置了一個"Favorites"菜單,通過RegOpenKey()、RegQueryValueEx()等函數操作Windows的注冊表中的HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders項,將收藏的網址顯示到菜單上。為此,實例中定義了兩個函數,實現代碼如下所示:
TCHAR GetDir( ) //得到存放用戶收藏網址的目錄;
{
TCHAR sz[MAX_PATH];
TCHAR szPath[MAX_PATH];
HKEY hKey;
DWORD dwSize;
CMenu* pMenu;
// 得到"Favorites"菜單,並刪除空白的子菜單項;
pMenu = GetMenu()->GetSubMenu(3);
while(pMenu->DeleteMenu(0, MF_BYPOSITION));
// find out from the registry where the favorites are located.
if(RegOpenKey(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\
User Shell Folders"), &hKey) != ERROR_SUCCESS)
{
TRACE0("Favorites folder not found\n");
return 0;
}
dwSize = sizeof(sz);
RegQueryValueEx(hKey, _T("Favorites"), NULL, NULL, (LPBYTE)sz, &dwSize);
ExpandEnvironmentStrings(sz, szPath, MAX_PATH);
RegCloseKey(hKey);
Return szPath
}
int CMainFrame::BuildFavoritesMenu(LPCTSTR pszPath, int nStartPos, CMenu* pMenu)
{
CString strPath(pszPath);
CString strPath2;
CString str;
WIN32_FIND_DATA wfd;
HANDLE h;
int nPos;
int nEndPos;
int nNewEndPos;
int nLastDir;
TCHAR buf[INTERNET_MAX_PATH_LENGTH];
CStringArray astrFavorites;
CStringArray astrDirs;
CMenu* pSubMenu;
if(strPath[strPath.GetLength() - 1] != _T(』\\』))
strPath += _T(』\\』);
strPath2 = strPath;
strPath += "*.*";
// 掃描當前目錄,首先搜索*.URL文件,然後是可能含有*.URL文件的子目錄;
h = FindFirstFile(strPath, &wfd);
if(h != INVALID_HANDLE_VALUE)
{
nEndPos = nStartPos;
do
{
if((wfd.dwFileAttributes&
(FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_SYSTEM))==0)
{
str = wfd.cFileName;
if(str.Right(4) == _T(".url"))
{/*URL文件和INI文件格式類似,所以我們可以使用 GetPrivateProfileString() 來得到我們所需要的信息。*/
::GetPrivateProfileString(_T("InternetShortcut"), T("URL"),
_T(""),buf,INTERNET_MAX_PATH_LENGTH,
strPath2 + str);
str = str.Left(str.GetLength() - 4);
// 判斷是否已經重復;
for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
{
if(str.CompareNoCase(astrFavorites[nPos]) < 0)
break;
}
astrFavorites.InsertAt(nPos, str);//添加該字元串;
m_astrFavoriteURLs.InsertAt(nPos, buf);//保留相應的地址
++nEndPos;
}
}
} while(FindNextFile(h, &wfd));
FindClose(h);
// 將找到的項目添加到菜單中;
for(nPos = nStartPos ; nPos < nEndPos ; ++nPos)
{
pMenu->AppendMenu(MF_STRING | MF_ENABLED, 0xe00 + nPos, astrFavorites[nPos]);
}
// 搜索子目錄
nLastDir = 0;
h = FindFirstFile(strPath, &wfd);
ASSERT(h != INVALID_HANDLE_VALUE);
do
{
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{ //對目錄進行搜索;
if(lstrcmp(wfd.cFileName,_T(".")) == 0 || lstrcmp(wfd.cFileName, _T("..")) == 0)
continue;
for(nPos = 0 ; nPos < nLastDir ; ++nPos)
{
if(astrDirs[nPos].CompareNoCase(wfd.cFileName) > 0)
break;
}
pSubMenu = new CMenu;
pSubMenu->CreatePopupMenu();
// call this function recursively.
nNewEndPos = BuildFavoritesMenu(strPath2 + wfd.cFileName, nEndPos, pSubMenu);
if(nNewEndPos != nEndPos)
{
// 插入子菜單;
nEndPos = nNewEndPos;
pMenu->InsertMenu(nPos, MF_BYPOSITION | MF_POPUP | MF_STRING, (UINT)pSubMenu->m_hMenu, wfd.cFileName);
pSubMenu->Detach();
astrDirs.InsertAt(nPos, wfd.cFileName);
++nLastDir;
}
delete pSubMenu;
}
} while(FindNextFile(h, &wfd));
FindClose(h);
}
return nEndPos;
}
3、顯示超文本
微軟ChtmView類的Navigate2函數可以實現超文本文件的顯示,GoBack()、GoForward()等函數可以分別實現網頁瀏覽的回退和前進操作。以響應"Favorite"菜單項為例,需要在程序的CmainFrame類中添加消息映射ON_COMMAND_RANGE(0xe00, 0xfff, OnFavorite)和消息響應函數OnFavorite,來響應ID為0xe00-0xfff范圍內的菜單單擊處理,具體實現代碼如下:
void CMainFrame::OnFavorite(UINT nID)
{
((CMFCIEView*)GetActiveView())->Navigate2(m_astrFavoriteURLs[nID-0xe00], 0, NULL);
}
二、編程步驟
1、 啟動Visual C++6.0,生成一個單文檔視圖結構的應用程序,將該程序命名為"mfcie",注意在生成項目的過程中不要選擇工具條和狀態條選項,項目的視圖類的基類設置為ChtmlView;
2、 按照上文中的說明,使用Class Wizard在程序的項目中添加相應的消息響應函數;
3、 向程序的項目中添加AVI、點陣圖資源;
4、 添加代碼,編譯運行程序。
6、VS2010 怎麼添加擴展組合框控制項 CComboBoxEx
打開資源視圖->對應的窗口,在上面添加一個ComBox控制項;
定義一個回CComboBoxEx類型的變答量m_combox;
使用DDX_CTROL()綁定那個Combox控制項;
可以在OnInitial中修改它的額外風格並初始化;
或者
直接定義一個變數,通過Create動態創建一個;
然後MoveWindow到制定的位置顯示出來即可
7、CComboBoxEx字元長度怎麼讓超過CComboBoxEx的寬度
工具欄中使用了CComboBoxEx控制項,但是一調用AddString就出錯,花了N多的時間,原來是CComboBoxEx不能使用AddString。很初級的問題,不過為避免更多人走這個彎路,所以在這里稍微提一下.CComboBoxEx用法如下:
COMBOBOXEXITEM Item;
Item.mask = CBEIF_TEXT ;
Item.pszText = _T("Text Sample");
Item.iItem = 0;//index
m_comboboxex.InsertItem(&Item);
組合窗口是由一個輸入框和一個列表框組成。創建一個組合窗口可以使用成員函數:
BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle將指明該窗口的風格,除了子窗口常用的風格WS_CHILD,WS_VISIBLE外,你可以針對列表控制項指明專門的風格。
CBS_DROPDOWN 下拉式組合框
CBS_DROPDOWNLIST 下拉式組合框,但是輸入框內不能進行輸入
CBS_SIMPLE 輸入框和列表框同時被顯示
LBS_SORT 所有的行按照字母順序進行排序
由於組合框內包含了列表框,所以列表框的功能都能夠使用,如可以利用:
int AddString( LPCTSTR lpszItem )添加行,
int DeleteString( UINT nIndex )刪除指定行,
int InsertString( int nIndex, LPCTSTR lpszItem )將行插入到指定位置。
void ResetContent( )可以刪除列表框中所有行。
通過調用int GetCount( )得到當前列表框中行的數量。
如 果需要得到/設置當前被選中的行的位置,可以調用int GetCurSel( )/int SetCurSel(int iIndex)。通過調用int GetLBText( int nIndex, LPTSTR lpszText )得到列表框內指定行的字元串。
此外通過調用int FindString( int nStartAfter, LPCTSTR lpszItem )可以在當前所有行中查找指定的字元傳的位置,nStartAfter指明從那一行開始進行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem )可以選中包含指定字元串的行。
此外輸入框的功能都能夠使用,如可以利用:
DWORD GetEditSel( ) /BOOL SetEditSel( int nStartChar, int nEndChar )得到或設置輸入框中被選中的字元位置。
BOOL LimitText( int nMaxChars )設置輸入框中可輸入的最大字元數。
輸入框的剪貼板功能Copy,Clear,Cut,Paste動可以使用。
最後介紹一下列表框幾種常用的消息映射宏:
ON_CBN_DBLCLK 滑鼠雙擊
ON_CBN_DROPDOWN 列表框被彈出
ON_CBN_KILLFOCUS / ON_CBN_SETFOCUS 在輸入框失去/得到輸入焦點時產生
ON_CBN_SELCHANGE 列表框中選擇的行發生改變
ON_CBN_EDITUPDATE 輸入框中內容被更新
使 用以上幾種消息映射的方法為定義原型如:afx_msg void memberFxn( );的函數,並且定義形式如ON_Notification( id, memberFxn )的消息映射。如果在對話框中使用組合框,Class Wizard會自動列出相關的消息,並能自動產生消息映射代碼。
在MFC 4.2中對組合框進行了增強,你可以在組合框中使用ImageList,有一個新的類CComboBoxEx(由CComboBox派生)來實現這一功能。在CComboBoxEx類中添加了一些新的成員函數來實現新的功能:首先你需要調用
CImageList* SetImageList( CImageList* pImageList );來設置ImageList,然後調用
int InsertItem( const COMBOBOXEXITEM* pCBItem );來添加行,其中COMBOBOXEXITEM定義如下:
typedef struct
{
UINT mask;
int iItem;
LPTSTR pszText;
int cchTextMax;
int iImage;
int iSelectedImage;
int iOverlay;
int iIndent;
LPARAM lParam;
} COMBOBOXEXITEM, *PCOMBOBOXEXITEM;
你需要設置mask=CBEIF_IMAGE|CBEIF_TEXT,並設置iItem為插入位置,設置pszText為顯示字元串,設置iImage為顯示的圖標索引。下面的代碼演示了如何進行插入:
m_list.Create(IDB_IMG,16,4,RGB(0,0,0));
m_cbeWnd.SetImageList(&m_list);
COMBOBOXEXITEM insItem;
insItem.mask=CBEIF_IMAGE|CBEIF_TEXT;
insItem.iItem=0;
insItem.iImage=0;
insItem.pszText="Line 1";
m_cbeWnd.InsertItem(&insItem);
insItem.iItem=1;
insItem.iImage=1;
insItem.pszText="Line 2";
m_cbeWnd.InsertItem(&insItem);
通過調用int DeleteItem( int iIndex );來刪除行,並指明行的位置。
通過調用BOOL GetItem( COMBOBOXEXITEM* pCBItem )/BOOL SetItem( const COMBOBOXEXITEM* pCBItem );來得到/設置行數據。
8、MFC組合框不用編譯呃??????
你使用的應該是CComboBoxEx這個類,該類從CComboBox類繼承而來。CComoboBoxEx與CComboBox相比主要是增加了版支持圖像列表權的功能。
在afxcmn2.inl中CComboBoxEx重載了AddString函數,代碼如下:
_AFXCMN_INLINE int CComboBoxEx::AddString(LPCTSTR lpszString)
{ UNUSED_ALWAYS(lpszString); ASSERT(FALSE); return CB_ERR;}
從ASSERT(FALSE);可知道CComboBoxEx類已經不再支持AddString函數。
可以通過定義COMBOBOXEXITEM的對象,然後使用InsertItem()函數進行插入項操作。
更多關於CComboBoxEx的成員函數可參考MSDN。
對於你的程序,如果不需要支持圖像列表,可使用CComboBox類即可。
9、怎麼確定組合框各個選擇項的ccombobox getcursel的返回值
返回值是數字標號,從零開始,第一行是0.
10、CcomboBoxEx不能使用addstring問題 (急!)
CString str = _T("just a test");
COMBOBOXEXITEM Item;
Item.mask = CBEIF_TEXT ;
Item.pszText = (LPTSTR)(LPCTSTR)str;
Item.iItem = 0;//index
m_comboboxex.InsertItem(&Item);
CString不可來以直接源和LPTSTR劃等號的哈,,good luck,