|
|
VC制作类似于IE4的酷工具条 |
|
|
作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站 |
用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); }

|
|
相关文章:相关软件: |
|