// Copyright (c) Iuri Apollonio 1998
// Use & modify as you want & need, and leave those 3 lines.
// http://www.codeguru.com
// GfxOutBarCtrl.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"//"OutWAts1.h"
#include "GfxOutBarCtrl.h"
#include "GfxGroupEdit.h"
#include "GfxPopupMenu.h"
#define _ID_GFX_SMALLICON "小图标风格"
#define _ID_GFX_LARGEICON "大图标风格"
//Modified By Blue Sky WorkRoom
//Author:LiXiaoFei Date:2003Y-01M-14D::12:10
//区分目录和Item右键菜单的显示问题
#define _ID_GFX_REMOVEFOLDER "删除该目录"
#define _ID_GFX_RENAMEFOLDER "目录重命名"
//
#define _ID_GFX_REMOVEITEM "删除子项"
#define _ID_GFX_RENAMEITEM "子项重命名"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGfxOutBarCtrl
IMPLEMENT_DYNCREATE(CGfxOutBarCtrl, CWnd)
CGfxOutBarCtrl::CGfxOutBarCtrl()
{
crBackGroundColor = GetSysColor(COLOR_BACKGROUND);//RGB(0,128,128);//
crBackGroundColor1 = GetSysColor(COLOR_BACKGROUND);
crTextColor = GetSysColor(COLOR_WINDOW);
cr3dFace = GetSysColor(COLOR_3DFACE);
crLightBorder = GetSysColor(COLOR_3DLIGHT);
crHilightBorder = GetSysColor(COLOR_3DHILIGHT);
crShadowBorder = GetSysColor(COLOR_3DSHADOW);
crDkShadowBorder = GetSysColor(COLOR_3DDKSHADOW);
pBlackPen = new CPen(PS_SOLID, 1, RGB(0,0,0));
iFolderHeight = 22;
dwFlags = fDragItems|fEditGroups|fEditItems|fRemoveGroups|fRemoveItems|fAddGroups|fAnimation|fSelHighlight;
iSelFolder = 1;
iLastFolderHighlighted = -1;
iLastSelectedFolder = -1;
pLargeImageList = NULL;
pSmallImageList = NULL;
iFirstItem = 0;
xSmallIconLabelOffset = 4;
yLargeIconLabelOffset = 3;
ySmallIconSpacing = 10;
yLargeIconSpacing = 8;
xLeftMargin = 5;
yTopMargin = 5;
bUpArrow = bDownArrow = false;
hHandCursor = AfxGetApp()->LoadCursor(IDC_HANDCUR);
rcUpArrow = rcDownArrow = CRect(0,0,0,0);
bUpPressed = bDownPressed = false;
bLooping = false;
iLastItemHighlighted = -1;
bPressedHighlight = false;
iLastDragItemDraw = -1;
lAnimationTickCount = 10;
hDragCursor = AfxGetApp()->LoadCursor(IDC_DRAGGING);
hNoDragCursor = AfxGetApp()->LoadCursor(IDC_NODRAGGING);
iLastSel = -1;
iSelAnimCount = 0;
iSelAnimTiming = 0;
//
bIsQueryRemove = true;
}
CGfxOutBarCtrl::~CGfxOutBarCtrl()
{
for (int t = 0; t < arFolder.GetSize(); t++)
{
if (arFolder.GetAt(t)) delete (CBarFolder*) arFolder.GetAt(t);
}
arFolder.RemoveAll();
delete pBlackPen;
}
BEGIN_MESSAGE_MAP(CGfxOutBarCtrl, CWnd)
//{{AFX_MSG_MAP(CGfxOutBarCtrl)
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
ON_WM_SIZE()
ON_WM_RBUTTONDOWN()
ON_COMMAND(ID_GFX_LARGEICON, OnGfxLargeicon)
ON_UPDATE_COMMAND_UI(ID_GFX_LARGEICON, OnUpdateGfxLargeicon)
ON_COMMAND(ID_GFX_SMALLICON, OnGfxSmallicon)
ON_UPDATE_COMMAND_UI(ID_GFX_SMALLICON, OnUpdateGfxSmallicon)
ON_COMMAND(ID_GFX_REMOVEITEM, OnGfxRemoveitem)
ON_UPDATE_COMMAND_UI(ID_GFX_REMOVEITEM, OnUpdateGfxRemoveitem)
ON_COMMAND(ID_GFX_RENAMEITEM, OnGfxRenameitem)
ON_UPDATE_COMMAND_UI(ID_GFX_RENAMEITEM, OnUpdateGfxRenameitem)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_OUTBAR_NOTIFY, OnEndLabelEdit)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGfxOutBarCtrl message handlers
long CGfxOutBarCtrl::OnEndLabelEdit(WPARAM wParam, LPARAM lParam)
{
if (wParam == NM_OB_ONGROUPENDEDIT)
{
CGfxGroupEdit * pEdit = (CGfxGroupEdit *) lParam;
OUTBAR_INFO ob;
ob.index = pEdit->iIndex;
ob.cText = pEdit->text;
if (GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_ONGROUPENDEDIT, (LPARAM) &ob))
{
SetFolderText(pEdit->iIndex, pEdit->text);
CRect rc;
GetFolderRect(pEdit->iIndex, rc);
InvalidateRect(rc, false);
}
}
if (wParam == NM_OB_ONLABELENDEDIT)
{
CGfxGroupEdit * pEdit = (CGfxGroupEdit *) lParam;
OUTBAR_INFO ob;
ob.index = pEdit->iIndex;
ob.cText = pEdit->text;
if (GetOwner()->SendMessage(WM_OUTBAR_NOTIFY, NM_OB_ONLABELENDEDIT, (LPARAM) &ob))
{
SetItemText(pEdit->iIndex, pEdit->text);
CRect rc;
GetInsideRect(rc);
InvalidateRect(rc, true);
}
}
return 0;
}
void CGfxOutBarCtrl::SetFolderText(const int index, const char * text)
{
ASSERT(index >= 0 && index < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(index);
if (pbf->cName)
{
delete [] pbf->cName;
pbf->cName = NULL;
}
pbf->cName = new char [lstrlen(text)+1];
lstrcpy(pbf->cName, text);
}
void CGfxOutBarCtrl::SetItemText(const int index, const char * text)
{
ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
if (pi->cItem)
{
delete [] pi->cItem;
pi->cItem = NULL;
}
pi->cItem = new char [lstrlen(text)+1];
lstrcpy(pi->cItem, text);
}
BOOL CGfxOutBarCtrl::Create(DWORD dwStyle, const RECT & rect, CWnd * pParentWnd, UINT nID, const DWORD dwFlag)
{
dwFlags = dwFlag;
return CWnd::CreateEx(WS_EX_STATICEDGE, NULL, NULL, dwStyle|WS_CHILD, rect, pParentWnd, nID);
//GFXOUTBARCTRL_CLASSNAME
}
bool CGfxOutBarCtrl::IsSmallIconView() const
{
return dwFlags&fSmallIcon;
}
void CGfxOutBarCtrl::SetSmallIconView(const bool bSet)
{
iFirstItem = 0;
if (bSet)
{
if (!IsSmallIconView())
{
dwFlags |= fSmallIcon;
CRect rc;
GetInsideRect(rc);
InvalidateRect(rc, false);
}
}
else
{
if (IsSmallIconView())
{
dwFlags &= ~fSmallIcon;
CRect rc;
GetInsideRect(rc);
InvalidateRect(rc, false);
}
}
}
DWORD CGfxOutBarCtrl::GetFlag() const
{
return dwFlags;
}
void CGfxOutBarCtrl::ModifyFlag(const DWORD & dwRemove, const DWORD & dwAdd, const UINT redraw)
{
if (dwRemove) dwFlags &= ~(dwRemove);
if (dwAdd) dwFlags |= dwAdd;
if (GetSafeHwnd())
{
if (redraw != 0) SetWindowPos(0,0,0,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOMOVE|redraw);
else Invalidate();
}
}
int CGfxOutBarCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
void CGfxOutBarCtrl::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 1)
{
CPoint pt(GetMessagePos());
ScreenToClient(&pt);
CRect rc;
GetClientRect(&rc);
if (!(rc.PtInRect(pt)))
{
HighlightFolder(-1);
HighlightItem(-1);
KillTimer(1);
}
}
else if (nIDEvent == 3 && iLastSel >= 0)
{
iSelAnimCount ++;
if (iSelAnimCount > 10) iSelAnimCount = -1;
if (iSelAnimCount == 0)
DrawAnimItem(-1, 1, iLastSel);
if (iSelAnimCount == 1)
DrawAnimItem(0, 0, iLastSel);
if (iSelAnimCount == 2)
DrawAnimItem(1, 1, iLastSel);
if (iSelAnimCount == 3)
DrawAnimItem(0, 0, iLastSel);
}
CWnd::OnTimer(nIDEvent);
}
void CGfxOutBarCtrl::DrawAnimItem(const int xoffset, const int yoffset, const int index)
{
CImageList * ima = GetFolderImageList(iSelFolder, IsSmallIconView());
CRect rc, irc;
GetInsideRect(irc);
GetItemRect(iSelFolder, iLastSel, rc);
if (iLastSel >= iFirstItem && irc.bottom > rc.bottom && irc.top < rc.top)
{
ASSERT(iSelFolder >= 0 && iSelFolder < GetFolderCount());
CBarFolder * pbf = (CBarFolder *) arFolder.GetAt(iSelFolder);
ASSERT(index >= 0 && index < pbf->GetItemCount());
CBarItem * pi = (CBarItem *) pbf->arItems.GetAt(index);
ASSERT(pi && ima);
CClientDC dc(this);
if (IsSmallIconView())
{
if (ima)
{
IMAGEINFO ii;
ima->GetImageInfo(pi->iImageIndex, &ii);
CSize szImage = CRect(ii.rcImage).Size();
CPoint pt;
pt.x = rc.left + 2;
pt.y = rc.top + (rc.Height() - szImage.cy) / 2;
评论0