VC制作类似于IE4的酷工具条
生活随笔
收集整理的這篇文章主要介紹了
VC制作类似于IE4的酷工具条
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
用VC制作工具條的方法很多,本文提供一種制作類似于IE4.0的工具條。能實現(xiàn)鼠標(biāo)移上圖標(biāo)時,圖標(biāo)變?yōu)椴噬?#xff0c;在工具條的位置,能停擺幾種工具條。具體原理解釋見步驟過程。
步驟如下:
1.????運行AppWizard,選擇Single Document,其余選缺省設(shè)置。
2.????點擊Insert Resource ,加入兩條Bitmap,定義為:IDB_COLDTOOLBAR和IDB_HOTTOOLBAR
3.????在CMainFrame中加入成員變量:
????CReBar? ? ? m_wndReBar;????????????
????CComboBoxEx m_wndAddress;
4.????修改CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函數(shù)如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
????CImageList img;
????CString str;
????if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
????????return -1;
????
????if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
????????| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) )
????{
????????TRACE0("Failed to create toolbar ");
????????return -1;? ? ? // fail to create
????}
????if (!m_wndStatusBar.Create(this) ||
????????!m_wndStatusBar.SetIndicators(indicators,
????????? sizeof(indicators)/sizeof(UINT)))
????{
????????TRACE0("Failed to create status bar ");
????????return -1;? ? ? // fail to create
????}
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50, 150);? ? //設(shè)置工具條按鈕大小
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//創(chuàng)建鼠標(biāo)移上時的圖標(biāo)列表
????img.Create(IDB_HOTTOOLBAR, 22, 0, RGB(255, 0, 255));????????m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
????img.Detach();
//創(chuàng)建無焦點的圖標(biāo)列表
????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);
//設(shè)置要顯示的圖標(biāo)數(shù),可根據(jù)實際情況修改
????m_wndToolBar.SetButtons(NULL, 9);
????//逐個設(shè)置圖標(biāo)按鈕的屬性
/*SetButtonInfo(( int nIndex, UINT nID, UINT nStyle, int iImage ); 參數(shù)如下:
? nIndex :? 圖標(biāo)按鈕的索引值
? nID:????????圖標(biāo)按鈕關(guān)聯(lián)的資源號
? nStyle:? ? 圖標(biāo)按鈕的風(fēng)格
????????????????常用的幾種如下:
????????????TBBS_BUTTON? 標(biāo)準(zhǔn)按鈕
TBBS_SEPARATOR? 分隔符
TBSTYLE_DROPDOWN? 帶有下箭頭的按鈕
? iImage:? ? 關(guān)聯(lián)建立的ImageList中圖形的索引值
*/
?
????m_wndToolBar.SetButtonInfo(0, ID_FILE_NEW, TBSTYLE_BUTTON, 0);
????m_wndToolBar.SetButtonText(0, "回退");
????m_wndToolBar.SetButtonInfo(1, ID_FILE_OPEN, TBSTYLE_BUTTON , 1);
????m_wndToolBar.SetButtonText(1, "前進(jìn)");
????m_wndToolBar.SetButtonInfo(2, ID_FILE_SAVE, TBSTYLE_BUTTON|TBBS_SEPARATOR? , 2);
????m_wndToolBar.SetButtonText(2, "停止");
????m_wndToolBar.SetButtonInfo(3, ID_FILE_PRINT_SETUP, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 3);
????m_wndToolBar.SetButtonText(3, "打印設(shè)置");
????CRect rectToolBar;
????// 設(shè)置工具條大小
????m_wndToolBar.GetItemRect(0, &rectToolBar);
????m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(30,20));
????// 創(chuàng)建
????if (!m_wndAddress.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, AFX_IDW_TOOLBAR + 1))
????{
????????TRACE0("Failed to create combobox ");
????????return -1;? ? ? // fail to create
????}
????COMBOBOXEXITEM item;
????item.mask = CBEIF_TEXT;
????item.iItem = -1;
????item.pszText = "健松思想";
????m_wndAddress.InsertItem(&item);
????if (!m_wndReBar.Create(this))
????{
????????TRACE0("Failed to create rebar ");
????????return -1;? ? ? // fail to create
????}
????// 將工具條和生成的輸入框加入CReBar對象,集中顯示在工具條區(qū)域
????m_wndReBar.AddBar(&m_wndToolBar);
????m_wndReBar.AddBar(&m_wndAddress, "地址", NULL, RBBS_FIXEDBMP | RBBS_BREAK);
????return 0;
}
????到此,運行程序,已經(jīng)可以看到一個類似IE4.0的程序出來了。但是下拉式圖標(biāo)按鈕并沒有顯示出下拉菜單,也沒有對輸入框進(jìn)行消息響應(yīng)。繼續(xù)修改程序如下:
5.????制作菜單IDR_PRINT_POPUP
6.????在MainFrame.h加入
????afx_msg void OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult);
在MainFrame.cpp中的MESSAGE_MAP加入消息映射
????ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDown)
和處理函數(shù)體:
void CMainFrame::OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult)
{
????// this function handles the dropdown menus from the toolbar
????NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNotifyStruct;
????CRect rect;
????// translate the current toolbar item rectangle into screen coordinates
????// so that we'll know where to pop up the menu
????m_wndToolBar.GetToolBarCtrl().GetRect(pNMToolBar->iItem, &rect);
????rect.top = rect.bottom;
????::ClientToScreen(pNMToolBar->hdr.hwndFrom, &rect.TopLeft());
????if(pNMToolBar->iItem == ID_FILE_PRINT_SETUP)
????{
????????CMenu menu;
????????CMenu* pPopup;
????????// the font popup is stored in a resource
????????menu.LoadMenu(IDR_PRINT_POPUP);
????????pPopup = menu.GetSubMenu(0);
????????pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left, rect.top + 1, AfxGetMainWnd());
????}
????*pResult = TBDDRET_DEFAULT;
}
7.????處理對Combox的響應(yīng),這里只對內(nèi)容改變的消息進(jìn)行處理,若要添加別的處理,參看Combo Box Handlers的消息映射。
在MainFrame.h中加入????afx_msg void OnNewAddress();
在MainFrame.cpp中的MESSAGE_MAP中加入消息映射
????ON_CBN_SELENDOK(AFX_IDW_TOOLBAR + 1,OnNewAddress)
同時加入函數(shù)體
void CMainFrame::OnNewAddress()
{
????CString str;
????ShellExecute(NULL,"OPEN" ,"http://jonson.126.com",NULL,NULL,SW_SHOW);
}
步驟如下:
1.????運行AppWizard,選擇Single Document,其余選缺省設(shè)置。
2.????點擊Insert Resource ,加入兩條Bitmap,定義為:IDB_COLDTOOLBAR和IDB_HOTTOOLBAR
3.????在CMainFrame中加入成員變量:
????CReBar? ? ? m_wndReBar;????????????
????CComboBoxEx m_wndAddress;
4.????修改CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函數(shù)如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
????CImageList img;
????CString str;
????if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
????????return -1;
????
????if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
????????| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) )
????{
????????TRACE0("Failed to create toolbar ");
????????return -1;? ? ? // fail to create
????}
????if (!m_wndStatusBar.Create(this) ||
????????!m_wndStatusBar.SetIndicators(indicators,
????????? sizeof(indicators)/sizeof(UINT)))
????{
????????TRACE0("Failed to create status bar ");
????????return -1;? ? ? // fail to create
????}
m_wndToolBar.GetToolBarCtrl().SetButtonWidth(50, 150);? ? //設(shè)置工具條按鈕大小
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//創(chuàng)建鼠標(biāo)移上時的圖標(biāo)列表
????img.Create(IDB_HOTTOOLBAR, 22, 0, RGB(255, 0, 255));????????m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
????img.Detach();
//創(chuàng)建無焦點的圖標(biāo)列表
????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);
//設(shè)置要顯示的圖標(biāo)數(shù),可根據(jù)實際情況修改
????m_wndToolBar.SetButtons(NULL, 9);
????//逐個設(shè)置圖標(biāo)按鈕的屬性
/*SetButtonInfo(( int nIndex, UINT nID, UINT nStyle, int iImage ); 參數(shù)如下:
? nIndex :? 圖標(biāo)按鈕的索引值
? nID:????????圖標(biāo)按鈕關(guān)聯(lián)的資源號
? nStyle:? ? 圖標(biāo)按鈕的風(fēng)格
????????????????常用的幾種如下:
????????????TBBS_BUTTON? 標(biāo)準(zhǔn)按鈕
TBBS_SEPARATOR? 分隔符
TBSTYLE_DROPDOWN? 帶有下箭頭的按鈕
? iImage:? ? 關(guān)聯(lián)建立的ImageList中圖形的索引值
*/
?
????m_wndToolBar.SetButtonInfo(0, ID_FILE_NEW, TBSTYLE_BUTTON, 0);
????m_wndToolBar.SetButtonText(0, "回退");
????m_wndToolBar.SetButtonInfo(1, ID_FILE_OPEN, TBSTYLE_BUTTON , 1);
????m_wndToolBar.SetButtonText(1, "前進(jìn)");
????m_wndToolBar.SetButtonInfo(2, ID_FILE_SAVE, TBSTYLE_BUTTON|TBBS_SEPARATOR? , 2);
????m_wndToolBar.SetButtonText(2, "停止");
????m_wndToolBar.SetButtonInfo(3, ID_FILE_PRINT_SETUP, TBSTYLE_BUTTON | TBSTYLE_DROPDOWN, 3);
????m_wndToolBar.SetButtonText(3, "打印設(shè)置");
????CRect rectToolBar;
????// 設(shè)置工具條大小
????m_wndToolBar.GetItemRect(0, &rectToolBar);
????m_wndToolBar.SetSizes(rectToolBar.Size(), CSize(30,20));
????// 創(chuàng)建
????if (!m_wndAddress.Create(CBS_DROPDOWN | WS_CHILD, CRect(0, 0, 200, 120), this, AFX_IDW_TOOLBAR + 1))
????{
????????TRACE0("Failed to create combobox ");
????????return -1;? ? ? // fail to create
????}
????COMBOBOXEXITEM item;
????item.mask = CBEIF_TEXT;
????item.iItem = -1;
????item.pszText = "健松思想";
????m_wndAddress.InsertItem(&item);
????if (!m_wndReBar.Create(this))
????{
????????TRACE0("Failed to create rebar ");
????????return -1;? ? ? // fail to create
????}
????// 將工具條和生成的輸入框加入CReBar對象,集中顯示在工具條區(qū)域
????m_wndReBar.AddBar(&m_wndToolBar);
????m_wndReBar.AddBar(&m_wndAddress, "地址", NULL, RBBS_FIXEDBMP | RBBS_BREAK);
????return 0;
}
????到此,運行程序,已經(jīng)可以看到一個類似IE4.0的程序出來了。但是下拉式圖標(biāo)按鈕并沒有顯示出下拉菜單,也沒有對輸入框進(jìn)行消息響應(yīng)。繼續(xù)修改程序如下:
5.????制作菜單IDR_PRINT_POPUP
6.????在MainFrame.h加入
????afx_msg void OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult);
在MainFrame.cpp中的MESSAGE_MAP加入消息映射
????ON_NOTIFY(TBN_DROPDOWN, AFX_IDW_TOOLBAR, OnDropDown)
和處理函數(shù)體:
void CMainFrame::OnDropDown(NMHDR* pNotifyStruct, LRESULT* pResult)
{
????// this function handles the dropdown menus from the toolbar
????NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNotifyStruct;
????CRect rect;
????// translate the current toolbar item rectangle into screen coordinates
????// so that we'll know where to pop up the menu
????m_wndToolBar.GetToolBarCtrl().GetRect(pNMToolBar->iItem, &rect);
????rect.top = rect.bottom;
????::ClientToScreen(pNMToolBar->hdr.hwndFrom, &rect.TopLeft());
????if(pNMToolBar->iItem == ID_FILE_PRINT_SETUP)
????{
????????CMenu menu;
????????CMenu* pPopup;
????????// the font popup is stored in a resource
????????menu.LoadMenu(IDR_PRINT_POPUP);
????????pPopup = menu.GetSubMenu(0);
????????pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left, rect.top + 1, AfxGetMainWnd());
????}
????*pResult = TBDDRET_DEFAULT;
}
7.????處理對Combox的響應(yīng),這里只對內(nèi)容改變的消息進(jìn)行處理,若要添加別的處理,參看Combo Box Handlers的消息映射。
在MainFrame.h中加入????afx_msg void OnNewAddress();
在MainFrame.cpp中的MESSAGE_MAP中加入消息映射
????ON_CBN_SELENDOK(AFX_IDW_TOOLBAR + 1,OnNewAddress)
同時加入函數(shù)體
void CMainFrame::OnNewAddress()
{
????CString str;
????ShellExecute(NULL,"OPEN" ,"http://jonson.126.com",NULL,NULL,SW_SHOW);
}
總結(jié)
以上是生活随笔為你收集整理的VC制作类似于IE4的酷工具条的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [蓝桥小记]蓝桥杯参赛经历分享
- 下一篇: C/C++基础语法