VC制作类似于IE4的酷工具条
生活随笔
收集整理的這篇文章主要介紹了
VC制作类似于IE4的酷工具条
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
用VC制作工具條的方法很多,本文提供一種制作類似于IE4.0的工具條。能實現鼠標移上圖標時,圖標變為彩色,在工具條的位置,能停擺幾種工具條。具體原理解釋見步驟過程。
步驟如下:
1.????運行AppWizard,選擇Single Document,其余選缺省設置。
2.????點擊Insert Resource ,加入兩條Bitmap,定義為:IDB_COLDTOOLBAR和IDB_HOTTOOLBAR
3.????在CMainFrame中加入成員變量:
????CReBar? ? ? m_wndReBar;????????????
????CComboBoxEx m_wndAddress;
4.????修改CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函數如下:
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);? ? //設置工具條按鈕大小
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//創建鼠標移上時的圖標列表
????img.Create(IDB_HOTTOOLBAR, 22, 0, RGB(255, 0, 255));????????m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
????img.Detach();
//創建無焦點的圖標列表
????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);
//設置要顯示的圖標數,可根據實際情況修改
????m_wndToolBar.SetButtons(NULL, 9);
????//逐個設置圖標按鈕的屬性
/*SetButtonInfo(( int nIndex, UINT nID, UINT nStyle, int iImage ); 參數如下:
? nIndex :? 圖標按鈕的索引值
? nID:????????圖標按鈕關聯的資源號
? nStyle:? ? 圖標按鈕的風格
????????????????常用的幾種如下:
????????????TBBS_BUTTON? 標準按鈕
TBBS_SEPARATOR? 分隔符
TBSTYLE_DROPDOWN? 帶有下箭頭的按鈕
? iImage:? ? 關聯建立的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, "前進");
????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, "打印設置");
????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 ");
????????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對象,集中顯示在工具條區域
????m_wndReBar.AddBar(&m_wndToolBar);
????m_wndReBar.AddBar(&m_wndAddress, "地址", NULL, RBBS_FIXEDBMP | RBBS_BREAK);
????return 0;
}
????到此,運行程序,已經可以看到一個類似IE4.0的程序出來了。但是下拉式圖標按鈕并沒有顯示出下拉菜單,也沒有對輸入框進行消息響應。繼續修改程序如下:
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)
和處理函數體:
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的響應,這里只對內容改變的消息進行處理,若要添加別的處理,參看Combo Box Handlers的消息映射。
在MainFrame.h中加入????afx_msg void OnNewAddress();
在MainFrame.cpp中的MESSAGE_MAP中加入消息映射
????ON_CBN_SELENDOK(AFX_IDW_TOOLBAR + 1,OnNewAddress)
同時加入函數體
void CMainFrame::OnNewAddress()
{
????CString str;
????ShellExecute(NULL,"OPEN" ,"http://jonson.126.com",NULL,NULL,SW_SHOW);
}
步驟如下:
1.????運行AppWizard,選擇Single Document,其余選缺省設置。
2.????點擊Insert Resource ,加入兩條Bitmap,定義為:IDB_COLDTOOLBAR和IDB_HOTTOOLBAR
3.????在CMainFrame中加入成員變量:
????CReBar? ? ? m_wndReBar;????????????
????CComboBoxEx m_wndAddress;
4.????修改CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函數如下:
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);? ? //設置工具條按鈕大小
m_wndToolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);
//創建鼠標移上時的圖標列表
????img.Create(IDB_HOTTOOLBAR, 22, 0, RGB(255, 0, 255));????????m_wndToolBar.GetToolBarCtrl().SetHotImageList(&img);
????img.Detach();
//創建無焦點的圖標列表
????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);
//設置要顯示的圖標數,可根據實際情況修改
????m_wndToolBar.SetButtons(NULL, 9);
????//逐個設置圖標按鈕的屬性
/*SetButtonInfo(( int nIndex, UINT nID, UINT nStyle, int iImage ); 參數如下:
? nIndex :? 圖標按鈕的索引值
? nID:????????圖標按鈕關聯的資源號
? nStyle:? ? 圖標按鈕的風格
????????????????常用的幾種如下:
????????????TBBS_BUTTON? 標準按鈕
TBBS_SEPARATOR? 分隔符
TBSTYLE_DROPDOWN? 帶有下箭頭的按鈕
? iImage:? ? 關聯建立的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, "前進");
????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, "打印設置");
????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 ");
????????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對象,集中顯示在工具條區域
????m_wndReBar.AddBar(&m_wndToolBar);
????m_wndReBar.AddBar(&m_wndAddress, "地址", NULL, RBBS_FIXEDBMP | RBBS_BREAK);
????return 0;
}
????到此,運行程序,已經可以看到一個類似IE4.0的程序出來了。但是下拉式圖標按鈕并沒有顯示出下拉菜單,也沒有對輸入框進行消息響應。繼續修改程序如下:
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)
和處理函數體:
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的響應,這里只對內容改變的消息進行處理,若要添加別的處理,參看Combo Box Handlers的消息映射。
在MainFrame.h中加入????afx_msg void OnNewAddress();
在MainFrame.cpp中的MESSAGE_MAP中加入消息映射
????ON_CBN_SELENDOK(AFX_IDW_TOOLBAR + 1,OnNewAddress)
同時加入函數體
void CMainFrame::OnNewAddress()
{
????CString str;
????ShellExecute(NULL,"OPEN" ,"http://jonson.126.com",NULL,NULL,SW_SHOW);
}
總結
以上是生活随笔為你收集整理的VC制作类似于IE4的酷工具条的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [蓝桥小记]蓝桥杯参赛经历分享
- 下一篇: C/C++基础语法