如何在工具栏上添加平面下拉控件
作者:
效果图如下:
使用过WordXP的人都知道,她的界面可谓是耳目一新。尤其是她的菜单和工具条可真是酷。网上也有很多很多的人都在模仿着她,包括很多的软件公司的产品。她的出现,使得软件界刮起了一陈XP界面时尚风。废话就不再多话了,言归正题,下面我就将实现的步骤一步步地告诉给你。
第一步:新建一个单文档项目
第二步:到资源编辑器中,新增一个工具项。里面没内容的,资源就命名为ID_TOOL_ZOOM吧。呵呵,新增一个工具项与我的下拉控件有什么关系呀?当然有关系,因为一会那个下拉控件就是在这个位置上显示出来的。
第三步:派生新类,从CToolBar派生,类名就叫CMainToolBar。怎样派生,我只提示你一下,菜单Insert->New Class…。在Class
Type中选Generic Class,如果不选的话…你试试吧。
第四步:由于我们要有一个下拉框,所以呢得在CMainToolBar中声明一个CComboBox对象,声明如下:
public:
CComboBox m_wndZoom;
第五步:用新类代替旧类。替换之前,得将新类的声明文件包含进来,在MainFrm.h文件上,加上这句#include "MainToolBar.h"。然找到
CToolBar m_wndToolBar;用CMainToolBar 代替CToolBar。
第六步:在CMainFrm的OnCreate函数最后(当然是return 0之前了),添加下面的代码:
int index = 0;
RECT rect;
//找到指定的工具项
while(m_wndToolBar.GetItemID(index)!=ID_TOOL_ZOOM)
index++;
//设置指定工具项的宽度并获取新的区域 80是宽度
m_wndToolBar.SetButtonInfo(index, ID_TOOL_ZOOM, TBBS_SEPARATOR, 80);
m_wndToolBar.GetItemRect(index, &rect);
//设置位置
rect.top+=2;
rect.bottom += 200;
// 创建并显示控件
if(!m_wndToolBar.m_wndZoom.Create(WS_CHILD|WS_VISIBLE| CBS_AUTOHSCROLL| CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect,
&m_wndToolBar, ID_TOOL_ZOOM))
{
TRACE0("Failed to create combo-box\n");
return FALSE;
}
m_wndToolBar.m_wndZoom.ShowWindow(SW_SHOW);
//填充内容
m_wndToolBar.m_wndZoom.AddString("25%");
m_wndToolBar.m_wndZoom.AddString("50%");
m_wndToolBar.m_wndZoom.AddString("75%");
m_wndToolBar.m_wndZoom.AddString("100%");
m_wndToolBar.m_wndZoom.AddString("125%");
m_wndToolBar.m_wndZoom.AddString("150%");
m_wndToolBar.m_wndZoom.AddString("175%");
m_wndToolBar.m_wndZoom.AddString("200%");
//选择默认项
m_wndToolBar.m_wndZoom.SetCurSel(3);
添加好了,运行一遍看看。呵,真的可以。不过,还存在着三个问题还需解决,一:工具条不够高。二:下列框不是平面控件。三:如何处理消息。下面我在一一解决:
问题一:工具条不够高
解决特别容易,进入资源管理器,打开工具。随便找个工具项,设置其Height属性为20。这样工具条就增高了。
问题二:下列框不是平面控件 这个也容易解决,用别人的类就行了。我在这用的是Kirk Stowell的CFlatComboBox。示例程序已经包含这个类进来了。用ProjectàAdd
to ProjectàFile…将FlatComboBox.h和FlatComboBox.Cpp文件添加进工程中。然后到MainToolBar.h中将CFlatComboBox类包含进来,当然是用#include
"FlatComboBox.h"。最后用CFlatComboBox类代替CComboBox 类。 重新编译,运行一遍看看,是不是平面了?
问题三:如何处理消息 是啊,到现在为至。这控件只能看,不能用,有什么意义呢。所以我们还得处理他的消息,让他有活可干。我们不能指望着ClassWizard能帮上我们什么忙,因为ClassWizard上看不到这个消息,所以一切都得靠我们自己。
在CMainFrm类上,我们要在protected里添加afx_msg void OnSelectZoomed();函数。然后转到MainFrm.cpp文件上,找到BEGIN_MESSAGE_MAP,增加一句ON_CBN_SELENDOK(ID_TOOL_ZOOM,
OnSelectZoomed)。然后呢,当然就是要实现它的处理函数了,处理函数如下:
void CMainFrame::OnSelectZoomed()
{
//获取到内容并MSGBOX显示出来
CString strContent;
m_wndToolBar.m_wndZoom.GetWindowText(strContent);
AfxMessageBox(strContent); //弹出选择的内容
}
小功告成,然后又是编译、运行。看看界面,确实是平面的、有控控件的工具条。
作者注:很久没写作文了,这是我出社会后写的第一篇作文,写的不好请多多包涵!
我的Email是lijf971@21cn.com 有什么好东西希望能发个给我
--------------------next---------------------
当工具栏按钮大小大于16x16时,在重绘的区域会出现工具栏的分割线,该如何解决呢? ( Mecland 发表于 2007-3-22 9:02:00)
若使用图象,要选择comboxex ( hchdown 发表于 2005-11-9 23:14:00)
每使用create后,若再使用,需要新建一个combobox对象 ( hchdown 发表于 2005-11-9 23:10:00)
请问如何将combobox中的文字替换成像word中直线宽度选择的combobox ( steron 发表于 2004-5-26 8:25:00)
谢谢
我已搞定,不好意思,我是菜鸟 ( duxianghe 发表于 2004-3-11 16:29:00)
我如何在doc里得到这个控件的值呢?
大家有什么好方法,不要用全局变量。 ( duxianghe 发表于 2004-3-11 15:05:00)
好像第一期就有一样的文章,不过用的方法也一样,还是不知道怎么解决啊,惨啊 ( silence2k 发表于 2004-3-10 16:52:00)
怎么不能加入多个下拉控件,求教,
问题应该出在,生成一个下拉控件后,第二个再使用Create函数出错,应该不能再调用新建函数,那该怎么处理呢,急用,谢谢。lining111@yahoo.com.cn ( silence2k 发表于 2004-3-10 15:46:00)
用下拉控健覆盖按钮? ( 西门冒烟 发表于 2003-9-23 10:48:00)
.......................................................
--------------------next---------------------