DragonNest/Third/XTToolkitPro/Samples/Utilities/CommandBarsDesigner/DialogBitmapImages.cpp
2024-12-19 09:48:26 +08:00

369 lines
8.4 KiB
C++

// DialogBitmapImages.cpp : implementation file
//
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
// (c)1998-2008 Codejock Software, All Rights Reserved.
//
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
// CONSENT OF CODEJOCK SOFTWARE.
//
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
// SINGLE COMPUTER.
//
// CONTACT INFORMATION:
// support@codejock.com
// http://www.codejock.com
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DialogBitmapImages.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CDialogBitmapImagesHost::CDialogBitmapImagesHost(UINT nIDTemplate, CResourceManager* pResourceManager)
: CDialog(nIDTemplate, 0)
{
m_pResourceManager = pResourceManager;
m_imageState = xtpImageNormal;
m_clrMask = RGB(0, 0xFF, 0);
m_szIcons = 0;
m_pSelected = 0;
}
/////////////////////////////////////////////////////////////////////////////
// CDialogBitmapImages
CDialogBitmapImages::CDialogBitmapImages()
{
m_bScrollVisible[0] = m_bScrollVisible[1] = FALSE;
m_bAllowEdit = TRUE;
}
CDialogBitmapImages::~CDialogBitmapImages()
{
}
BEGIN_MESSAGE_MAP(CDialogBitmapImages, CWnd)
//{{AFX_MSG_MAP(CDialogBitmapImages)
ON_WM_PAINT()
ON_WM_ERASEBKGND()
ON_WM_LBUTTONDOWN()
ON_WM_KEYDOWN()
ON_WM_GETDLGCODE()
ON_WM_HSCROLL()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDialogBitmapImages message handlers
void CDialogBitmapImages::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// its horizontal scroll bar
int nCurPos = GetScrollPos(SB_HORZ);
// decide what to do for each diffrent scroll event
switch(nSBCode)
{
case SB_LEFT: nCurPos = 0; break;
case SB_RIGHT: nCurPos = GetScrollLimit(SB_HORZ); break;
case SB_LINELEFT: nCurPos = max(nCurPos - 6, 0); break;
case SB_LINERIGHT: nCurPos = min(nCurPos + 6, GetScrollLimit(SB_HORZ)); break;
case SB_PAGELEFT: nCurPos = max(nCurPos - CXTPClientRect(this).Width(), 0); break;
case SB_PAGERIGHT: nCurPos = min(nCurPos + CXTPClientRect(this).Width(), GetScrollLimit(SB_HORZ)); break;
case SB_THUMBTRACK:
case SB_THUMBPOSITION: nCurPos = nPos; break;
}
SetScrollPos(SB_HORZ, nCurPos);
Invalidate(FALSE);
CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}
int CDialogBitmapImages::GetScrollOffset(int nBar)
{
if (!m_bScrollVisible[nBar])
return 0;
return GetScrollPos(nBar);
}
CPoint CDialogBitmapImages::GetTopLeftPoint()
{
CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
CXTPClientRect rc(this);
int nCount = (int)pParent->m_arrImages.GetSize();
CSize szIcons = pParent->m_szIcons;
int nHeight = rc.Height();
int nTopOffset = nHeight > szIcons.cy? (nHeight - szIcons.cy) / 2 : 0;
int nLeftOffset = nTopOffset + szIcons.cx * nCount < rc.Width()? (rc.Width() - szIcons.cx * nCount) / 2: 0;
nLeftOffset -= GetScrollOffset(SB_HORZ);
return CPoint(nLeftOffset, nTopOffset);
}
void CDialogBitmapImages::OnPaint()
{
CPaintDC dcPaint(this); // device context for painting
CXTPClientRect rc(this);
CXTPBufferDC dc(dcPaint, rc);
dc.FillSolidRect(rc, GetSysColor(COLOR_3DSHADOW));
if (!m_bAllowEdit)
{
for (int x = 0; x < rc.Width(); x++)
for (int y = 0; y < rc.Height(); y++)
{
COLORREF clr = (((x +3) / 4 )+ ((y +3)/ 4)) % 2 == 0? RGB(255, 255, 255): RGB(235, 235, 235);
dc.SetPixel(x, rc.Height() - y - 1, clr);
}
}
CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
int nCount = (int)pParent->m_arrImages.GetSize();
CSize szIcons = pParent->m_szIcons;
CPoint ptTopLeft = GetTopLeftPoint();
if (m_bAllowEdit)
dc.FillSolidRect(ptTopLeft.x, ptTopLeft.y, szIcons.cx * nCount, szIcons.cy, pParent->m_clrMask);
else
{
CRect rcFocus(ptTopLeft, CSize(szIcons.cx * nCount, szIcons.cy));
rcFocus.InflateRect(1, 1);
dc.DrawFocusRect(rcFocus);
}
for (int i = 0; i < nCount; i++)
{
CPoint pt(ptTopLeft.x + i * szIcons.cx, ptTopLeft.y);
CXTPImageManagerIcon* pIcon = pParent->m_arrImages[i].pIcon;
if (pIcon)
{
CXTPImageManagerIconHandle& pHandle = pParent->m_arrImages[i].GetHandle();
pIcon->Draw(&dc, pt, pHandle, szIcons);
}
}
if (pParent->m_pSelected)
{
CPoint pt(ptTopLeft.x + pParent->m_pSelected->nIndex * szIcons.cx, ptTopLeft.y);
CRect rc(pt, szIcons);
rc.InflateRect(1, 1);
dc.Draw3dRect(rc, 0, 0);
rc.InflateRect(1, 1);
dc.Draw3dRect(rc, 0, 0);
}
}
BOOL CDialogBitmapImages::OnEraseBkgnd(CDC*)
{
return TRUE;
}
CImage* CDialogBitmapImages::HitTest(CPoint point)
{
CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
int nCount = (int)pParent->m_arrImages.GetSize();
CSize szIcons = pParent->m_szIcons;
CPoint ptTopLeft = GetTopLeftPoint();
for (int i = 0; i < nCount; i++)
{
CPoint pt(ptTopLeft.x + i * szIcons.cx, ptTopLeft.y);
CRect rc(pt, szIcons);
if (rc.PtInRect(point))
return &pParent->m_arrImages[i];
}
return NULL;
}
void CDialogBitmapImages::OnLButtonDown(UINT nFlags, CPoint point)
{
CImage* pImage = HitTest(point);
CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
if (pParent->m_pSelected != pImage)
{
pParent->OnImageChanged(pImage);
}
SetFocus();
CWnd::OnLButtonDown(nFlags, point);
}
void CDialogBitmapImages::OnImageCountChanged()
{
CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
CXTPClientRect rc(this);
int nCount = (int)pParent->m_arrImages.GetSize();
CSize szIcons = pParent->m_szIcons;
int nWidth = szIcons.cx * nCount;
m_bScrollVisible[SB_HORZ] = rc.Width() < nWidth;
ShowScrollBar(SB_HORZ, m_bScrollVisible[SB_HORZ]);
if (m_bScrollVisible[SB_HORZ])
{
SCROLLINFO si ;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_PAGE | SIF_RANGE ;
si.nPage = rc.Width();
si.nMax = nWidth - 1;
si.nMin = 0 ;
SetScrollInfo(SB_HORZ, &si) ;
EnableScrollBarCtrl(SB_HORZ, TRUE);
}
Invalidate(FALSE);
}
void CDialogBitmapImages::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CDialogBitmapImagesHost* pParent = (CDialogBitmapImagesHost*)GetParent();
CArray<CImage, CImage&>& arrImages = pParent->m_arrImages;
int nSelected = pParent->m_pSelected? pParent->m_pSelected->nIndex: -1;
int nIndex = nSelected;
if (nChar == VK_LEFT)
{
if (nIndex > 0)
{
nIndex--;
}
if (nIndex >= 0 && nIndex < arrImages.GetSize())
{
if (GetKeyState(VK_CONTROL) >= 0 || !m_bAllowEdit)
{
pParent->OnImageChanged(&arrImages[nIndex]);
}
else
{
CImage image = arrImages[nSelected];
arrImages.RemoveAt(nSelected);
arrImages.InsertAt(nIndex, image);
arrImages[nIndex].nIndex = nIndex;
arrImages[nSelected].nIndex = nSelected;
pParent->m_pSelected = &arrImages[nIndex];
Invalidate(FALSE);
}
}
}
if (nChar == VK_RIGHT)
{
nIndex++;
if (nIndex >= 0 && nIndex < arrImages.GetSize())
{
if (GetKeyState(VK_CONTROL) >= 0 || nIndex == 0 || !m_bAllowEdit)
{
pParent->OnImageChanged(&arrImages[nIndex]);
}
else
{
CImage image = arrImages[nSelected];
arrImages.RemoveAt(nSelected);
arrImages.InsertAt(nIndex, image);
arrImages[nSelected].nIndex = nSelected;
arrImages[nIndex].nIndex = nIndex;
pParent->m_pSelected = &arrImages[nIndex];
Invalidate(FALSE);
}
}
}
if (nChar == VK_DELETE && m_bAllowEdit)
{
if (nIndex >= 0 && nIndex < arrImages.GetSize())
{
arrImages.RemoveAt(nIndex);
for (int i = nIndex; i < arrImages.GetSize(); i++)
arrImages[i].nIndex = i;
if (nIndex < arrImages.GetSize())
{
pParent->OnImageChanged(&arrImages[nIndex]);
}
else
{
pParent->OnImageChanged(0);
}
OnImageCountChanged();
}
}
if (nChar == VK_INSERT && m_bAllowEdit)
{
CImage image;
image.imageState = (XTPImageState)-1;
image.nID = 0;
image.pIcon = 0;
image.pParent = pParent;
nIndex = nIndex == -1? (int)arrImages.GetSize(): nIndex;
arrImages.InsertAt(nIndex, image);
for (int i = 0; i < arrImages.GetSize(); i++)
arrImages[i].nIndex = i;
pParent->OnImageChanged(&arrImages[nIndex]);
OnImageCountChanged();
}
CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
UINT CDialogBitmapImages::OnGetDlgCode()
{
return DLGC_WANTALLKEYS;
}