我现在知道用deskBand可以在任务条上面加上那个工具条。我现在的问题是
1。怎么在vc里面调试。debug
   别的可以用ie来调试,可是加载工具条上的不行。2。一般的显示不显示的控制是通过任务条的弹出菜单选择的。
   我想要像google那样在工具条上加上个菜单,一选择就能切换不同的显示模式。3。任务条上工具条的位置变了话,我的工具条中的ComboBox的大小改变,其他的按钮不变。
   在DeskBand中,我怎么得到变化位置。
   是这个   IDockingWindow::ResizeBorderDW 吗?
   怎么用
大侠们一定要帮帮我。
有门路的就露两手,(~o~)(^^)/~~~(^_^)/~
感兴趣的进来捧个人场。(^_-)(^^;)

解决方案 »

  1.   

    The IShellFolderBand interface is used to manage folder bands. The Quick Launch bar is an example of a folder band.
      

  2.   

    >wangk(倒之) 
    The Quick Launch Bar 和我注册的放上去得不一样吧.
    自己放上去得是一个DeskBand object。
    那个quick launch bar是windows已经实现预定好的。
    一样吗
    请给点具体的说法。
    谢谢大侠。
      

  3.   

    你说的不是快捷工具栏啊?是自定义工具栏?
    例子:
    DeskBand.h#include <windows.h>
    #include <shlobj.h>extern HINSTANCE  g_hInst;
    extern UINT       g_DllRefCount;#define ARRAYSIZE(a)    (sizeof(a)/sizeof(a[0]))#ifndef DESKBAND_H
    #define DESKBAND_H#define DB_CLASS_NAME (TEXT("DeskBandSampleClass"))#define MIN_SIZE_X   10
    #define MIN_SIZE_Y   10#define IDM_COMMAND  0/**************************************************************************   CDeskBand class definition**************************************************************************/class CDeskBand : public IDeskBand, 
                      public IInputObject, 
                      public IObjectWithSite,
                      public IPersistStream,
                      public IContextMenu
    {
    protected:
       DWORD m_ObjRefCount;public:
       CDeskBand();
       ~CDeskBand();   //IUnknown methods
       STDMETHODIMP QueryInterface(REFIID, LPVOID*);
       STDMETHODIMP_(DWORD) AddRef();
       STDMETHODIMP_(DWORD) Release();   //IOleWindow methods
       STDMETHOD (GetWindow) (HWND*);
       STDMETHOD (ContextSensitiveHelp) (BOOL);   //IDockingWindow methods
       STDMETHOD (ShowDW) (BOOL fShow);
       STDMETHOD (CloseDW) (DWORD dwReserved);
       STDMETHOD (ResizeBorderDW) (LPCRECT prcBorder, IUnknown* punkToolbarSite, BOOL fReserved);   //IDeskBand methods
       STDMETHOD (GetBandInfo) (DWORD, DWORD, DESKBANDINFO*);   //IInputObject methods
       STDMETHOD (UIActivateIO) (BOOL, LPMSG);
       STDMETHOD (HasFocusIO) (void);
       STDMETHOD (TranslateAcceleratorIO) (LPMSG);   //IObjectWithSite methods
       STDMETHOD (SetSite) (IUnknown*);
       STDMETHOD (GetSite) (REFIID, LPVOID*);   //IPersistStream methods
       STDMETHOD (GetClassID) (LPCLSID);
       STDMETHOD (IsDirty) (void);
       STDMETHOD (Load) (LPSTREAM);
       STDMETHOD (Save) (LPSTREAM, BOOL);
       STDMETHOD (GetSizeMax) (ULARGE_INTEGER*);   //IContextMenu methods
       STDMETHOD (QueryContextMenu)(HMENU, UINT, UINT, UINT, UINT);
       STDMETHOD (InvokeCommand)(LPCMINVOKECOMMANDINFO);
       STDMETHOD (GetCommandString)(UINT, UINT, LPUINT, LPSTR, UINT);private:
    BOOL m_bFocus;
    HWND m_hwndParent;
    HWND m_hWnd;
    DWORD m_dwViewMode;
       DWORD m_dwBandID;
       IInputObjectSite *m_pSite;private:
    void FocusChange(BOOL);
       LRESULT OnKillFocus(void);
    LRESULT OnSetFocus(void);
    static LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam);
    LRESULT OnPaint(void);
    LRESULT OnCommand(WPARAM wParam, LPARAM lParam);
    LRESULT OnSize(LPARAM);
       BOOL RegisterAndCreateWindow(void);
    };#endif   //DESKBAND_H
      

  4.   

    DeskBand.cpp:
    #include "DeskBand.h"
    #include "Guid.h"/**************************************************************************   CDeskBand::CDeskBand()**************************************************************************/CDeskBand::CDeskBand()
    {
        m_pSite = NULL;
        
        m_hWnd = NULL;
        m_hwndParent = NULL;
        
        m_bFocus = FALSE;
        
        m_dwViewMode = 0;
        m_dwBandID = 0;
        
        m_ObjRefCount = 1;
        g_DllRefCount++;
    }/**************************************************************************   CDeskBand::~CDeskBand()**************************************************************************/CDeskBand::~CDeskBand()
    {
        // This should have been freed in a call to SetSite(NULL), but 
        // it is defined here to be safe.
        if(m_pSite)
        {
            m_pSite->Release();
            m_pSite = NULL;
        }
        
        g_DllRefCount--;
    }///////////////////////////////////////////////////////////////////////////
    //
    // IUnknown Implementation
    ///**************************************************************************   CDeskBand::QueryInterface**************************************************************************/STDMETHODIMP CDeskBand::QueryInterface(REFIID riid, LPVOID *ppReturn)
    {
        *ppReturn = NULL;
        
        //IUnknown
        if(IsEqualIID(riid, IID_IUnknown))
        {
            *ppReturn = this;
        }
        
        //IOleWindow
        else if(IsEqualIID(riid, IID_IOleWindow))
        {
            *ppReturn = (IOleWindow*)this;
        }
        
        //IDockingWindow
        else if(IsEqualIID(riid, IID_IDockingWindow))
        {
            *ppReturn = (IDockingWindow*)this;
        }   
        
        //IInputObject
        else if(IsEqualIID(riid, IID_IInputObject))
        {
            *ppReturn = (IInputObject*)this;
        }   
        
        //IObjectWithSite
        else if(IsEqualIID(riid, IID_IObjectWithSite))
        {
            *ppReturn = (IObjectWithSite*)this;
        }   
        
        //IDeskBand
        else if(IsEqualIID(riid, IID_IDeskBand))
        {
            *ppReturn = (IDeskBand*)this;
        }   
        
        //IPersist
        else if(IsEqualIID(riid, IID_IPersist))
        {
            *ppReturn = (IPersist*)this;
        }   
        
        //IPersistStream
        else if(IsEqualIID(riid, IID_IPersistStream))
        {
            *ppReturn = (IPersistStream*)this;
        }   
        
        //IContextMenu
        else if(IsEqualIID(riid, IID_IContextMenu))
        {
            *ppReturn = (IContextMenu*)this;
        }   
        
        if(*ppReturn)
        {
            (*(LPUNKNOWN*)ppReturn)->AddRef();
            return S_OK;
        }
        
        return E_NOINTERFACE;
    }                                             /**************************************************************************   CDeskBand::AddRef**************************************************************************/STDMETHODIMP_(DWORD) CDeskBand::AddRef()
    {
        return ++m_ObjRefCount;
    }
    /**************************************************************************   CDeskBand::Release**************************************************************************/STDMETHODIMP_(DWORD) CDeskBand::Release()
    {
        if(--m_ObjRefCount == 0)
        {
            delete this;
            return 0;
        }
       
        return m_ObjRefCount;
    }///////////////////////////////////////////////////////////////////////////
    //
    // IOleWindow Implementation
    ///**************************************************************************   CDeskBand::GetWindow()
       
    **************************************************************************/STDMETHODIMP CDeskBand::GetWindow(HWND *phWnd)
    {
        *phWnd = m_hWnd;
        
        return S_OK;
    }/**************************************************************************   CDeskBand::ContextSensitiveHelp()
       
    **************************************************************************/STDMETHODIMP CDeskBand::ContextSensitiveHelp(BOOL fEnterMode)
    {
        return E_NOTIMPL;
    }///////////////////////////////////////////////////////////////////////////
    //
    // IDockingWindow Implementation
    ///**************************************************************************   CDeskBand::ShowDW()
       
    **************************************************************************/STDMETHODIMP CDeskBand::ShowDW(BOOL fShow)
    {
        if(m_hWnd)
        {
            if(fShow)
            {
                //show our window
                ShowWindow(m_hWnd, SW_SHOW);
            }
            else
            {
                //hide our window
                ShowWindow(m_hWnd, SW_HIDE);
            }
        }
        
        return S_OK;
    }/**************************************************************************   CDeskBand::CloseDW()
       
    **************************************************************************/STDMETHODIMP CDeskBand::CloseDW(DWORD dwReserved)
    {
        ShowDW(FALSE);
        
        if(IsWindow(m_hWnd))
            DestroyWindow(m_hWnd);
        
        m_hWnd = NULL;
           
        return S_OK;
    }/**************************************************************************   CDeskBand::ResizeBorderDW()
       
    **************************************************************************/STDMETHODIMP CDeskBand::ResizeBorderDW(   LPCRECT prcBorder, 
                                              IUnknown* punkSite, 
                                              BOOL fReserved)
    {
        // This method is never called for Band Objects.
        return E_NOTIMPL;
    }
      

  5.   

    ///////////////////////////////////////////////////////////////////////////
    //
    // IInputObject Implementation
    ///**************************************************************************   CDeskBand::UIActivateIO()
       
    **************************************************************************/STDMETHODIMP CDeskBand::UIActivateIO(BOOL fActivate, LPMSG pMsg)
    {
        if(fActivate)
            SetFocus(m_hWnd);
        
        return S_OK;
    }/**************************************************************************   CDeskBand::HasFocusIO()
       
       If this window or one of its decendants has the focus, return S_OK. Return 
       S_FALSE if neither has the focus.**************************************************************************/STDMETHODIMP CDeskBand::HasFocusIO(void)
    {
        if(m_bFocus)
            return S_OK;
        
        return S_FALSE;
    }/**************************************************************************   CDeskBand::TranslateAcceleratorIO()
       
       If the accelerator is translated, return S_OK or S_FALSE otherwise.**************************************************************************/STDMETHODIMP CDeskBand::TranslateAcceleratorIO(LPMSG pMsg)
    {
        return S_FALSE;
    }///////////////////////////////////////////////////////////////////////////
    //
    // IObjectWithSite implementations
    ///**************************************************************************   CDeskBand::SetSite()
       
    **************************************************************************/STDMETHODIMP CDeskBand::SetSite(IUnknown* punkSite)
    {
        //If a site is being held, release it.
        if(m_pSite)
        {
            m_pSite->Release();
            m_pSite = NULL;
        }
        
        //If punkSite is not NULL, a new site is being set.
        if(punkSite)
        {
            //Get the parent window.
            IOleWindow  *pOleWindow;
        
            m_hwndParent = NULL;
           
            if(SUCCEEDED(punkSite->QueryInterface(IID_IOleWindow, 
                                                  (LPVOID*)&pOleWindow)))
            {
                pOleWindow->GetWindow(&m_hwndParent);
                pOleWindow->Release();
            }
        
            if(!m_hwndParent)
                return E_FAIL;
        
            if(!RegisterAndCreateWindow())
                return E_FAIL;
        
            //Get and keep the IInputObjectSite pointer.
            if(SUCCEEDED(punkSite->QueryInterface(IID_IInputObjectSite, 
                                                  (LPVOID*)&m_pSite)))
            {
                return S_OK;
            }
           
            return E_FAIL;
        }    return S_OK;
    }/**************************************************************************   CDeskBand::GetSite()
       
    **************************************************************************/STDMETHODIMP CDeskBand::GetSite(REFIID riid, LPVOID *ppvReturn)
    {
        *ppvReturn = NULL;
        
        if(m_pSite)
            return m_pSite->QueryInterface(riid, ppvReturn);
        
        return E_FAIL;
    }///////////////////////////////////////////////////////////////////////////
    //
    // IDeskBand implementation
    ///**************************************************************************   CDeskBand::GetBandInfo()
       
    **************************************************************************/STDMETHODIMP CDeskBand::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi)
    {
        if(pdbi)
        {
            m_dwBandID = dwBandID;
            m_dwViewMode = dwViewMode;
        
            if(pdbi->dwMask & DBIM_MINSIZE)
            {
                if(DBIF_VIEWMODE_FLOATING & dwViewMode)
                {
                    pdbi->ptMinSize.x = 200;
                    pdbi->ptMinSize.y = 400;
                }
                else
                {
                    pdbi->ptMinSize.x = MIN_SIZE_X;
                    pdbi->ptMinSize.y = MIN_SIZE_Y;
                }
            }
        
            if(pdbi->dwMask & DBIM_MAXSIZE)
            {
                pdbi->ptMaxSize.x = -1;
                pdbi->ptMaxSize.y = -1;
            }
        
            if(pdbi->dwMask & DBIM_INTEGRAL)
            {
                pdbi->ptIntegral.x = 1;
                pdbi->ptIntegral.y = 1;
            }
        
            if(pdbi->dwMask & DBIM_ACTUAL)
            {
                pdbi->ptActual.x = 100;
                pdbi->ptActual.y = 100;
            }
        
            if(pdbi->dwMask & DBIM_TITLE)
            {
                StringCchCopyW(pdbi->wszTitle, 256, L"Sample Desk Band");
            }
        
            if(pdbi->dwMask & DBIM_MODEFLAGS)
            {
                pdbi->dwModeFlags = DBIMF_NORMAL;
        
                pdbi->dwModeFlags |= DBIMF_VARIABLEHEIGHT;
            }
           
            if(pdbi->dwMask & DBIM_BKCOLOR)
            {
                //Use the default background color by removing this flag.
                pdbi->dwMask &= ~DBIM_BKCOLOR;
            }
        
            return S_OK;
        }
        
        return E_INVALIDARG;
    }///////////////////////////////////////////////////////////////////////////
    //
    // IPersistStream implementations
    // 
    // This is only supported to allow the desk band to be dropped on the 
    // desktop and to prevent multiple instances of the desk band from showing 
    // up in the shortcut menu. This desk band doesn't actually persist any data.
    ///**************************************************************************   CDeskBand::GetClassID()
       
    **************************************************************************/STDMETHODIMP CDeskBand::GetClassID(LPCLSID pClassID)
    {
        *pClassID = CLSID_SampleDeskBand;
        
        return S_OK;
    }/**************************************************************************   CDeskBand::IsDirty()
       
    **************************************************************************/STDMETHODIMP CDeskBand::IsDirty(void)
    {
        return S_FALSE;
    }/**************************************************************************   CDeskBand::Load()
       
    **************************************************************************/STDMETHODIMP CDeskBand::Load(LPSTREAM pStream)
    {
        return S_OK;
    }/**************************************************************************   CDeskBand::Save()
       
    **************************************************************************/STDMETHODIMP CDeskBand::Save(LPSTREAM pStream, BOOL fClearDirty)
    {
        return S_OK;
    }/**************************************************************************   CDeskBand::GetSizeMax()
       
    **************************************************************************/STDMETHODIMP CDeskBand::GetSizeMax(ULARGE_INTEGER *pul)
    {
        return E_NOTIMPL;
    }
      

  6.   

    ///////////////////////////////////////////////////////////////////////////
    //
    // IContextMenu Implementation
    ///**************************************************************************   CDeskBand::QueryContextMenu()**************************************************************************/STDMETHODIMP CDeskBand::QueryContextMenu(HMENU hMenu,
                                             UINT indexMenu,
                                             UINT idCmdFirst,
                                             UINT idCmdLast,
                                             UINT uFlags)
    {
        if(!(CMF_DEFAULTONLY & uFlags))
        {
            InsertMenu(hMenu, 
                       indexMenu, 
                       MF_STRING | MF_BYPOSITION, 
                       idCmdFirst + IDM_COMMAND, 
                       "&Desk Band Command");
        
            return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(IDM_COMMAND + 1));
        }
        
        return MAKE_HRESULT(SEVERITY_SUCCESS, 0, USHORT(0));
     }
        
    /**************************************************************************
        
       CDeskBand::InvokeCommand()
        
    **************************************************************************/
        
    STDMETHODIMP CDeskBand::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
    {
        switch (LOWORD(lpcmi->lpVerb))
        {
            case IDM_COMMAND:
                MessageBox(lpcmi->hwnd, 
                           TEXT("Desk Band Command selected."), 
                           TEXT("Sample Desk Band"), 
                           MB_OK | MB_ICONINFORMATION);
                break;
        
            default:
                return E_INVALIDARG;
        }
        
        return NOERROR;
    }/**************************************************************************   CDeskBand::GetCommandString()**************************************************************************/STDMETHODIMP CDeskBand::GetCommandString(UINT idCommand,
                                             UINT uFlags,
                                             LPUINT lpReserved,
                                             LPSTR lpszName,
                                             UINT uMaxNameLen)
    {
        HRESULT hr = E_INVALIDARG;
        
        switch(uFlags)
        {
            case GCS_HELPTEXT:
                switch(idCommand)
                {
                    case IDM_COMMAND:
                        lstrcpy(lpszName, TEXT("Desk Band command help text"));
                        hr = NOERROR;
                        break;
                }
                break;
           
           case GCS_VERB:
                switch(idCommand)
                {
                    case IDM_COMMAND:
                        lstrcpy(lpszName, TEXT("command"));
                        hr = NOERROR;
                        break;
                }
                break;
           
           case GCS_VALIDATE:
                hr = NOERROR;
                break;
        }
        
        return hr;
    }///////////////////////////////////////////////////////////////////////////
    //
    // private method implementations
    ///**************************************************************************   CDeskBand::WndProc()
       
    **************************************************************************/LRESULT CALLBACK CDeskBand::WndProc(HWND hWnd, 
                                        UINT uMessage, 
                                        WPARAM wParam, 
                                        LPARAM lParam)
    {
        CDeskBand *pThis = (CDeskBand*)GetWindowLong(hWnd, GWL_USERDATA);
        
        switch (uMessage)
        {
            case WM_NCCREATE:
            {
                LPCREATESTRUCT lpcs = (LPCREATESTRUCT)lParam;
                pThis = (CDeskBand*)(lpcs->lpCreateParams);
                SetWindowLong(hWnd, GWL_USERDATA, (LONG)pThis);
        
                //set the window handle
                pThis->m_hWnd = hWnd;
            }
            break;
           
            case WM_PAINT:
                return pThis->OnPaint();
           
            case WM_COMMAND:
                return pThis->OnCommand(wParam, lParam);
           
            case WM_SETFOCUS:
                return pThis->OnSetFocus();
        
            case WM_KILLFOCUS:
                return pThis->OnKillFocus();
           
            case WM_SIZE:
                return pThis->OnSize(lParam);
        }
        
        return DefWindowProc(hWnd, uMessage, wParam, lParam);
    }/**************************************************************************   CDeskBand::OnPaint()
       
    **************************************************************************/LRESULT CDeskBand::OnPaint(void)
    {
        PAINTSTRUCT ps;
        RECT        rc;
        
        BeginPaint(m_hWnd, &ps);
        
        GetClientRect(m_hWnd, &rc);
        SetTextColor(ps.hdc, RGB(0, 0, 0));
        SetBkMode(ps.hdc, TRANSPARENT);
        DrawText(ps.hdc, 
                 TEXT("Sample Desk Band"), 
                 -1, 
                 &rc, 
                 DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        
        EndPaint(m_hWnd, &ps);
        
        return 0;
    }/**************************************************************************   CDeskBand::OnCommand()
       
    **************************************************************************/LRESULT CDeskBand::OnCommand(WPARAM wParam, LPARAM lParam)
    {
        return 0;
    }/**************************************************************************   CDeskBand::OnSize()
       
    **************************************************************************/LRESULT CDeskBand::OnSize(LPARAM lParam)
    {
        int cx, cy;
        
        cx = LOWORD(lParam);
        cy = HIWORD(lParam);    return 0;
    }/**************************************************************************   CDeskBand::FocusChange()
       
    **************************************************************************/void CDeskBand::FocusChange(BOOL bFocus)
    {
        m_bFocus = bFocus;
        
        //inform the input object site that the focus has changed
        if(m_pSite)
        {
            m_pSite->OnFocusChangeIS((IDockingWindow*)this, bFocus);
        }
    }
      

  7.   


    /**************************************************************************   CDeskBand::OnSetFocus()
       
    **************************************************************************/LRESULT CDeskBand::OnSetFocus(void)
    {
        FocusChange(TRUE);
        
        return 0;
    }/**************************************************************************   CDeskBand::OnKillFocus()
       
    **************************************************************************/LRESULT CDeskBand::OnKillFocus(void)
    {
        FocusChange(FALSE);    return 0;
    }/**************************************************************************   CDeskBand::RegisterAndCreateWindow()
       
    **************************************************************************/BOOL CDeskBand::RegisterAndCreateWindow(void)
    {
        //If the window doesn't exist yet, create it now.
        if(!m_hWnd)
        {
            //Can't create a child window without a parent.
            if(!m_hwndParent)
            {
                return FALSE;
            }
        
            //If the window class has not been registered, then do so.
            WNDCLASS wc;
            if(!GetClassInfo(g_hInst, DB_CLASS_NAME, &wc))
            {
                ZeroMemory(&wc, sizeof(wc));
                wc.style          = CS_HREDRAW | CS_VREDRAW | CS_GLOBALCLASS;
                wc.lpfnWndProc    = (WNDPROC)WndProc;
                wc.cbClsExtra     = 0;
                wc.cbWndExtra     = 0;
                wc.hInstance      = g_hInst;
                wc.hIcon          = NULL;
                wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
                wc.hbrBackground  = (HBRUSH)CreateSolidBrush(RGB(192, 0, 0));
                wc.lpszMenuName   = NULL;
                wc.lpszClassName  = DB_CLASS_NAME;
              
                if(!RegisterClass(&wc))
                {
                    //If RegisterClass fails, CreateWindow below will fail.
                }
            }
        
            RECT  rc;
        
            GetClientRect(m_hwndParent, &rc);
        
            //Create the window. The WndProc will set m_hWnd.
            CreateWindowEx(0,
                           DB_CLASS_NAME,
                           NULL,
                           WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER,
                           rc.left,
                           rc.top,
                           rc.right - rc.left,
                           rc.bottom - rc.top,
                           m_hwndParent,
                           NULL,
                           g_hInst,
                           (LPVOID)this);
              
        }
        
        return (NULL != m_hWnd);
    }
      

  8.   

    >wangk(倒之) 
    非常感谢你的代码,这些我都实现了。不过实现上面的部分,只能在任务栏的Contextmenu的工具栏菜单中显示和不显示我添加的band工具栏。
    我现在要做的是从shell里面得到我添加的band工具条显示了还是没显示。
    如果没显示,我怎么通知shell给我把它显示出来。另外就是用户拖动了我的band工具条,我要知道他拖动了多少,
    然后改变我的工具栏上面的Combobox的大小,
    我觉得是用IDockingWindow::ResizeBorderDW,
    不知道对不对,而且我也不知道怎么用。
      

  9.   

    例子:
    http://www.vckbase.com/code/downcode.asp?id=1682