问题解决,立即结贴,最迟3天内结。
谢谢大家,帮忙啊!!

解决方案 »

  1.   

    28 为工具栏添加非按钮控件策略
    要放置别的控件窗口或任何子窗口到一个工具栏中,首先必须通知工具栏,在要放置窗
    口的地方放置一个足够大的间隔,然后在该位置手工创建一个控件窗口;要保持使用To o l B a r
    E d i t o r编辑该工具栏的能力,必须创建一个特殊的工具栏按钮I D,当它被一个工具栏按钮使用
    时,可以用软件改变成一个组合框。该功能被封装到工具栏类中。
    步骤
    1. 创建一个新的工具栏类
    1) 用C l a s s Wi z a r d创建一个从C To o l B a r C t r l派生的工具栏类,然后用文本编辑器( Te x t
    E d i t o r)在创建的. c p p和. h文件中用C To o l B a r替换C To o l B a r C t r l。
    2) 添加一个叫做L o a d ToolBarEx( )的新函数到该类。
    BOOL CwzdTo o l B a r : : L o a d ToolBarEx (UINT id)
    3) 在L o a d ToolBarEx( )中,开始处用C To o l B a r : : L o a d ToolBar( )装入一个工具栏资源:
    // load toolbar info
    BOOL bRet;
    b R e t = C To o l B a r : : L o a d To o l B a r ( i d ) ;
    4) 接着,寻找一个特殊的按钮命令I D,本例中称为I D C _ W Z D _ C O M B O。一个使用工具
    栏编辑器创建的具有该I D的工具栏按钮,将被该新的工具栏类转变为一个组合框。在工具栏
    中寻找该I D,使用下面代码:
    // find where our combo box will go
    int pos=CommandTo I n d e x ( I D C _ W Z D _ C O M B O ) ;
    5) 然后,用下面的代码把该工具栏按钮转变为一个非常宽的间隔。
    // covert button in toolbar into a spacer for our combo box
    S e t B u t t o n I n f o ( p o s , I D C _ W Z D _ C O M B O , T B B S _ S E PA R ATO R , C O M B O L E N ) ;
    这里的C O M B O L E N是间隔以像素为单位的大小。
    6) 在L o a d ToolBarEx( )中的最后一步是,在创建间隔的地方创建一个控件窗口。
    // create combo box
    CRect rect;
    G e t I t e m R e c t ( p o s , & r e c t ) ;
    rect.bottom+=COMBODROP; //how far will combo drop down?
    m _ c t r l W z d C o m b o . C r e a t e ( W S _ C H I L D | W S _ V I S I B L E | C B S _ D R O P D O W N L I S T,
    rect, this, IDC_WZD_COMBO);
    7) 还应在该工具栏类中处理所有来自该组合框的控件通知,但是必须手工添加它们。
    第7章工具栏和状态栏133
    下载
    本节的“清单—工具栏类”显示了怎样完成该步工作。
    2. 执行新的工具栏类
    1) 在C M a i n F r a m e中,用该新的工具栏类替换任何一个当前使用的工具栏类;在本例中,
    把所有对C To o l B a r的引用变为C W z d To o l B a r,然后在CMainFrame( ) 的OnCreate( ) 中把
    L o a d ToolBar( )改为L o a d ToolBarEx( )。
    2) 使用Toolbar Editor在想要插入一个组合框的位置为工具栏添加一个新按钮,并赋予该
    按钮前面指定的特殊的命令I D,本例中是I D C _ W Z D _ C O M B O。应用程序中的多个工具栏可
    以共享该相同的特殊按钮I D。
    说明
    ■ 还可以用该方法添加其他控件到一个工具栏中,只要它们的尺寸能放进工具栏中,包
    括按钮(下压、复选和单选)、进度指示控件、编辑框、静态控件和新的日期/时间控件。
    ■ 一个工具栏最初看起来好象是一个具有一些子窗口按钮的父窗口,事实上它是一个自
    身绘制了许多“按钮”的大的控件窗口,并为这些按钮处理所有的鼠标动作。
    CD说明
    在C D上执行该工程时,将在工具栏中看到一个新的组合框。
    清单—工具栏类
    # i f
    ! d e f i n e d ( A F X _ W Z D TO O L B A R _ H _ _ 2 7 6 4 9 E 3 1 _ C 8 0 7 _ 11 D 1 _ 9 B 5 D _ 0 0 A A 0 0 3 D 8 6 9 5 _ _ I N C L U D E D _ )
    #define AFX_WZDTO O L B A R _ H _ _ 2 7 6 4 9 E 3 1 _ C 8 0 7 _ 11 D 1 _ 9 B 5 D _ 0 0 A A 0 0 3 D 8 6 9 5 _ _ I N C L U D E D _
    #if _MSC_VER >= 1000
    #pragma once
    #endif // _MSC_VER >= 1000
    // WzdTo o l B a r.h : header file
    / /
    / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
    // CWzdToolBar window
    class CWzdToolBar : public CTo o l B a r
    {
    // Construction
    p u b l i c :
    C W z d To o l B a r ( ) ;
    BOOL LoadToolBarEx(UINT id);
    // Attributes
    p u b l i c :
    // Operations
    134 第二部分用户界面实例
    下载
    p u b l i c :
    // Overrides
    // ClassWizard generated virtual function overrides
    / / { { A F X _ V I RT U A L ( C W z d To o l B a r )
    / / } } A F X _ V I RT U A L
    // Implementation
    p u b l i c :
    virtual ~CWzdTo o l B a r ( ) ;
    // Generated message map functions
    p r o t e c t e d :
    / / { { A F X _ M S G ( C W z d To o l B a r )
    / / } } A F X _ M S G
    afx_msg void OnDropdownCombo();
    afx_msg void OnCloseupCombo();
    D E C L A R E _ M E S S A G E _ M A P ( )
    p r i v a t e :
    CString m_sSelection;
    CComboBox m_ctrlWzdCombo;
    } ;
    / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
    / / { { A F X _ I N S E RT _ L O C AT I O N } }
    // Microsoft Developer Studio will insert additional declarations immediately
    // before the previous line.
    # e n d i f
    // !defined(AFX_WZDTO O L B A R _ H _ _ 2 7 6 4 9 E 3 1 _ C 8 0 7 _ 11 D 1 _ 9 B 5 D _ 0 0 A A 0 0 3 D 8 6 9 5 _ _ I N C L U D E D _ )
    // WzdTo o l B a r.cpp : implementation file
    / /
    #include "s t d a f x . h"
    #include "w z d . h"
    #include "W z d To o l B a r. h"
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    # e n d i f
    #define COMBOPOS 3 // position of combo box in toolbar
    #define COMBOLEN 120 // length of combo box in pixels
    #define COMBODROP 100 // length of drop of combo box in pixels
    第7章工具栏和状态栏135
    下载
    / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
    // CWzdTo o l B a r
    C W z d To o l B a r : : C W z d To o l B a r ( )
    {
    m _ s S e l e c t i o n = _ T ("") ;
    }
    C W z d To o l B a r : : ~ C W z d To o l B a r ( )
    { }
    B E G I N _ M E S S A G E _ M A P ( C W z d To o l B a r, CTo o l B a r )
    / / { { A F X _ M S G _ M A P ( C W z d To o l B a r )
    / / } } A F X _ M S G _ M A P
    ON_CBN_CLOSEUP(IDC_WZD_COMBO, OnCloseupCombo)
    ON_CBN_DROPDOWN(IDC_WZD_COMBO, OnDropdownCombo)
    E N D _ M E S S A G E _ M A P ( )
    / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
    // CWzdToolBar message handlers
    BOOL CWzdTo o l B a r : : L o a d ToolBarEx(UINT id)
    {
    // load toolbar info
    BOOL bRet;
    b R e t = C To o l B a r : : L o a d To o l B a r ( i d ) ;
    // find where our combo box will go
    int pos=CommandTo I n d e x ( I D C _ W Z D _ C O M B O ) ;
    // covert button in toolbar into a spacer for our combo box
    S e t B u t t o n I n f o ( p o s , I D C _ W Z D _ C O M B O , T B B S _ S E PA R ATO R , C O M B O L E N ) ;
    // create combo box
    CRect rect;
    G e t I t e m R e c t ( p o s , & r e c t ) ;
    rect.bottom+=COMBODROP; //how far will combo drop down?
    m _ c t r l W z d C o m b o . C r e a t e ( W S _ C H I L D | W S _ V I S I B L E | C B S _ D R O P D O W N L I S T, rect, this,
    I D C _ W Z D _ C O M B O ) ;
    return bRet;
    }
    void CWzdTo o l B a r : : O n D r o p d o w n C o m b o ( )
    {
    m _ c t r l W z d C o m b o . R e s e t C o n t e n t ( ) ;
    m _ c t r l W z d C o m b o . A d d S t r i n g ("M o n d a y") ;
    m _ c t r l W z d C o m b o . A d d S t r i n g ("Tu e s d a y") ;
    m _ c t r l W z d C o m b o . A d d S t r i n g ("We d n e s d a y") ;
    m _ c t r l W z d C o m b o . S e l e c t S t r i n g ( - 1 , m _ s S e l e c t i o n ) ;
    }
    void CWzdTo o l B a r : : O n C l o s e u p C o m b o ( )
    {
    int i;
    if ((i=m_ctrlWzdCombo.GetCurSel())!=CB_ERR)
    {
    m _ c t r l W z d C o m b o . G e t L B Text(i, m_sSelection);
    }
    e l s e
    {
    m _ c t r l W z d C o m b o . A d d S t r i n g ( m _ s S e l e c t i o n ) ;
    m _ c t r l W z d C o m b o . S e l e c t S t r i n g ( - 1 , m _ s S e l e c t i o n ) ;
    }
    }