• 如何在工具栏上添加平面下拉控件


    原创文档 本文适合初级读者 已阅读29801次 ] 转播到腾讯微博    
     

    如何在工具栏上添加平面下拉控件
    作者:黎锦凡

    下载本文示例代码

    效果图如下:


    使用过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 有什么好东西希望能发个给我

    代码:

    MainToolBar.h

    #pragma once


    // CMainToolBar

    class CMainToolBar : public CToolBar
    {
    DECLARE_DYNAMIC(CMainToolBar)

    public:
    CMainToolBar();
    virtual ~CMainToolBar();

    protected:
    DECLARE_MESSAGE_MAP()

    public:
    CComboBox m_combox;
    };

    MainToolBar.cpp

    // MainToolBar.cpp : implementation file
    //

    #include "stdafx.h"
    #include "SingleDoc.h"
    #include "MainToolBar.h"


    // CMainToolBar

    IMPLEMENT_DYNAMIC(CMainToolBar, CToolBar)

    CMainToolBar::CMainToolBar()
    {

    }

    CMainToolBar::~CMainToolBar()
    {
    }


    BEGIN_MESSAGE_MAP(CMainToolBar, CToolBar)
    END_MESSAGE_MAP()



    // CMainToolBar message handlers

    MainFram.h

    // CToolBar m_wndToolBar;
    CMainToolBar m_wndToolBar;

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    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) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
    {
    TRACE0("Failed to create toolbar\n");
    return -1; // fail to create
    }

    if (!m_wndStatusBar.Create(this) ||
    !m_wndStatusBar.SetIndicators(indicators,
    sizeof(indicators)/sizeof(UINT)))
    {
    TRACE0("Failed to create status bar\n");
    return -1; // fail to create
    }

    // TODO: Delete these three lines if you don't want the toolbar to be dockable
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    EnableDocking(CBRS_ALIGN_ANY);
    DockControlBar(&m_wndToolBar);

    // maintoolbar
    int index = 0;
    RECT rect;
    //找到指定的工具项
    while(m_wndToolBar.GetItemID(index)!=IDD_HKX)
    index++;
    //设置指定工具项的宽度并获取新的区域 80是宽度
    m_wndToolBar.SetButtonInfo(index, IDD_HKX, TBBS_SEPARATOR, 80);
    m_wndToolBar.GetItemRect(index, &rect);

    //设置位置
    rect.top+=2;
    rect.bottom += 200;

    // 创建并显示控件

    if(!m_wndToolBar.m_combox.Create(WS_CHILD|WS_VISIBLE| CBS_AUTOHSCROLL| CBS_DROPDOWNLIST | CBS_HASSTRINGS , rect,
    &m_wndToolBar, IDD_HKX))
    {
    TRACE0("Failed to create combo-box\n");
    return FALSE;
    }
    m_wndToolBar.m_combox.ShowWindow(SW_SHOW);

    //填充内容

    m_wndToolBar.m_combox.AddString(TEXT("25%"));
    m_wndToolBar.m_combox.AddString(TEXT("50%"));
    m_wndToolBar.m_combox.AddString(TEXT("75%"));
    //m_wndToolBar.m_combox.AddString("100%");
    //m_wndToolBar.m_combox.AddString("125%");
    //m_wndToolBar.m_combox.AddString("150%");
    //m_wndToolBar.m_combox.AddString("175%");
    //m_wndToolBar.m_combox.AddString("200%");

    //选择默认项
    m_wndToolBar.m_combox.SetCurSel(3);






  • 相关阅读:
    flex
    导航守卫 -vue
    H5 History
    JSX -react
    插槽slot -vue
    js 模拟鼠标绘制方块
    js 模拟滚动条
    js 实现简易留言板功能
    js 实现端口列表话
    js 为数组编写该方法;indexOf
  • 原文地址:https://www.cnblogs.com/kex1n/p/2380735.html
Copyright © 2020-2023  润新知