IE 下拉按钮






1.85/5 (8投票s)
2007年11月8日
3分钟阅读

37966

321
与 Skype IE 工具栏按钮类似,带有下拉箭头,支持 IE6 & IE7(多标签页)

引言
这个示例展示了如何添加 Internet Explorer 的下拉箭头按钮。
regsvr32 debug/dropbutton.dll
使用代码
LRESULT CIEToolbarWnd::OnCheckButton(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (m_isIE7)
{
return DefWindowProc(uMsg, wParam, lParam);
}
if (m_ParentWnd.GetButtonID() == (int)wParam)
{
BrowserWndInfo *pInfo = m_ParentWnd.GetBrowserWndInfo();
if (pInfo != NULL)
{
if (pInfo->nButtonState == TBSTATE_CHECKED)
{
lParam = MAKELONG(TRUE, 0);
}
else
{
lParam = MAKELONG(FALSE, 0);
}
}
}
}
LRESULT CIEToolbarWnd::OnAddString(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
LRESULT lResult = DefWindowProc(uMsg, wParam, lParam);
if (m_isIE7)
{
return lResult;
}
if ((int)wParam == 0)
{
LPWSTR strButtonText = (LPWSTR)lParam;
if (_tcscmp(BUTTON_NAME, strButtonText) == 0)
{
m_buttonStrIndex = lResult;
}
}
return lResult;
}
LRESULT CIEToolbarWnd::OnAddButton(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
LRESULT lResult = DefWindowProc(uMsg, wParam, lParam);
if (m_isIE7)
{
return lResult;
}
int nButtons = (int)wParam;
LPTBBUTTON pButtons = (LPTBBUTTON)lParam;
for (int i = 0; i < nButtons; i++)
{
if (pButtons[i].iString == m_buttonStrIndex)
{
m_ParentWnd.SetButtonID(pButtons[i].idCommand);
m_ParentWnd.NotifySetButtonInfo(pButtons[i].idCommand);
}
}
return lResult;
}
LRESULT CIEToolbarWnd::OnSetButtonInfo(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)
{
int iID = (int) wParam;
LPTBBUTTONINFO lptbbi = (LPTBBUTTONINFO)lParam;
int ButtonID = m_ParentWnd.GetButtonID();
if (ButtonID == -1)
{
if (lptbbi->pszText != NULL && wcscmp(lptbbi->pszText, L"DropButton") == 0)
{
ButtonID = iID;
m_ParentWnd.SetButtonID(ButtonID);
}
}
if (ButtonID == iID)
{
lptbbi->dwMask = lptbbi->dwMask | TBIF_STYLE | TBSTYLE_CHECK| TBIF_STATE;
lptbbi->fsStyle = lptbbi->fsStyle|BTNS_DROPDOWN |BTNS_CHECK;
BrowserWndInfo* pInfo = m_ParentWnd.GetBrowserWndInfo();
if (pInfo != NULL && pInfo->nButtonState == TBSTATE_CHECKED)
{
lptbbi->dwMask = lptbbi->dwMask | TBIF_STYLE | TBSTYLE_CHECK| TBIF_STATE;
lptbbi->fsStyle = lptbbi->fsStyle|BTNS_DROPDOWN |BTNS_CHECK;
lptbbi->fsState = TBSTATE_ENABLED|TBSTATE_CHECKED;
}
else
{
lptbbi->dwMask = lptbbi->dwMask | TBIF_STYLE | TBSTYLE_CHECK| TBIF_STATE;
lptbbi->fsStyle = lptbbi->fsStyle|BTNS_DROPDOWN |BTNS_CHECK;
lptbbi->fsState = TBSTATE_ENABLED;
}
}
return DefWindowProc(uMsg, wParam, lParam);
}
void CIEToolbarWnd::SubclassToolbar(IWebBrowser2 *pWB)
{
if (pWB == NULL)
{
return;
}
long hWnd = NULL;
pWB->get_HWND(&hWnd);
int nViewCount = m_arrayBrowserWndInfo.GetSize();
BrowserWndInfo *pBrowserWndInfo = new BrowserWndInfo;
if (pBrowserWndInfo == NULL)
{
return;
}
pBrowserWndInfo->pWebBrowser = pWB;
pBrowserWndInfo->nButtonState = 0;
pBrowserWndInfo->hBrowserWnd = (HWND)hWnd;
m_arrayBrowserWndInfo.Add(pBrowserWndInfo);
if (m_ParentWnd.GetBrowserWndInfo() == NULL)
{
m_ParentWnd.SetBrowserWndInfo(pBrowserWndInfo);
}
if (nViewCount > 0)
{
return;
}
HWND hToolbarWnd = NULL;
if (m_isIE7)
{
ie7SubclassToolbar((HWND)hWnd);
}
else
{
normalSubclassToolbar((HWND)hWnd);
}
}
void CIEToolbarWnd::UnsubclassToolbar(IWebBrowser2 *pWebBrowser)
{
BrowserWndInfo* pBrowseWndInfo = findBrowserWndInfo(pWebBrowser);
if (pBrowseWndInfo != NULL)
{
m_arrayBrowserWndInfo.Remove(pBrowseWndInfo);
m_ParentWnd.SetBrowserWndInfo(NULL);
}
if (m_arrayBrowserWndInfo.GetSize() == 0)
{
if (m_hWnd)
{
UnsubclassWindow();
}
if (m_ParentWnd.m_hWnd)
{
m_ParentWnd.UnsubclassWindow();
}
}
if (pBrowseWndInfo != NULL)
{
delete pBrowseWndInfo;
}
}
void CIEToolbarWnd::SetCurrentBrowserWnd(IWebBrowser2 *pWebBrowser)
{
if (pWebBrowser == NULL)
{
return;
}
BrowserWndInfo* pBrowseWndInfo = findBrowserWndInfo(pWebBrowser);
m_ParentWnd.SetBrowserWndInfo(pBrowseWndInfo);
}
void CIEToolbarWnd::IsIE7(BOOL isIE7)
{
m_isIE7 = isIE7;
}
BOOL CIEToolbarWnd::ie7SubclassToolbar(HWND hBrowserWnd)
{
HWND hCmdbarWnd = FindWindowEx(hBrowserWnd, NULL, L"CommandBarClass", NULL);
if (hCmdbarWnd)
{
HWND hRebarWnd = FindWindowEx(hCmdbarWnd, NULL, L"ReBarWindow32", NULL);
HWND hToolbarWnd = ::GetDlgItem(hRebarWnd, 0x0000A000);
if (hToolbarWnd != NULL)
{
m_ParentWnd.SetToolbarWnd(hToolbarWnd);
SubclassWindow(hToolbarWnd);
m_ParentWnd.SubclassWindow(hCmdbarWnd);
return TRUE;
}
}
return FALSE;
}
BOOL CIEToolbarWnd::normalSubclassToolbar(HWND hBrowserWnd)
{
HWND hCmdbarWnd = ::GetDlgItem(hBrowserWnd, 0x0000A005);
if (hCmdbarWnd)
{
HWND hRebarWnd = FindWindowEx(hCmdbarWnd, NULL, L"ReBarWindow32", NULL);
if (hRebarWnd)
{
HWND hToolbarWnd = ::GetDlgItem(hRebarWnd, 0x0000A000);
if (hToolbarWnd != NULL)
{
m_ParentWnd.SetToolbarWnd(hToolbarWnd);
SubclassWindow(hToolbarWnd);
m_ParentWnd.SubclassWindow(hCmdbarWnd);
return TRUE;
}
}
}
return FALSE;
}
关注点
在编写代码的过程中,你学到了什么有趣/好玩/令人恼火的东西吗? 你做了什么特别巧妙、疯狂或异想天开的事情吗?
历史
在此处保持您所做的任何更改或改进的实时更新。