我现在知道用deskBand可以在任务条上面加上那个工具条。我现在的问题是
1。怎么在vc里面调试。debug
别的可以用ie来调试,可是加载工具条上的不行。2。一般的显示不显示的控制是通过任务条的弹出菜单选择的。
我想要像google那样在工具条上加上个菜单,一选择就能切换不同的显示模式。3。任务条上工具条的位置变了话,我的工具条中的ComboBox的大小改变,其他的按钮不变。
在DeskBand中,我怎么得到变化位置。
是这个 IDockingWindow::ResizeBorderDW 吗?
怎么用
大侠们一定要帮帮我。
有门路的就露两手,(~o~)(^^)/~~~(^_^)/~
感兴趣的进来捧个人场。(^_-)(^^;)
1。怎么在vc里面调试。debug
别的可以用ie来调试,可是加载工具条上的不行。2。一般的显示不显示的控制是通过任务条的弹出菜单选择的。
我想要像google那样在工具条上加上个菜单,一选择就能切换不同的显示模式。3。任务条上工具条的位置变了话,我的工具条中的ComboBox的大小改变,其他的按钮不变。
在DeskBand中,我怎么得到变化位置。
是这个 IDockingWindow::ResizeBorderDW 吗?
怎么用
大侠们一定要帮帮我。
有门路的就露两手,(~o~)(^^)/~~~(^_^)/~
感兴趣的进来捧个人场。(^_-)(^^;)
The Quick Launch Bar 和我注册的放上去得不一样吧.
自己放上去得是一个DeskBand object。
那个quick launch bar是windows已经实现预定好的。
一样吗
请给点具体的说法。
谢谢大侠。
例子:
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
#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;
}
//
// 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;
}
//
// 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);
}
}
/************************************************************************** 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);
}
非常感谢你的代码,这些我都实现了。不过实现上面的部分,只能在任务栏的Contextmenu的工具栏菜单中显示和不显示我添加的band工具栏。
我现在要做的是从shell里面得到我添加的band工具条显示了还是没显示。
如果没显示,我怎么通知shell给我把它显示出来。另外就是用户拖动了我的band工具条,我要知道他拖动了多少,
然后改变我的工具栏上面的Combobox的大小,
我觉得是用IDockingWindow::ResizeBorderDW,
不知道对不对,而且我也不知道怎么用。
http://www.vckbase.com/code/downcode.asp?id=1682