📄 addressbar.h
字号:
};
//////////////////////
// for Donut
#define ABR_EX_OPENNEWWIN 0x00010000L
#define ABR_EX_NOACTIVATE 0x00020000L
class CDonutAddressBar :
public CAddressBarCtrlImpl<CDonutAddressBar>,
public CCustomDraw<CDonutAddressBar>
{
public:
DECLARE_WND_SUPERCLASS(_T("Donut_AddressBar"), GetWndClassName())
// Constants
enum { s_kcxHeaderGap = 4 };
// Data members
int m_cxDefaultHeader;
CItemIDList m_idlHtml; // used to draw .url icon faster
// CContainedWindow m_wndReBar;
CDonutAddressBar() : m_cxDefaultHeader(0)
{
m_idlHtml = MtlGetHtmlFileIDList();
}
~CDonutAddressBar()
{
}
// Methods
void InitReBarBandInfo(CReBarCtrl rebar)
{
int nIndex = rebar.IdToIndex(GetDlgCtrlID());
CVersional<REBARBANDINFO> rbBand;
rbBand.fMask = RBBIM_HEADERSIZE;
MTLVERIFY(rebar.GetBandInfo(nIndex, &rbBand));
m_cxDefaultHeader = rbBand.cxHeader;
// Calculate the header of the band
int nWidth = MtlComputeWidthOfText(_T("A&ddress"), rebar.GetFont());
rbBand.cxHeader = m_cxDefaultHeader + nWidth + s_kcxHeaderGap;
MTLVERIFY(rebar.SetBandInfo(nIndex, &rbBand));
}
// required for stupid OnCustomDraw including pT->SetMsgHandled
void SetMsgHandled(BOOL bHandled)
{
CAddressBarCtrlImpl<CDonutAddressBar>::SetMsgHandled(bHandled);
}
BOOL IsMsgHandled() const
{
return CAddressBarCtrlImpl<CDonutAddressBar>::IsMsgHandled();
}
/* BEGIN_MSG_MAP(CDonutAddressBar)
CHAIN_MSG_MAP(CAddressBarCtrlImpl<CDonutAddressBar>)
ALT_MSG_MAP(1)
CHAIN_MSG_MAP_ALT(CAddressBarCtrlImpl<CDonutAddressBar>, 1)
ALT_MSG_MAP(2)
CHAIN_MSG_MAP_ALT(CAddressBarCtrlImpl<CDonutAddressBar>, 2)
END_MSG_MAP()
*/
// Custom draw overrides
DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/)
{
return CDRF_NOTIFYITEMDRAW; // we need per-item notifications
}
// OnItemPostPaint not called
DWORD OnItemPrePaint(int idCtrl, LPNMCUSTOMDRAW lpNMCustomDraw)
{
abrTRACE(_T("CDonutAddressBar::OnItemPrePaint : dwItemSpec(%d), uItemState(%d)\n"),
lpNMCustomDraw->dwItemSpec, lpNMCustomDraw->uItemState);
if (lpNMCustomDraw->dwItemSpec != GetDlgCtrlID())
return CDRF_DODEFAULT;
if (m_cxDefaultHeader == 0)// InitReBarBandInfo maybe not called, do nothing.
return CDRF_DODEFAULT;
CDCHandle dc = lpNMCustomDraw->hdc;
RECT& rc = lpNMCustomDraw->rc;
rc.left += m_cxDefaultHeader;
_DrawHeader(dc, rc, _T("A&ddress"));
return CDRF_DODEFAULT; // continue with the default item painting
}
// Methods
void _DrawHeader(CDCHandle dc, CRect rc, const CString& strHeader)
{
abrTRACE(_T("CDonutAddressBar::_DrawHeader(%d, %d, %d, %d)\n"), rc.left, rc.top, rc.right, rc.bottom);
CReBarCtrl rebar(GetParent());
HFONT hOldFont = dc.SelectFont(rebar.GetFont());
dc.DrawText(strHeader, -1, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
dc.SelectFont(hOldFont);
}
// Overrides
void OnItemSelected(const CString& str)
{
DWORD dwOpenFlags = 0;
if (!_check_flag(ABR_EX_OPENNEWWIN, GetAddressBarExtendedStyle()))
dwOpenFlags |= D_OPENFILE_NOCREATE;
if (!_check_flag(ABR_EX_NOACTIVATE, GetAddressBarExtendedStyle()))
dwOpenFlags |= D_OPENFILE_ACTIVATE;
DonutToggleOpenFlag(dwOpenFlags);
HWND hWndNew = DonutOpenFile(m_hWnd, str, dwOpenFlags);
}
void OnGetItem(const CString& str, COMBOBOXEXITEM& item)
{
item.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE;// | CBEIF_OVERLAY;
int nImage;// = 2;
/* if (str.IsEmpty())
nImage = -1;
if (str.Find(_T(':')) == 1 || MtlIsProtocol(str, _T("file"))) {// maybe local directory
if (str.ReverseFind('/') == str.GetLength() - 1 ||
str.ReverseFind('\\') == str.GetLength() - 1)
{
nImage = 0;
}
else if (str.ReverseFind(_T('/')) > str.ReverseFind(_T('.')) ||
str.ReverseFind(_T('\\')) > str.ReverseFind(_T('.')))
{
nImage = 0;
}
}
*/
nImage = I_IMAGECALLBACK;
item.iImage = nImage;
item.iSelectedImage = nImage;
item.iOverlay = nImage;
}
void OnGetDispInfo(COMBOBOXEXITEM& item)
{
abrTRACE(_T("OnGetDispInfo(%s)\n"), item.pszText);
if (!_check_flag(CBEIF_IMAGE, item.mask) &&
!_check_flag(CBEIF_SELECTEDIMAGE, item.mask))
return;
CString str;
if (GetDroppedState()) {
MtlGetLBTextFixed(GetComboCtrl(), item.iItem, str);
}
else {
str = MtlGetWindowText(GetEditCtrl());
}
if (str.IsEmpty())
return;
CItemIDList idl = str;
if (idl.IsNull()) {// invalid idl
int iImage = MtlGetSystemIconIndex(m_idlHtml);
item.iImage = iImage;
item.iSelectedImage = iImage;
return;
}
if (item.mask & CBEIF_IMAGE) {
item.iImage = MtlGetNormalIconIndex(idl, m_idlHtml);
}
if (item.mask & CBEIF_SELECTEDIMAGE) {
item.iSelectedImage = MtlGetSelectedIconIndex(idl, true, m_idlHtml);
}
/*
CItemIDlist idl = str;
if (MtlGet
if (str.IsEmpty())
nImage = -1;
if (str.Find(_T(':')) == 1 || MtlIsProtocol(str, _T("file"))) {// maybe local directory
if (str.ReverseFind('/') == str.GetLength() - 1 ||
str.ReverseFind('\\') == str.GetLength() - 1)
{
nImage = 0;
}
else if (str.ReverseFind(_T('/')) > str.ReverseFind(_T('.')) ||
str.ReverseFind(_T('\\')) > str.ReverseFind(_T('.')))
{
nImage = 0;
}
}
// item.mask = CBEIF_IMAGE | CBEIF_SELECTEDIMAGE;
item.iImage = nImage;
item.iSelectedImage = nImage;
*/
}
void OnInit()
{
// MTLVERIFY(_LoadImages(IDB_LINKBAR, 16, 16, RGB(255, 0, 255)));
_SetSystemImageList();
COMBOBOXEXITEM item;
item.mask = CBEIF_IMAGE | CBEIF_SELECTEDIMAGE;
item.iItem = -1;// on edit control
item.iImage = I_IMAGECALLBACK;
item.iSelectedImage = I_IMAGECALLBACK;
MTLVERIFY(SetItem(&item));
RegisterDragDrop();
}
void OnTerm()
{
RevokeDragDrop();
}
// Implementation
// IDropTargetImpl
bool m_bDragAccept;
DROPEFFECT OnDragEnter(IDataObject* pDataObject, DWORD dwKeyState, CPoint point)
{
if (m_bDragFromItself)
return DROPEFFECT_NONE;
_DrawDragEffect(false);
m_bDragAccept = _MtlIsHlinkDataObject(pDataObject);
return _MtlStandardDropEffect(dwKeyState);
}
DROPEFFECT OnDragOver(IDataObject* pDataObject, DWORD dwKeyState, CPoint point, DROPEFFECT dropOkEffect)
{
if (m_bDragFromItself || !m_bDragAccept)
return DROPEFFECT_NONE;
return _MtlStandardDropEffect(dwKeyState) | _MtlFollowDropEffect(dropOkEffect) | DROPEFFECT_COPY;
}
void OnDragLeave()
{
if (m_bDragFromItself)
return;
_DrawDragEffect(true);
}
void _DrawDragEffect(bool bRemove)
{
CClientDC dc(m_wndCombo.m_hWnd);
CRect rect; m_wndCombo.GetClientRect(rect);
if (bRemove)
MtlDrawDragRectFixed(dc.m_hDC, &rect, CSize(0, 0), &rect, CSize(2, 2), NULL, NULL);
else
MtlDrawDragRectFixed(dc.m_hDC, &rect, CSize(2, 2), NULL, CSize(2, 2), NULL, NULL);
}
DROPEFFECT OnDrop(IDataObject* pDataObject, DROPEFFECT dropEffect,
DROPEFFECT dropEffectList, CPoint point)
{
if (m_bDragFromItself)
return DROPEFFECT_NONE;
_DrawDragEffect(true);
CSimpleArray<CString> arrFiles;
if (MtlGetDropFileName(pDataObject, arrFiles)) {
// one file
if (arrFiles.GetSize() == 1) {
OnItemSelected(arrFiles[0]);// allow to AddressBar style
return DROPEFFECT_COPY;
}
// files
for (int i = 0; i < arrFiles.GetSize(); ++i) {
DonutOpenFile(m_hWnd, arrFiles[i]);
}
dropEffect = DROPEFFECT_COPY;
return true;
}
CString strText;
if ( MtlGetHGlobalText(pDataObject, strText) ||
MtlGetHGlobalText(pDataObject, strText, ::RegisterClipboardFormat(CFSTR_SHELLURL)) )
{
OnItemSelected(strText);
return DROPEFFECT_COPY;
}
return DROPEFFECT_NONE;
}
HRESULT OnGetAddressBarCtrlDataObject(IDataObject** ppDataObject)
{
ATLASSERT(ppDataObject != NULL);
HRESULT hr = CHlinkDataObject::_CreatorClass::CreateInstance(NULL, IID_IDataObject, (void**)ppDataObject);
if (FAILED(hr)) {
*ppDataObject = NULL;
return E_NOTIMPL;
}
#ifdef _ATL_DEBUG_INTERFACES
ATLASSERT(FALSE && _T("_ATL_DEBUG_INTERFACES crashes the following\n"));
#endif
CHlinkDataObject* pHlinkDataObject = NULL;// this is hack, no need to release
hr = (*ppDataObject)->QueryInterface(IID_NULL, (void**)&pHlinkDataObject);
if (SUCCEEDED(hr)) {
HWND hWnd = DonutGetActiveWindow(GetTopLevelParent());
if (hWnd == NULL)
return E_NOTIMPL;
ATLASSERT(::IsWindow(hWnd));
CWebBrowser2 browser = DonutGetIWebBrowser2(hWnd);
if (browser.IsBrowserNull())
return E_NOTIMPL;
CString strName = MtlGetWindowText(hWnd);
CString strUrl = browser.GetLocationURL();
if (strUrl.IsEmpty())
return E_NOTIMPL;
if (strUrl.Left(5) == _T("file:")) {// Donut, to be explorer or not
strName.Empty();
strUrl = strUrl.Right(strUrl.GetLength() - 8);
strUrl.Replace(_T('/'), _T('\\'));
}
pHlinkDataObject->m_arrNameAndUrl.Add(std::make_pair(strName, strUrl));
}
return S_OK;
}
void _SetSystemImageList()
{
ATLASSERT(::IsWindow(m_hWnd));
SHFILEINFO sfi;
HIMAGELIST hImgs = (HIMAGELIST)::SHGetFileInfo(_T("C:\\"), 0, &sfi, sizeof(sfi),
SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
ATLASSERT(hImgs != NULL);
SetImageList(hImgs);
}
};
class CDonutAddressBarPropertyPage : public CPropertyPageImpl<CDonutAddressBarPropertyPage>,
public CWinDataExchange<CDonutAddressBarPropertyPage>
{
public:
// Constants
enum { IDD = IDD_PROPPAGE_ADDRESSBAR };
// Data members
int m_nAutoComplete, m_nNewWin, m_nNoActivate, m_nLoadTypedUrls, m_nGoBtnVisible;
CDonutAddressBar& m_AddressBar;
// DDX map
BEGIN_DDX_MAP(CDonutAddressBarPropertyPage)
DDX_CHECK(IDC_CHECK_ABR_AUTOCOMPLETE, m_nAutoComplete)
DDX_CHECK(IDC_CHECK_ABR_NEWWIN, m_nNewWin)
DDX_CHECK(IDC_CHECK_ADB_NOACTIVATE, m_nNoActivate)
DDX_CHECK(IDC_CHECK_ABR_LOADTYPEDURLS, m_nLoadTypedUrls)
DDX_CHECK(IDC_CHECK_ABR_GOBTNVISIBLE, m_nGoBtnVisible)
END_DDX_MAP()
// Constructor
CDonutAddressBarPropertyPage(CDonutAddressBar& adBar) : m_AddressBar(adBar)
{
_SetData();
}
// Overrides
BOOL OnSetActive()
{
SetModified(TRUE);
return DoDataExchange(FALSE);
}
BOOL OnKillActive()
{
return DoDataExchange(TRUE);
}
BOOL OnApply()
{
if (DoDataExchange(TRUE)) {
_GetData();
return TRUE;
}
else
return FALSE;
}
// Implementation
protected:
void _GetData()
{
// update flags
DWORD dwFlags = 0;
if (m_nAutoComplete == 1) {
dwFlags |= ABR_EX_AUTOCOMPLETE;
}
if (m_nNewWin == 1) {
dwFlags |= ABR_EX_OPENNEWWIN;
}
if (m_nNoActivate == 1) {
dwFlags |= ABR_EX_NOACTIVATE;
}
if (m_nNewWin == 1) {
dwFlags |= ABR_EX_OPENNEWWIN;
}
if (m_nLoadTypedUrls == 1) {
dwFlags |= ABR_EX_LOADTYPEDURLS;
}
if (m_nGoBtnVisible == 1) {
dwFlags |= ABR_EX_GOBTNVISIBLE;
}
m_AddressBar.SetAddressBarExtendedStyle(dwFlags);
}
void _SetData()
{
DWORD dwFlags = m_AddressBar.GetAddressBarExtendedStyle();
m_nAutoComplete = _check_flag(ABR_EX_AUTOCOMPLETE, dwFlags) ? 1 : 0;
m_nNewWin = _check_flag(ABR_EX_OPENNEWWIN, dwFlags) ? 1 : 0;
m_nNoActivate = _check_flag(ABR_EX_NOACTIVATE, dwFlags) ? 1 : 0;
m_nLoadTypedUrls = _check_flag(ABR_EX_LOADTYPEDURLS, dwFlags) ? 1 : 0;
m_nGoBtnVisible = _check_flag(ABR_EX_GOBTNVISIBLE, dwFlags) ? 1 : 0;
}
};
////////////////////////////////////////////////////////////////////////////
} // namespace MTL;
#ifndef _MTL_NO_AUTOMATIC_NAMESPACE
using namespace MTL;
#endif //!_MTL_NO_AUTOMATIC_NAMESPACE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -