我想要一个像google桌面检索那样的工具条

yl5248 2006-02-08 01:30:50
我现在知道用deskBand可以在任务条上面加上那个工具条。

我现在的问题是
1。怎么在vc里面调试。debug
别的可以用ie来调试,可是加载工具条上的不行。

2。一般的显示不显示的控制是通过任务条的弹出菜单选择的。
我想要像google那样在工具条上加上个菜单,一选择就能切换不同的显示模式。

3。任务条上工具条的位置变了话,我的工具条中的ComboBox的大小改变,其他的按钮不变。
在DeskBand中,我怎么得到变化位置。
是这个 IDockingWindow::ResizeBorderDW 吗?
怎么用


大侠们一定要帮帮我。
有门路的就露两手,(~o~)(^^)/~~~(^_^)/~
感兴趣的进来捧个人场。(^_-)(^^;)
...全文
186 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yl5248 2006-02-09
  • 打赏
  • 举报
回复
>wangk(倒之)
非常感谢你的代码,这些我都实现了。

不过实现上面的部分,只能在任务栏的Contextmenu的工具栏菜单中显示和不显示我添加的band工具栏。
我现在要做的是从shell里面得到我添加的band工具条显示了还是没显示。
如果没显示,我怎么通知shell给我把它显示出来。

另外就是用户拖动了我的band工具条,我要知道他拖动了多少,
然后改变我的工具栏上面的Combobox的大小,
我觉得是用IDockingWindow::ResizeBorderDW,
不知道对不对,而且我也不知道怎么用。

wangk 2006-02-09
  • 打赏
  • 举报
回复
例子:
http://www.vckbase.com/code/downcode.asp?id=1682
wangk 2006-02-08
  • 打赏
  • 举报
回复

/**************************************************************************

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);
}
wangk 2006-02-08
  • 打赏
  • 举报
回复
///////////////////////////////////////////////////////////////////////////
//
// 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);
}
}
wangk 2006-02-08
  • 打赏
  • 举报
回复
///////////////////////////////////////////////////////////////////////////
//
// 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;
}
wangk 2006-02-08
  • 打赏
  • 举报
回复
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;
}
wangk 2006-02-08
  • 打赏
  • 举报
回复
你说的不是快捷工具栏啊?是自定义工具栏?
例子:
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
kelinwang19 2006-02-08
  • 打赏
  • 举报
回复
路过,关注,up
yl5248 2006-02-08
  • 打赏
  • 举报
回复
>wangk(倒之)
The Quick Launch Bar 和我注册的放上去得不一样吧.
自己放上去得是一个DeskBand object。
那个quick launch bar是windows已经实现预定好的。
一样吗
请给点具体的说法。
谢谢大侠。
wangk 2006-02-08
  • 打赏
  • 举报
回复
The IShellFolderBand interface is used to manage folder bands. The Quick Launch bar is an example of a folder band.
HelloIvan2005 2006-02-08
  • 打赏
  • 举报
回复
guan zhu

15,976

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧