⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 animview.cpp

📁 Resource editor base speadrum Chinese mobile
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// AnimView.cpp : implementation file
//

#include "stdafx.h"
#include "resourceeditor.h"
#include "AnimView.h"
#include "AnimDoc.h"

#include "DirFileInfo.h"
#include "FileDlg.h"
#include "ItemDlg.h"
#include "PlayDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

const UINT   CAnimView::PLAY_TIMER    = 0;
const _TCHAR CAnimView::SZ_FILE_EXT[] = _T(".bmp");
/////////////////////////////////////////////////////////////////////////////
// CAnimView

IMPLEMENT_DYNCREATE(CAnimView, CTreeViewEx)

CAnimView::CAnimView()
{
    m_bPlay     = FALSE;
    m_pAnimInfo = NULL;
    m_nPlayIdx  = 0;
    m_nPlayEnd  = 0;
    m_nPlayInterval = 200;
}

CAnimView::~CAnimView()
{
    if( m_hBmp != NULL )
    {
        ::DeleteObject(m_hBmp);
        m_hBmp = NULL;
    }
}

BEGIN_MESSAGE_MAP(CAnimView, CTreeViewEx)
	//{{AFX_MSG_MAP(CAnimView)
	ON_COMMAND(IDM_ANIM_ADD, OnAnimAdd)
	ON_COMMAND(IDM_ANIM_DEL, OnAnimDel)
	ON_COMMAND(IDM_ANIM_PROPERTY, OnAnimProperty)
	ON_COMMAND(IDM_ANIM_REPLACE, OnAnimReplace)
    ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	ON_WM_RBUTTONDOWN()
	ON_UPDATE_COMMAND_UI(IDM_ANIM_ADD, OnUpdateAnimAdd)
	ON_UPDATE_COMMAND_UI(IDM_ANIM_DEL, OnUpdateAnimDel)
	ON_UPDATE_COMMAND_UI(IDM_ANIM_PROPERTY, OnUpdateAnimProperty)
	ON_UPDATE_COMMAND_UI(IDM_ANIM_REPLACE, OnUpdateAnimReplace)
	ON_WM_TIMER()
	ON_COMMAND(IDM_ANIM_PLAY, OnAnimPlay)
	ON_UPDATE_COMMAND_UI(IDM_ANIM_PLAY, OnUpdateAnimPlay)
    ON_COMMAND(ID_OPTION_PLAY_SETTING, OnOptionPlaySetting)
	ON_COMMAND(ID_OPTION_ANIM_SIZEINFO, OnOptionAnimSizeinfo)
	ON_UPDATE_COMMAND_UI(ID_OPTION_ANIM_SIZEINFO, OnUpdateOptionAnimSizeinfo)
	ON_COMMAND(IDM_ANIM_EXPORT, OnAnimExport)
	ON_UPDATE_COMMAND_UI(IDM_ANIM_EXPORT, OnUpdateAnimExport)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CAnimView drawing

void CAnimView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CAnimView diagnostics

#ifdef _DEBUG
void CAnimView::AssertValid() const
{
	CTreeViewEx::AssertValid();
}

void CAnimView::Dump(CDumpContext& dc) const
{
	CTreeViewEx::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CAnimView message handlers


BOOL CAnimView::PreTrackPopupMenu( CMenu * pMenu, HTREEITEM hItem )
{
	_ASSERTE( pMenu != NULL );

	if( !g_theApp.IsSuperUser() )
	{
		if( NULL == hItem )
		{
			return FALSE;
		}
		else
		{
			pMenu->DeleteMenu(IDM_ANIM_ADD, MF_BYCOMMAND);
			pMenu->DeleteMenu(IDM_ANIM_DEL, MF_BYCOMMAND);
			pMenu->DeleteMenu(IDM_ANIM_EXPORT, MF_BYCOMMAND);
		}
	}
	else if( NULL == hItem )
	{
        pMenu->EnableMenuItem( IDM_ANIM_DEL,      MF_BYCOMMAND | MF_GRAYED );
        pMenu->EnableMenuItem( IDM_ANIM_REPLACE,  MF_BYCOMMAND | MF_GRAYED );
        pMenu->EnableMenuItem( IDM_ANIM_PROPERTY, MF_BYCOMMAND | MF_GRAYED );
        pMenu->EnableMenuItem( IDM_ANIM_PLAY,     MF_BYCOMMAND | MF_GRAYED );
		pMenu->EnableMenuItem( IDM_ANIM_EXPORT,   MF_BYCOMMAND | MF_GRAYED );
		//return FALSE;
	}

    if( hItem != NULL )
    {
        // 区分目录还是文件
        CTreeCtrl &tc = GetTreeCtrl();
		CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);

        if( tc.GetChildItem(hItem) == NULL && !m_pInfo->IsDirNode(pNode))
        {
            return FALSE;  
        }
		
		if(tc.GetChildItem(hItem) == NULL && m_pInfo->IsDirNode(pNode))
		{
			pMenu->EnableMenuItem( IDM_ANIM_REPLACE,  MF_BYCOMMAND | MF_GRAYED );
			pMenu->EnableMenuItem( IDM_ANIM_PROPERTY, MF_BYCOMMAND | MF_GRAYED );
			pMenu->EnableMenuItem( IDM_ANIM_PLAY,     MF_BYCOMMAND | MF_GRAYED );
			pMenu->EnableMenuItem( IDM_ANIM_EXPORT,   MF_BYCOMMAND | MF_GRAYED );
			pMenu->EnableMenuItem( ID_OPTION_ANIM_SIZEINFO,   MF_BYCOMMAND | MF_GRAYED );

			//return TRUE;
		}

        //CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
        if( !m_pInfo->IsDirNode(pNode) )
        {
            pMenu->EnableMenuItem( IDM_ANIM_ADD, MF_BYCOMMAND | MF_GRAYED );

            static _TCHAR szText[16];
            if( !m_bPlay )
                _tcscpy(szText, _T("Play"));
            else
                _tcscpy(szText, _T("Stop"));
            pMenu->ModifyMenu( IDM_ANIM_PLAY, MF_BYCOMMAND | MF_STRING, IDM_ANIM_PLAY, szText );
        }
        else
        {
            pMenu->EnableMenuItem( IDM_ANIM_PROPERTY, MF_BYCOMMAND | MF_GRAYED );
            pMenu->EnableMenuItem( IDM_ANIM_PLAY, MF_BYCOMMAND | MF_GRAYED );
        }
    }

    if( m_SizeInfo.GetStartPosition() == NULL )
    {
        pMenu->EnableMenuItem( ID_OPTION_ANIM_SIZEINFO, MF_BYCOMMAND | MF_GRAYED );
    }

	return TRUE;
}

void CAnimView::OnAnimAdd() 
{
	// TODO: Add your command handler code here
	CFileDlg fdlg;
	fdlg.SetHwnOwner(this->m_hWnd);
    CString strDir = fdlg.GetSelectDir();
    if( strDir.IsEmpty() )
        return;
	//check the length of file dirctory 
	/*
	int n = strDir.ReverseFind('\\');
    n=strDir.GetLength()-n-1;
	if(n>128)
	{
		MessageBox("The length of directory is no more than 128 characters at best!");
		return;
	}
    //check the file directory empty or not
	//check the file directory if it contains sub-directory or not	
	int nFileNum = GetAnimFileNum(strDir);
	if(nFileNum == 0)
	{
		MessageBox("The file directory can't be empty\nor contain sub-directory!");
 		return; 
	}
	if(nFileNum ==1)
	{
		MessageBox("The file directory can't contain only one bmp file!");
 		return; 
	}
    int nCount = 0;
    CString strDirName = strDir;
    strDirName += _T("\\*.*");
    WIN32_FIND_DATA wfd = { 0 };
    HANDLE hFind = ::FindFirstFile( strDirName, &wfd );
    ::FindNextFile(hFind, &wfd);
    while( ::FindNextFile(hFind, &wfd) )
    {

        CString strFileName =((CString) (wfd.cFileName)).Left(((CString) (wfd.cFileName)).GetLength() - 4);
		LPCTSTR pExt = _tcsrchr(wfd.cFileName, _T('.'));
        if( pExt != NULL && _tcsicmp(pExt, SZ_FILE_EXT) == 0 && atoi(strFileName)>=1)
            nCount++;
		else
			break;
    }
    ::FindClose(hFind);	
	if (nCount != nFileNum)
	{
		MessageBox("The file name in the directory must be like (1.bmp--9.bmp,01.bmp--99.bmp)!");
 		return; 
	}
    */
    CWaitCursor waitCur;

    CTreeCtrl &tc = GetTreeCtrl();
    HTREEITEM hItem = tc.GetSelectedItem();
    if( hItem == NULL ) 
        hItem = TVI_ROOT;

    CDirFileNode * pRoot = hItem != TVI_ROOT ?
                           (CDirFileNode *)tc.GetItemData(hItem) :
                           (CDirFileNode *)m_pInfo->GetRoot();

    HTREEITEM hOldItem = tc.GetSelectedItem();
    if( !EnumAndFillImgs(pRoot, hItem, strDir) )
    {
        if( hItem != NULL && hItem != TVI_ROOT && hOldItem != hItem )
        {
            CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);

            RemoveAllRes(pNode);
      
            tc.DeleteItem(hItem);
        }

        AfxMessageBox(_T("Add animation fail!"));
    }
    else
    {
        SetModifiedFlag();
    }
}

void CAnimView::OnAnimDel() 
{
	// TODO: Add your command handler code here
    if( AfxMessageBox(_T("Are you sure to delete this directory?"), MB_YESNO) == IDNO )
        return;

    CTreeCtrl &tc = GetTreeCtrl();
    HTREEITEM hItem = tc.GetSelectedItem();
    _ASSERTE( hItem != NULL );

    CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
    if( RemoveAllRes(pNode) )
    {
        RemoveSizeInfo( tc.GetChildItem(hItem) );
        m_SizeInfo.DeleteByHandle( (DWORD)hItem );

        tc.DeleteItem(hItem);
    
        SetModifiedFlag();
    }
}

void CAnimView::OnAnimProperty() 
{
	// TODO: Add your command handler code here
	CTreeCtrl &tc   = GetTreeCtrl();
    HTREEITEM hItem = tc.GetSelectedItem();
    _ASSERTE( hItem != NULL );

    CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
    _ASSERTE( pNode != NULL );

    PANIMINFO pAnimInfo = NULL;
    VERIFY( g_theApp.m_MMIRes.m_mapAnim.Lookup(pNode->szID, pAnimInfo) );
    CBmpProcessor bmpProc;
	CItemDlg dlg;
    dlg.m_strContent.Format( _T("ID:   %s\r\nName: %s\r\nSize: %d * %d, %d(bytes)\r\n%s:0x%.6x"), 
                                pNode->szID,   pNode->szName, 
                                pNode->nWidth, pNode->nHeight, pAnimInfo->nSize,
								_T("Transparent Color"),bmpProc.GetAnimTransColor(pAnimInfo->pCompressed));
    dlg.m_strComment = pNode->szComment;
	if( dlg.DoModal() == IDOK )
    {
        _tcscpy(pNode->szComment, dlg.m_strComment);
    }
	
	//debug
/*	CFileDialog fDlg(TRUE);
	fDlg.DoModal();
	CString strDirName = fDlg.GetPathName();
	strDirName = strDirName.Left(strDirName.ReverseFind('\\')+1);
	strDirName+=pNode->szName;
	g_theApp.m_MMIRes.ExportAnim(pNode->szID,strDirName);*/

}

void CAnimView::OnAnimReplace() 
{
	// TODO: Add your command handler code here

    // replace no prompt
	// if( AfxMessageBox(_T("Are sure replace this dirctory?"), MB_YESNO) == IDNO )
    //     return;
   
    if( m_bPlay )
    {
        KillTimer(PLAY_TIMER);
        m_bPlay = FALSE;
    }

    CFileDlg dlg;
	dlg.SetHwnOwner(this->m_hWnd);//*@Hongliang Xin 2006-9-26
    CString strDir = dlg.GetSelectDir();
    if( strDir.IsEmpty() )
        return;
   
    CTreeCtrl &tc   = GetTreeCtrl();
    HTREEITEM hItem = tc.GetSelectedItem();
    _ASSERTE( hItem != NULL );

    if( ReplaceAnimDir( hItem, strDir, !g_theApp.IsSuperUser() ) )
    {
        SetModifiedFlag();
    }
}

void CAnimView::OnInitialUpdate() 
{
	CTreeViewEx::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	m_pInfo = g_theApp.m_pAnimInfo;
    _ASSERTE( m_pInfo != NULL );

    FillTreeCtrl((CDirFileNode *)m_pInfo->GetRoot());

    m_SizeInfo.DeleteAll();
}

void CAnimView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here

    CDocument * pDoc = GetDocument();
    ASSERT_VALID( pDoc );

    if( m_bPlay )
    {
        KillTimer(PLAY_TIMER);
        m_bPlay = FALSE;
    }

    CTreeCtrl &tc   = GetTreeCtrl();
    HTREEITEM hItem = pNMTreeView->itemNew.hItem;
   
    if( m_hBmp != NULL )
    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -