728 lines
20 KiB
C++
728 lines
20 KiB
C++
// PropPoolView.cpp : implementation file
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "EtWorldPainter.h"
|
||
#include "PropPoolView.h"
|
||
#include "UserMessage.h"
|
||
#include "PropPoolControl.h"
|
||
#include "FileServer.h"
|
||
#include "SkinManagerPaneView.h"
|
||
#include "resource.h"
|
||
#include "MainFrm.h"
|
||
#include "PaneDefine.h"
|
||
|
||
|
||
// CPropPoolView
|
||
|
||
IMPLEMENT_DYNCREATE(CPropPoolView, CFormView)
|
||
|
||
CPropPoolView::CPropPoolView()
|
||
: CFormView(CPropPoolView::IDD)
|
||
{
|
||
m_bActivate = false;
|
||
m_pdcBitmap = NULL;
|
||
m_pmemDC = NULL;
|
||
|
||
m_ScrollSize = CSize( 0, 0 );
|
||
m_ScrollPos = CSize( 0, 0 );
|
||
m_fScale = 1.f;
|
||
m_nCircleRadius = 180;
|
||
m_nIconSize = 5;
|
||
|
||
m_bLBDown = false;
|
||
m_bInScroll = false;
|
||
|
||
m_nDetailViewIndex = -1;
|
||
m_nSelectItemIndex = -1;
|
||
m_bRemoveArea = false;
|
||
}
|
||
|
||
CPropPoolView::~CPropPoolView()
|
||
{
|
||
DeleteMemDC();
|
||
}
|
||
|
||
void CPropPoolView::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CFormView::DoDataExchange(pDX);
|
||
}
|
||
|
||
BEGIN_MESSAGE_MAP(CPropPoolView, CFormView)
|
||
ON_WM_DESTROY()
|
||
ON_WM_ERASEBKGND()
|
||
ON_WM_SIZE()
|
||
ON_WM_PAINT()
|
||
ON_WM_CREATE()
|
||
ON_WM_MOUSEWHEEL()
|
||
ON_WM_LBUTTONDOWN()
|
||
ON_WM_LBUTTONUP()
|
||
ON_WM_MOUSEMOVE()
|
||
ON_MESSAGE( UM_SKINPANE_DROPITEM, OnDropItem )
|
||
ON_MESSAGE( UM_SKINPANE_DROPMOVEITEM, OnDropMoveItem )
|
||
ON_MESSAGE( UM_SKINPANE_DBLCLICKITEM, OnDblClickItem )
|
||
ON_COMMAND(ID_POOL_EMPTY, &CPropPoolView::OnPoolEmpty)
|
||
ON_COMMAND(ID_POOL_SAVE, &CPropPoolView::OnPoolSave)
|
||
ON_COMMAND(ID_POOL_LOADLIST, &CPropPoolView::OnPoolLoadlist)
|
||
ON_UPDATE_COMMAND_UI(ID_POOL_EMPTY, &CPropPoolView::OnUpdatePoolEmpty)
|
||
ON_UPDATE_COMMAND_UI(ID_POOL_SAVE, &CPropPoolView::OnUpdatePoolSave)
|
||
ON_UPDATE_COMMAND_UI(ID_POOL_LOADLIST, &CPropPoolView::OnUpdatePoolLoadlist)
|
||
END_MESSAGE_MAP()
|
||
|
||
|
||
// CPropPoolView diagnostics
|
||
|
||
#ifdef _DEBUG
|
||
void CPropPoolView::AssertValid() const
|
||
{
|
||
CFormView::AssertValid();
|
||
}
|
||
|
||
#ifndef _WIN32_WCE
|
||
void CPropPoolView::Dump(CDumpContext& dc) const
|
||
{
|
||
CFormView::Dump(dc);
|
||
}
|
||
#endif
|
||
#endif //_DEBUG
|
||
|
||
|
||
// CPropPoolView message handlers
|
||
|
||
void CPropPoolView::OnInitialUpdate()
|
||
{
|
||
CFormView::OnInitialUpdate();
|
||
|
||
// TODO: Add your specialized code here and/or call the base class
|
||
if( m_bActivate == true ) return;
|
||
m_bActivate = true;
|
||
}
|
||
|
||
void CPropPoolView::OnDestroy()
|
||
{
|
||
CFormView::OnDestroy();
|
||
|
||
// TODO: Add your message handler code here
|
||
}
|
||
|
||
BOOL CPropPoolView::OnEraseBkgnd(CDC* pDC)
|
||
{
|
||
// TODO: Add your message handler code here and/or call default
|
||
|
||
return TRUE;
|
||
// return CFormView::OnEraseBkgnd(pDC);
|
||
}
|
||
|
||
void CPropPoolView::OnSize(UINT nType, int cx, int cy)
|
||
{
|
||
CFormView::OnSize(nType, cx, cy);
|
||
|
||
int nTop = 0;
|
||
if( m_wndToolBar.GetSafeHwnd() )
|
||
{
|
||
CSize sz = m_wndToolBar.CalcDockingLayout(cx, LM_HORZDOCK|LM_HORZ | LM_COMMIT);
|
||
|
||
m_wndToolBar.MoveWindow(0, 0, cx, sz.cy);
|
||
m_wndToolBar.Invalidate(FALSE);
|
||
nTop += sz.cy;
|
||
}
|
||
|
||
// TODO: Add your message handler code here
|
||
DeleteMemDC();
|
||
CreateMemDC();
|
||
ResetScroll();
|
||
}
|
||
|
||
void CPropPoolView::OnPaint()
|
||
{
|
||
CPaintDC dc(this); // device context for painting
|
||
|
||
CreateMemDC();
|
||
|
||
CBitmap *pOldBitmap;
|
||
|
||
CRect rcRect, rcToolbar;
|
||
GetClientRect( &rcRect );
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
rcRect.top += rcToolbar.Height();
|
||
|
||
pOldBitmap = m_pmemDC->SelectObject( m_pdcBitmap );
|
||
|
||
CRect rcTemp;
|
||
GetClientRect( &rcTemp );
|
||
rcTemp.bottom -= rcToolbar.Height();
|
||
m_pmemDC->FillSolidRect( &rcTemp, RGB( 0, 0, 0 ) );
|
||
|
||
CRect rcCircle = CRect( 7, 7, 7 + m_nCircleRadius, 7 + m_nCircleRadius );
|
||
rcCircle -= m_ScrollPos;
|
||
|
||
// <20><><EFBFBD><EFBFBD> <20><EFBFBD><D7B8><EFBFBD>.
|
||
CBrush Brush( RGB(255,255,255) );
|
||
m_pmemDC->SelectObject( &Brush );
|
||
m_pmemDC->Ellipse( rcCircle );
|
||
|
||
CBrush Brush2( RGB(0,0,0) );
|
||
m_pmemDC->SelectObject( &Brush2 );
|
||
rcCircle.DeflateRect( 2, 2, 2, 2 );
|
||
m_pmemDC->Ellipse( rcCircle );
|
||
|
||
// <20><><EFBFBD>빰<EFBFBD><EBB9B0> <20><EFBFBD><D7B8><EFBFBD>.
|
||
DrawPropList( m_pmemDC );
|
||
|
||
|
||
// <20><>ũ<EFBFBD><C5A9> <20><EFBFBD><D7B8><EFBFBD>.
|
||
CRect rcScroll;
|
||
CalcScrollRect( true, rcScroll );
|
||
m_pmemDC->Draw3dRect( &rcScroll, RGB( 129, 129, 129 ), RGB( 255, 255, 255 ) );
|
||
|
||
if( m_ScrollSize.cy != 0 ) {
|
||
CRect rcPos;
|
||
rcPos.left = rcScroll.left + 1;
|
||
rcPos.right = rcScroll.right - 1;
|
||
rcPos.top = rcScroll.top + (int)( ( ( rcScroll.Height() - 20 ) / (float)m_ScrollSize.cy ) * (float)m_ScrollPos.cy );
|
||
rcPos.bottom = rcPos.top + 20;
|
||
m_pmemDC->FillSolidRect( &rcPos, RGB( 250, 213, 14 ) );
|
||
}
|
||
|
||
CalcScrollRect( false, rcScroll );
|
||
m_pmemDC->Draw3dRect( &rcScroll, RGB( 129, 129, 129 ), RGB( 255, 255, 255 ) );
|
||
|
||
if( m_ScrollSize.cx != 0 ) {
|
||
CRect rcPos;
|
||
rcPos.left = rcScroll.left + (int)( ( ( rcScroll.Width() - 20 ) / (float)m_ScrollSize.cx ) * (float)m_ScrollPos.cx );
|
||
rcPos.right = rcPos.left + 20;
|
||
rcPos.top = rcScroll.top + 1;
|
||
rcPos.bottom = rcScroll.bottom - 1;
|
||
m_pmemDC->FillSolidRect( &rcPos, RGB( 250, 213, 14 ) );
|
||
}
|
||
|
||
dc.BitBlt( rcRect.left, rcRect.top, rcRect.Width(), rcRect.Height() ,
|
||
m_pmemDC, 0, 0, SRCCOPY );
|
||
|
||
m_pmemDC->SelectObject( pOldBitmap );
|
||
}
|
||
|
||
void CPropPoolView::DrawPropList( CDC *pDC )
|
||
{
|
||
CPropPoolStage *pStage = g_PropPoolControl.GetCurrentStage();
|
||
|
||
CRect rcRect, rcDetailRect, rcIconRect;
|
||
EtVector2 vOffset;
|
||
int nCenter = ( 7 + 2 )/*<2A><><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B>β<EFBFBD>*/ + ( m_nCircleRadius / 2 );
|
||
|
||
for( DWORD i=0; i<pStage->GetPropCount(); i++ ) {
|
||
vOffset = pStage->GetPropOffset(i);
|
||
|
||
vOffset *= (float)( m_nCircleRadius / 2.f );
|
||
vOffset.x = nCenter - vOffset.x;
|
||
vOffset.y = nCenter - vOffset.y;
|
||
|
||
rcRect.left = (int)( vOffset.x - m_nIconSize );
|
||
rcRect.right = (int)( vOffset.x + m_nIconSize );
|
||
rcRect.top = (int)( vOffset.y - m_nIconSize );
|
||
rcRect.bottom = (int)( vOffset.y + m_nIconSize );
|
||
rcRect -= m_ScrollPos;
|
||
pDC->Draw3dRect( &rcRect, RGB( 255,255,255 ), RGB( 120, 120, 120 ) );
|
||
rcRect.DeflateRect( 1, 1, 1, 1 );
|
||
if( m_nSelectItemIndex == (int)i ) {
|
||
pDC->FillSolidRect( &rcRect, RGB( 255, 0, 0 ) );
|
||
|
||
rcRect.InflateRect( 2, 2, 2, 2 );
|
||
pDC->Draw3dRect( &rcRect, RGB( 255,255,255 ), RGB( 120, 120, 120 ) );
|
||
}
|
||
else {
|
||
pDC->FillSolidRect( &rcRect, RGB( 220, 20, 40 ) );
|
||
}
|
||
|
||
if( m_nDetailViewIndex == (int)i ) {
|
||
rcIconRect = rcRect;
|
||
rcDetailRect.left = rcRect.right + 1;
|
||
rcDetailRect.top = rcRect.bottom + 1;
|
||
rcDetailRect.right = rcDetailRect.left + 100;
|
||
rcDetailRect.bottom = rcRect.top + 115;
|
||
|
||
CRect rcClientRect, rcToolbar;
|
||
GetClientRect( &rcClientRect );
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
|
||
if( rcDetailRect.bottom > ( rcClientRect.bottom - rcToolbar.Height() ) ) {
|
||
int nOffset = rcDetailRect.bottom - rcClientRect.bottom + rcToolbar.Height();
|
||
rcDetailRect.top -= nOffset;
|
||
rcDetailRect.bottom -= nOffset;
|
||
}
|
||
if( rcDetailRect.right > rcClientRect.right ) {
|
||
int nOffset = rcDetailRect.right - rcClientRect.right;
|
||
rcDetailRect.left -= nOffset;
|
||
rcDetailRect.right -= nOffset;
|
||
}
|
||
|
||
}
|
||
}
|
||
if( m_nDetailViewIndex != -1 ) {
|
||
CRect rcTemp = rcDetailRect;
|
||
|
||
pDC->Draw3dRect( &rcTemp, RGB( 255,255,255 ), RGB( 120, 120, 120 ) );
|
||
rcTemp.top = rcTemp.bottom - 15;
|
||
pDC->Draw3dRect( &rcTemp, RGB( 255,255,255 ), RGB( 120, 120, 120 ) );
|
||
|
||
pDC->SetBkMode( TRANSPARENT );
|
||
pDC->SelectStockObject( DEFAULT_GUI_FONT );
|
||
rcTemp.DeflateRect( 1, 1, 1, 1 );
|
||
pDC->FillSolidRect( &rcTemp, RGB(0,0,0) );
|
||
|
||
pDC->IntersectClipRect( &rcTemp );
|
||
pDC->SetTextColor( RGB( 255, 255, 255 ) );
|
||
|
||
CString szPropName = pStage->GetPropName( (DWORD)m_nDetailViewIndex );
|
||
char szBuf[256] = { 0, };
|
||
char szExt[6] = { 0, };
|
||
|
||
pDC->TextOut( rcTemp.left + 1, rcTemp.top + 1, szPropName );
|
||
pDC->SelectClipRgn( NULL );
|
||
|
||
// <20>Ÿ<EFBFBD> <20>ۼ<EFBFBD>Ʈ <20><><EFBFBD>ش<EFBFBD>.
|
||
rcTemp = rcIconRect;
|
||
rcTemp.top -= 13;
|
||
rcTemp.bottom -= 13;
|
||
rcTemp.left -= 10;
|
||
rcTemp.right += 10;
|
||
float fLength = EtVec2Length( &pStage->GetPropOffset( (DWORD)m_nDetailViewIndex ) );
|
||
if( fLength > 1.f ) {
|
||
sprintf_s( szBuf, "Out" );
|
||
pDC->SetTextColor( RGB( 250, 0, 0 ) );
|
||
}
|
||
else {
|
||
sprintf_s( szBuf, "%d%%", 100 - (int)(fLength * 100.f) );
|
||
pDC->SetTextColor( RGB( 250, 213, 14 ) );
|
||
}
|
||
pDC->TextOut( rcTemp.left + 1, rcTemp.top + 1, szBuf );
|
||
|
||
// <20><EFBFBD> <20><EFBFBD><D7B7>ش<EFBFBD>.
|
||
CWnd *pWnd = GetPaneWnd( SKINMNG_PANE );
|
||
if( pWnd ) {
|
||
rcTemp = rcDetailRect;
|
||
rcTemp.bottom -= 15;
|
||
rcTemp.DeflateRect( 1, 1, 1, 1 );
|
||
|
||
SkinStruct *pStruct = (SkinStruct*)pWnd->SendMessage( UM_SKINPANE_GET_PREVIEW_IMAGE, (WPARAM)szPropName.GetBuffer() );
|
||
if( pStruct ) {
|
||
pDC->SetStretchBltMode( COLORONCOLOR );
|
||
pDC->StretchBlt( rcTemp.left, rcTemp.top, rcTemp.Width(), rcTemp.Height(), pStruct->pmemDC, 0, 0, pStruct->SurfaceDesc.Width, pStruct->SurfaceDesc.Height, SRCPAINT );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void CPropPoolView::CreateMemDC()
|
||
{
|
||
if( m_pdcBitmap || m_pmemDC ) return;
|
||
|
||
m_pmemDC = new CDC;
|
||
m_pdcBitmap = new CBitmap;
|
||
|
||
CRect rcRect, rcToolbar;
|
||
GetClientRect( &rcRect );
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
rcRect.top += rcToolbar.Height();
|
||
|
||
CDC *pDC = GetDC();
|
||
m_pmemDC->CreateCompatibleDC( pDC );
|
||
m_pdcBitmap->CreateCompatibleBitmap( pDC, rcRect.Width(), rcRect.Height() );
|
||
ReleaseDC( pDC );
|
||
}
|
||
|
||
void CPropPoolView::DeleteMemDC()
|
||
{
|
||
if( m_pdcBitmap ) {
|
||
m_pdcBitmap->DeleteObject();
|
||
SAFE_DELETE( m_pdcBitmap );
|
||
}
|
||
if( m_pmemDC ) {
|
||
m_pmemDC->DeleteDC();
|
||
SAFE_DELETE( m_pmemDC );
|
||
}
|
||
}
|
||
|
||
int CPropPoolView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
||
{
|
||
if (CFormView::OnCreate(lpCreateStruct) == -1)
|
||
return -1;
|
||
|
||
g_PropPoolControl.LoadStage();
|
||
|
||
// TODO: Add your specialized creation code here
|
||
m_wndToolBar.CreateToolBar(WS_VISIBLE|WS_CHILD|CBRS_TOOLTIPS, this);
|
||
m_wndToolBar.LoadToolBar(IDR_PROPPOOL);
|
||
|
||
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlButton, ID_POOL_EMPTY, TRUE, FALSE );
|
||
pControl->SetStyle(xtpButtonIconAndCaption);
|
||
|
||
m_wndToolBar.GetControls()->SetControlType( 2, xtpControlComboBox );
|
||
pControl = m_wndToolBar.GetControls()->FindControl( xtpControlComboBox, ID_POOL_LOADLIST, TRUE, FALSE );
|
||
|
||
CXTPControlComboBox* pCombo = (CXTPControlComboBox*)pControl;
|
||
|
||
pCombo->InsertString( pCombo->GetCount(), "None" );
|
||
|
||
for( DWORD i=0; i<g_PropPoolControl.GetStageCount(); i++ ) {
|
||
pCombo->InsertString( pCombo->GetCount(), g_PropPoolControl.GetStageName(i) );
|
||
}
|
||
pCombo->SetCurSel(0);
|
||
|
||
return 0;
|
||
}
|
||
|
||
BOOL CPropPoolView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
|
||
{
|
||
// TODO: Add your message handler code here and/or call default
|
||
if( GetAKState( VK_LCONTROL ) < 0 ) {
|
||
if( zDelta > 0 ) {
|
||
m_nCircleRadius += 10;
|
||
}
|
||
else {
|
||
m_nCircleRadius -= 10;
|
||
if( m_nCircleRadius < 100 ) m_nCircleRadius = 100;
|
||
}
|
||
ResetScroll();
|
||
Invalidate();
|
||
}
|
||
|
||
return CFormView::OnMouseWheel(nFlags, zDelta, pt);
|
||
}
|
||
|
||
|
||
void CPropPoolView::ResetScroll()
|
||
{
|
||
CRect rcRect, rcToolbar;
|
||
GetClientRect( &rcRect );
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
rcRect.top += rcToolbar.Height();
|
||
|
||
|
||
m_ScrollSize.cx = 0;
|
||
m_ScrollSize.cy = 0;
|
||
|
||
if( rcRect.Height() - 8 < m_nCircleRadius ) {
|
||
m_ScrollSize.cy = m_nCircleRadius - rcRect.Height() + 8;
|
||
if( m_ScrollPos.cy > m_ScrollSize.cy )
|
||
m_ScrollPos.cy = m_ScrollSize.cy;
|
||
}
|
||
|
||
if( rcRect.Width() - 8 < m_nCircleRadius ) {
|
||
m_ScrollSize.cx = m_nCircleRadius - rcRect.Width() + 8;
|
||
if( m_ScrollPos.cx > m_ScrollSize.cx )
|
||
m_ScrollPos.cx = m_ScrollSize.cx;
|
||
}
|
||
}
|
||
|
||
void CPropPoolView::CalcScrollRect( bool bVert, CRect &rcResult )
|
||
{
|
||
CRect rcRect, rcToolbar;
|
||
GetClientRect( &rcRect );
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
rcRect.top += rcToolbar.Height();
|
||
|
||
if( bVert ) {
|
||
rcResult.top = 0;
|
||
rcResult.bottom = rcRect.bottom - rcToolbar.Height() - 7;
|
||
rcResult.left = rcRect.right - 7;
|
||
rcResult.right = rcRect.right;
|
||
}
|
||
else {
|
||
rcResult.top = rcRect.bottom - rcToolbar.Height() - 7;
|
||
rcResult.bottom = rcRect.bottom- rcToolbar.Height();
|
||
rcResult.left = 0;
|
||
rcResult.right = rcRect.right - 7;
|
||
}
|
||
}
|
||
|
||
|
||
void CPropPoolView::OnLButtonDown(UINT nFlags, CPoint point)
|
||
{
|
||
// TODO: Add your message handler code here and/or call default
|
||
m_bLBDown = true;
|
||
|
||
CRect rcScroll, rcToolbar;
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
|
||
CalcScrollRect( false, rcScroll );
|
||
rcScroll.top += rcToolbar.Height();
|
||
rcScroll.bottom += rcToolbar.Height();
|
||
|
||
if( point.x >= rcScroll.left && point.x <= rcScroll.right && point.y >= rcScroll.top && point.y <= rcScroll.bottom ) {
|
||
m_ScrollPos.cx = (int)( ( m_ScrollSize.cx / 100.f ) * ( ( 100.f / ( rcScroll.Width() - 20 ) ) * ( point.x - rcScroll.left ) ) );
|
||
if( m_ScrollPos.cx > m_ScrollSize.cx ) m_ScrollPos.cx = m_ScrollSize.cx;
|
||
m_bInScroll = true;
|
||
ClientToScreen( &rcScroll );
|
||
ClipCursor( &rcScroll );
|
||
Invalidate();
|
||
}
|
||
|
||
CalcScrollRect( true, rcScroll );
|
||
rcScroll.top += rcToolbar.Height();
|
||
rcScroll.bottom += rcToolbar.Height();
|
||
|
||
if( point.x >= rcScroll.left && point.x <= rcScroll.right && point.y >= rcScroll.top && point.y <= rcScroll.bottom ) {
|
||
m_ScrollPos.cy = (int)( ( m_ScrollSize.cy / 100.f ) * ( ( 100.f / ( rcScroll.Height() - 20 ) ) * ( point.y - rcScroll.top ) ) );
|
||
if( m_ScrollPos.cy > m_ScrollSize.cy ) m_ScrollPos.cy = m_ScrollSize.cy;
|
||
m_bInScroll = true;
|
||
ClientToScreen( &rcScroll );
|
||
ClipCursor( &rcScroll );
|
||
Invalidate();
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD><DBBC><EFBFBD>Ʈ
|
||
if( !m_bInScroll ) {
|
||
CPropPoolStage *pStage = g_PropPoolControl.GetCurrentStage();
|
||
|
||
CRect rcRect;
|
||
EtVector2 vOffset;
|
||
int nCenter = ( 7 + 2 )/*<2A><><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B>β<EFBFBD>*/ + ( m_nCircleRadius / 2 );
|
||
|
||
CRect rcToolbar;
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
|
||
bool bRefresh = false;
|
||
for( DWORD i=0; i<pStage->GetPropCount(); i++ ) {
|
||
vOffset = pStage->GetPropOffset(i);
|
||
|
||
vOffset *= (float)( m_nCircleRadius / 2.f );
|
||
vOffset.x = nCenter - vOffset.x;
|
||
vOffset.y = nCenter - vOffset.y;
|
||
|
||
rcRect.left = (int)( vOffset.x - m_nIconSize );
|
||
rcRect.right = (int)( vOffset.x + m_nIconSize );
|
||
rcRect.top = (int)( vOffset.y - m_nIconSize );
|
||
rcRect.bottom = (int)( vOffset.y + m_nIconSize );
|
||
rcRect -= m_ScrollPos;
|
||
|
||
if( point.x >= rcRect.left && point.x <= rcRect.right && point.y - rcToolbar.Height() >= rcRect.top && point.y - rcToolbar.Height() <= rcRect.bottom ) {
|
||
m_nSelectItemIndex = (int)i;
|
||
m_bRemoveArea = false;
|
||
bRefresh = true;
|
||
break;
|
||
}
|
||
}
|
||
if( bRefresh == false && m_nSelectItemIndex != -1 ) {
|
||
m_nSelectItemIndex = -1;
|
||
bRefresh = true;
|
||
}
|
||
if( bRefresh == true ) Invalidate();
|
||
}
|
||
|
||
CFormView::OnLButtonDown(nFlags, point);
|
||
}
|
||
|
||
void CPropPoolView::OnLButtonUp(UINT nFlags, CPoint point)
|
||
{
|
||
// TODO: Add your message handler code here and/or call default
|
||
m_bLBDown = false;
|
||
m_bInScroll = false;
|
||
ClipCursor( NULL );
|
||
if( m_nSelectItemIndex != -1 ) {
|
||
if( m_bRemoveArea == false ) {
|
||
EtVector2 vOffset = MousePosToOffset( point );
|
||
if( EtVec2Length( &vOffset ) > 1.f ) m_bRemoveArea = true;
|
||
}
|
||
if( m_bRemoveArea == true ) {
|
||
g_PropPoolControl.GetCurrentStage()->RemoveProp( m_nSelectItemIndex );
|
||
m_nSelectItemIndex = -1;
|
||
m_nDetailViewIndex = -1;
|
||
m_bRemoveArea = false;
|
||
Invalidate();
|
||
}
|
||
}
|
||
|
||
CFormView::OnLButtonUp(nFlags, point);
|
||
}
|
||
|
||
void CPropPoolView::OnMouseMove(UINT nFlags, CPoint point)
|
||
{
|
||
CFormView::OnMouseMove(nFlags, point);
|
||
// TODO: Add your message handler code here and/or call default
|
||
if( m_bLBDown ) {
|
||
if( m_bInScroll == true ) {
|
||
CRect rcScroll, rcToolbar;
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
|
||
CalcScrollRect( false, rcScroll );
|
||
rcScroll.top += rcToolbar.Height();
|
||
rcScroll.bottom += rcToolbar.Height();
|
||
|
||
if( point.x >= rcScroll.left && point.x <= rcScroll.right && point.y >= rcScroll.top && point.y <= rcScroll.bottom ) {
|
||
m_ScrollPos.cx = (int)( ( m_ScrollSize.cx / 100.f ) * ( ( 100.f / ( rcScroll.Width() - 20 ) ) * ( point.x - rcScroll.left ) ) );
|
||
if( m_ScrollPos.cx > m_ScrollSize.cx ) m_ScrollPos.cx = m_ScrollSize.cx;
|
||
Invalidate();
|
||
}
|
||
|
||
CalcScrollRect( true, rcScroll );
|
||
rcScroll.top += rcToolbar.Height();
|
||
rcScroll.bottom += rcToolbar.Height();
|
||
|
||
if( point.x >= rcScroll.left && point.x <= rcScroll.right && point.y >= rcScroll.top && point.y <= rcScroll.bottom ) {
|
||
m_ScrollPos.cy = (int)( ( m_ScrollSize.cy / 100.f ) * ( ( 100.f / ( rcScroll.Height() - 20 ) ) * ( point.y - rcScroll.top ) ) );
|
||
if( m_ScrollPos.cy > m_ScrollSize.cy ) m_ScrollPos.cy = m_ScrollSize.cy;
|
||
Invalidate();
|
||
}
|
||
}
|
||
else if( m_nSelectItemIndex != -1 ) {
|
||
CPropPoolStage *pStage = g_PropPoolControl.GetCurrentStage();
|
||
|
||
CRect rcToolbar;
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
|
||
CPoint p = point;
|
||
p.x += m_ScrollPos.cx;
|
||
p.y += m_ScrollPos.cy - rcToolbar.Height();
|
||
|
||
EtVector2 vOffset = MousePosToOffset( p );
|
||
if( EtVec2Length( &vOffset ) > 1.f ) m_bRemoveArea = true;
|
||
else m_bRemoveArea = false;
|
||
|
||
pStage->SetPropOffset( (DWORD)m_nSelectItemIndex, vOffset );
|
||
Invalidate();
|
||
return;
|
||
}
|
||
}
|
||
|
||
// <20><>ũ
|
||
if( m_bInScroll == false ) {
|
||
CPropPoolStage *pStage = g_PropPoolControl.GetCurrentStage();
|
||
|
||
CRect rcRect;
|
||
EtVector2 vOffset;
|
||
int nCenter = ( 7 + 2 )/*<2A><><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B>β<EFBFBD>*/ + ( m_nCircleRadius / 2 );
|
||
|
||
CRect rcToolbar;
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
|
||
bool bRefresh = false;
|
||
for( DWORD i=0; i<pStage->GetPropCount(); i++ ) {
|
||
vOffset = pStage->GetPropOffset(i);
|
||
|
||
vOffset *= (float)( m_nCircleRadius / 2.f );
|
||
vOffset.x = nCenter - vOffset.x;
|
||
vOffset.y = nCenter - vOffset.y;
|
||
|
||
rcRect.left = (int)( vOffset.x - m_nIconSize );
|
||
rcRect.right = (int)( vOffset.x + m_nIconSize );
|
||
rcRect.top = (int)( vOffset.y - m_nIconSize );
|
||
rcRect.bottom = (int)( vOffset.y + m_nIconSize );
|
||
rcRect -= m_ScrollPos;
|
||
|
||
if( point.x >= rcRect.left && point.x <= rcRect.right && point.y - rcToolbar.Height() >= rcRect.top && point.y - rcToolbar.Height() <= rcRect.bottom ) {
|
||
m_nDetailViewIndex = (int)i;
|
||
bRefresh = true;
|
||
break;
|
||
}
|
||
}
|
||
if( bRefresh == false && m_nDetailViewIndex != -1 ) {
|
||
m_nDetailViewIndex = -1;
|
||
bRefresh = true;
|
||
}
|
||
if( bRefresh == true ) Invalidate();
|
||
}
|
||
|
||
}
|
||
|
||
EtVector2 CPropPoolView::MousePosToOffset( CPoint vPos )
|
||
{
|
||
int nCenter = ( 7 + 2 )/*<2A><><EFBFBD>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B>β<EFBFBD>*/ + ( m_nCircleRadius / 2 );
|
||
EtVector2 vOffset( (float)( nCenter - vPos.x ) , (float)( nCenter - vPos.y ) );
|
||
|
||
vOffset.x = ( 1.f / (float)( m_nCircleRadius / 2.f ) ) * vOffset.x;
|
||
vOffset.y = ( 1.f / (float)( m_nCircleRadius / 2.f ) ) * vOffset.y;
|
||
return vOffset;
|
||
}
|
||
|
||
LRESULT CPropPoolView::OnDropItem( WPARAM wParam, LPARAM lParam )
|
||
{
|
||
CRect rcToolbar;
|
||
m_wndToolBar.GetClientRect( &rcToolbar );
|
||
|
||
CPoint p;
|
||
p.x = (long)lParam >> 16;
|
||
p.y = (long)( lParam << 16 ) >> 16;
|
||
p.x += m_ScrollPos.cx;
|
||
p.y += m_ScrollPos.cy - rcToolbar.Height();
|
||
char *szFileName = (char *)wParam;
|
||
|
||
EtVector2 vOffset = MousePosToOffset( p );
|
||
if( EtVec2Length( &vOffset ) > 1.f ) return S_OK;
|
||
|
||
char szName[256] = { 0, };
|
||
_GetFullFileName( szName, _countof(szName), szFileName );
|
||
g_PropPoolControl.GetCurrentStage()->AddProp( szName, vOffset );
|
||
Invalidate();
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
LRESULT CPropPoolView::OnDropMoveItem( WPARAM wParam, LPARAM lParam )
|
||
{
|
||
return S_OK;
|
||
}
|
||
|
||
LRESULT CPropPoolView::OnDblClickItem( WPARAM wParam, LPARAM lParam )
|
||
{
|
||
g_PropPoolControl.GetCurrentStage()->Empty();
|
||
|
||
char *szFileName = (char *)wParam;
|
||
|
||
char szName[256] = { 0, };
|
||
_GetFullFileName( szName, _countof(szName), szFileName );
|
||
g_PropPoolControl.GetCurrentStage()->AddProp( szName, EtVector2( 0.f, 0.f ) );
|
||
Invalidate();
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
void CPropPoolView::OnPoolEmpty()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
g_PropPoolControl.GetCurrentStage()->Empty();
|
||
Invalidate();
|
||
}
|
||
|
||
void CPropPoolView::OnPoolSave()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
}
|
||
|
||
void CPropPoolView::OnPoolLoadlist()
|
||
{
|
||
// TODO: Add your command handler code here
|
||
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlComboBox, ID_POOL_LOADLIST, TRUE, FALSE );
|
||
CXTPControlComboBox* pCombo = (CXTPControlComboBox*)pControl;
|
||
|
||
CString szStr;
|
||
pCombo->GetLBText( pCombo->GetCurSel(), szStr );
|
||
|
||
g_PropPoolControl.SetCurrentStage( szStr );
|
||
}
|
||
|
||
void CPropPoolView::OnUpdatePoolEmpty(CCmdUI *pCmdUI)
|
||
{
|
||
// TODO: Add your command update UI handler code here
|
||
pCmdUI->Enable( CFileServer::GetInstance().IsConnect() );
|
||
}
|
||
|
||
void CPropPoolView::OnUpdatePoolSave(CCmdUI *pCmdUI)
|
||
{
|
||
// TODO: Add your command update UI handler code here
|
||
bool bEnable = CFileServer::GetInstance().IsConnect();
|
||
|
||
if( bEnable == true ) {
|
||
CXTPControl *pControl = m_wndToolBar.GetControls()->FindControl( xtpControlComboBox, ID_POOL_LOADLIST, TRUE, FALSE );
|
||
CXTPControlComboBox* pCombo = (CXTPControlComboBox*)pControl;
|
||
if( pCombo->GetCurSel() == 0 ) bEnable = true;
|
||
else bEnable = false;
|
||
}
|
||
pCmdUI->Enable( bEnable );
|
||
}
|
||
|
||
void CPropPoolView::OnUpdatePoolLoadlist(CCmdUI *pCmdUI)
|
||
{
|
||
// TODO: Add your command update UI handler code here
|
||
pCmdUI->Enable( CFileServer::GetInstance().IsConnect() );
|
||
}
|