📄 animview.cpp
字号:
// 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 + -