📄 imgcategview.cpp
字号:
// PicCategView.cpp : implementation file
//
#include "stdafx.h"
#include "resourceeditor.h"
#include "ImgCategView.h"
#include "ImgDoc.h"
#include "DirFileInfo.h"
#include "FileDlg.h"
#include "ItemDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
const _TCHAR CImgCategView::SZ_FILE_EXT[] = _T(".bmp");
const _TCHAR CImgCategView::SZ_FILTER[] = _T("resource files (*.bmp)|*.bmp|All Files (*.*)|*.*||");
/////////////////////////////////////////////////////////////////////////////
// CImgCategView
IMPLEMENT_DYNCREATE(CImgCategView, CTreeViewEx)
CImgCategView::CImgCategView()
{
m_pInfo = NULL;
}
CImgCategView::~CImgCategView()
{
}
BEGIN_MESSAGE_MAP(CImgCategView, CTreeViewEx)
//{{AFX_MSG_MAP(CImgCategView)
ON_COMMAND(IDM_IMG_ADD_DIR, OnImgAddDir)
ON_COMMAND(IDM_IMG_ADD_FILE, OnImgAddFile)
ON_COMMAND(IDM_IMG_REMOVE_DIR, OnImgRemoveDir)
ON_COMMAND(IDM_IMG_REMOVE_FILE, OnImgRemoveFile)
ON_COMMAND(IDM_IMG_REPLACE_DIR, OnImgReplaceDir)
ON_COMMAND(IDM_IMG_REPLACE_FILE, OnImgReplaceFile)
ON_COMMAND(IDM_IMG_PROPERTY, OnImgProperty)
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
ON_WM_RBUTTONDOWN()
ON_UPDATE_COMMAND_UI(IDM_IMG_ADD_DIR, OnUpdateImgAddDir)
ON_UPDATE_COMMAND_UI(IDM_IMG_ADD_FILE, OnUpdateImgAddFile)
ON_UPDATE_COMMAND_UI(IDM_IMG_PROPERTY, OnUpdateImgProperty)
ON_UPDATE_COMMAND_UI(IDM_IMG_REMOVE_DIR, OnUpdateImgRemoveDir)
ON_UPDATE_COMMAND_UI(IDM_IMG_REMOVE_FILE, OnUpdateImgRemoveFile)
ON_UPDATE_COMMAND_UI(IDM_IMG_REPLACE_DIR, OnUpdateImgReplaceDir)
ON_UPDATE_COMMAND_UI(IDM_IMG_REPLACE_FILE, OnUpdateImgReplaceFile)
ON_COMMAND(ID_OPTION_IMG_SIZEINFO, OnOptionImgSizeinfo)
ON_UPDATE_COMMAND_UI(ID_OPTION_IMG_SIZEINFO, OnUpdateOptionImgSizeinfo)
ON_COMMAND(IDM_IMG_EXPORT_TO_DIR, OnImgExportToDir)
ON_UPDATE_COMMAND_UI(IDM_IMG_EXPORT_TO_DIR, OnUpdateImgExportToDir)
ON_COMMAND(IDM_IMG_EXPORT_TO_FILE, OnImgExportToFile)
ON_UPDATE_COMMAND_UI(IDM_IMG_EXPORT_TO_FILE, OnUpdateImgExportToFile)
ON_COMMAND(IDM_IMG_ADD_DIR_COMPRESS, OnImgAddDirCompress)
ON_UPDATE_COMMAND_UI(IDM_IMG_ADD_DIR_COMPRESS, OnUpdateImgAddDirCompress)
ON_COMMAND(IDM_IMG_REPLACE_DIR_COMPRESS, OnImgReplaceDirCompress)
ON_UPDATE_COMMAND_UI(IDM_IMG_REPLACE_DIR_COMPRESS, OnUpdateImgReplaceDirCompress)
ON_COMMAND(IDM_IMG_ADD_FILE_COMPRESS, OnImgAddFileCompress)
ON_UPDATE_COMMAND_UI(IDM_IMG_ADD_FILE_COMPRESS, OnUpdateImgAddFileCompress)
ON_COMMAND(IDM_IMG_REPLACE_FILE_COMPRESS, OnImgReplaceFileCompress)
ON_UPDATE_COMMAND_UI(IDM_IMG_REPLACE_FILE_COMPRESS, OnUpdateImgReplaceFileCompress)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CImgCategView drawing
void CImgCategView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CImgCategView diagnostics
#ifdef _DEBUG
void CImgCategView::AssertValid() const
{
CTreeViewEx::AssertValid();
}
void CImgCategView::Dump(CDumpContext& dc) const
{
CTreeViewEx::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CImgCategView message handlers
BOOL CImgCategView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
return CTreeViewEx::PreCreateWindow(cs);
}
BOOL CImgCategView::PreTrackPopupMenu( CMenu * pMenu, HTREEITEM hItem )
{
_ASSERTE( pMenu != NULL );
if( !g_theApp.IsSuperUser() )
{
if( hItem == NULL )
{
return FALSE;
}
else
{
pMenu->DeleteMenu(IDM_IMG_ADD_DIR, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_IMG_ADD_DIR_COMPRESS, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_IMG_REMOVE_DIR, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_IMG_ADD_FILE, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_IMG_ADD_FILE_COMPRESS, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_IMG_REMOVE_FILE, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_IMG_EXPORT_TO_DIR, MF_BYCOMMAND);
pMenu->DeleteMenu(IDM_IMG_EXPORT_TO_FILE, MF_BYCOMMAND);
}
}
else if( hItem == NULL )
{
pMenu->EnableMenuItem( IDM_IMG_REMOVE_DIR, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REPLACE_DIR, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REPLACE_DIR_COMPRESS, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REMOVE_FILE, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REPLACE_FILE, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REPLACE_FILE_COMPRESS, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_EXPORT_TO_FILE, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_EXPORT_TO_DIR, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_PROPERTY, MF_BYCOMMAND | MF_GRAYED );
}
if( hItem != NULL )
{
// 区分目录还是文件
CTreeCtrl &tc = GetTreeCtrl();
CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
if( m_pInfo->IsDirNode( pNode ) )
{
pMenu->EnableMenuItem( IDM_IMG_PROPERTY, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REPLACE_FILE, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REPLACE_FILE_COMPRESS, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REMOVE_FILE, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_EXPORT_TO_FILE, MF_BYCOMMAND | MF_GRAYED );
}
else
{
pMenu->EnableMenuItem( IDM_IMG_ADD_DIR, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_ADD_DIR_COMPRESS, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REMOVE_DIR, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REPLACE_DIR, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_REPLACE_DIR_COMPRESS, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_ADD_FILE, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_ADD_FILE_COMPRESS, MF_BYCOMMAND | MF_GRAYED );
pMenu->EnableMenuItem( IDM_IMG_EXPORT_TO_DIR, MF_BYCOMMAND | MF_GRAYED );
}
}
if( m_SizeInfo.GetStartPosition() == NULL )
{
pMenu->EnableMenuItem( ID_OPTION_IMG_SIZEINFO, MF_BYCOMMAND | MF_GRAYED );
}
return TRUE;
}
void CImgCategView::OnImgAddDir()
{
// TODO: Add your command handler code here
CFileDlg fdlg;
fdlg.SetHwnOwner(this->m_hWnd);//*@Hongliang Xin 2006-5-31
CString strDir = fdlg.GetSelectDir();
if( strDir.IsEmpty() )
return;
int n = strDir.ReverseFind('\\');
n=strDir.GetLength()-n-1;
if(n>128)
{
MessageBox(_T("The length of directory is no more than 128 characters at best!"));
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, FALSE) ) //不压缩
{
if( hItem != NULL && hItem != TVI_ROOT && hOldItem != hItem)
{
CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
RemoveAllRes(pNode);
tc.DeleteItem(hItem);
}
AfxMessageBox(_T("Add directory fail!"));
}
else
{
SetModifiedFlag();
}
}
void CImgCategView::OnImgAddFile()
{
// TODO: Add your command handler code here
CFileDlg fdlg;
fdlg.SetFileExt(SZ_FILE_EXT);
fdlg.SetFileFilter(SZ_FILTER);
CString strFileName = fdlg.GetPathName();
if( strFileName.IsEmpty() )
return;
int n = strFileName.ReverseFind('\\');
n=strFileName.GetLength()-n-1;
if(n>128)
{
MessageBox(_T("The length of filename is no more than 128 characters at best!"));
return;
}
CDirFileNode * pParent = NULL;
CTreeCtrl & tc = GetTreeCtrl();
HTREEITEM hItem = tc.GetSelectedItem();
if( hItem == NULL )
{
hItem = TVI_ROOT;
pParent = (CDirFileNode *)m_pInfo->GetRoot();
}
else
{
pParent = (CDirFileNode *)tc.GetItemData(hItem);
}
//@hongliang.xin 2006-9-26 添加图片不压缩
if( AddImgFile(&pParent, hItem, strFileName,FALSE) )
{
SetModifiedFlag();
}
else
{
AfxMessageBox(_T("Add file fail!"));
}
}
void CImgCategView::OnImgRemoveDir()
{
// TODO: Add your command handler code here
if( AfxMessageBox(_T("Are you sure 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();
}
else
{
AfxMessageBox(_T("Delete the directory fail!"));
}
}
void CImgCategView::OnImgRemoveFile()
{
// TODO: Add your command handler code here
if( AfxMessageBox(_T("Are you sure delete this item!"), MB_YESNO) == IDNO )
return;
CTreeCtrl &tc = GetTreeCtrl();
HTREEITEM hItem = tc.GetSelectedItem();
_ASSERTE( hItem != NULL );
CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
CMMIRes &mmires = g_theApp.m_MMIRes;
if( mmires.DeleteImg(pNode->szID) )
{
m_SizeInfo.DeleteByHandle( (DWORD)hItem );
m_pInfo->RemoveNode(pNode);
tc.DeleteItem(hItem);
CDocument * pDoc = GetDocument();
CHANGE_SEL_DATA selData;
selData.hBmp = NULL;
selData.bFreshBg = TRUE;
pDoc->UpdateAllViews(this, WM_CHANGE_SEL_ITEM, (CObject*)&selData);
SetModifiedFlag();
}
else
{
AfxMessageBox(_T("Delete item fail!"));
}
}
void CImgCategView::OnImgReplaceDir()
{
// TODO: Add your command handler code here
//if( AfxMessageBox(_T("Are sure replace this dirctory?"), MB_YESNO) == IDNO )
// return;
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 );
CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
if( ReplaceDir(pNode, strDir, !g_theApp.IsSuperUser(), FALSE) )
SetModifiedFlag();
}
void CImgCategView::OnImgReplaceFile()
{
// TODO: Add your command handler code here
//if( AfxMessageBox(_T("Are sure replace this file content?") , MB_YESNO) == IDNO )
// return;
CFileDlg fdlg;
fdlg.SetFileExt(SZ_FILE_EXT);
fdlg.SetFileFilter(SZ_FILTER);
CString strFileName = fdlg.GetPathName();
if( strFileName.IsEmpty() )
return;
CTreeCtrl &tc = GetTreeCtrl();
HTREEITEM hItem = tc.GetSelectedItem();
_ASSERTE( hItem != NULL );
CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
_ASSERTE( _tcslen(pNode->szID) > 0 );
if( ReplaceFile(pNode, strFileName, !g_theApp.IsSuperUser(), hItem, FALSE) )
{
CDocument * pDoc = GetDocument();
ASSERT_VALID( pDoc );
m_hBmp = g_theApp.m_MMIRes.GetImg(pNode->szID);
CHANGE_SEL_DATA selData;
selData.hBmp = m_hBmp;
selData.bFreshBg = TRUE;
pDoc->UpdateAllViews(this, WM_CHANGE_SEL_ITEM, (CObject*)&selData);
}
else
{
AfxMessageBox(_T("Replace the file content fail!"));
}
}
void CImgCategView::OnImgProperty()
{
// TODO: Add your command handler code here
CTreeCtrl &tc = GetTreeCtrl();
HTREEITEM hItem = tc.GetSelectedItem();
_ASSERTE( hItem != NULL );
CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
CString str;
int nCompress = 1;
BOOL bRet = g_theApp.m_MMIRes.m_mapImgCompress.Lookup(pNode->szID,nCompress);
if(bRet && nCompress==0)
str = "No";
else
str = "Yes";
PIMGINFO pImgInfo = NULL;
VERIFY( g_theApp.m_MMIRes.m_mapImg.Lookup(pNode->szID, pImgInfo) );
CItemDlg dlg;
dlg.m_strContent.Format( _T("ID: %s\r\nName: %s\r\nSize: %d * %d, %d(bytes)\r\nCompressed: %s\r\n"),
pNode->szID, pNode->szName,
pNode->nWidth, pNode->nHeight, pImgInfo->nProcSize,
str);
dlg.m_strComment = pNode->szComment;
if( dlg.DoModal() == IDOK )
{
_tcscpy(pNode->szComment, dlg.m_strComment);
}
}
void CImgCategView::OnInitialUpdate()
{
CTreeViewEx::OnInitialUpdate();
m_strExt = SZ_FILE_EXT;
// TODO: Add your specialized code here and/or call the base class
m_pInfo = g_theApp.m_pImgInfo;
_ASSERTE( m_pInfo != NULL );
FillTreeCtrl((CDirFileNode *)m_pInfo->GetRoot());
m_SizeInfo.DeleteAll();
}
void CImgCategView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CDocument * pDoc = GetDocument();
_ASSERTE( pDoc != NULL );
CTreeCtrl &tc = GetTreeCtrl();
HTREEITEM hItem = pNMTreeView->itemNew.hItem;
if( m_hBmp != NULL )
{
::DeleteObject(m_hBmp);
m_hBmp = NULL;
}
if( hItem != NULL )
{
CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
if( !m_pInfo->IsDirNode(pNode) )
m_hBmp = g_theApp.m_MMIRes.GetImg(pNode->szID);
}
CHANGE_SEL_DATA selData;
selData.hBmp = m_hBmp;
selData.bFreshBg = TRUE;
pDoc->UpdateAllViews(this, WM_CHANGE_SEL_ITEM, (CObject*)&selData);
*pResult = 0;
}
void CImgCategView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMenu menu;
VERIFY( menu.LoadMenu(IDM_POPUP_IMG) );
CMenu * pMenu = menu.GetSubMenu(0);
CTreeCtrl &tc = GetTreeCtrl();
UINT uFlag = 0;
HTREEITEM hItem = tc.HitTest( point, &uFlag );
if( !(uFlag & TVHT_ONITEM) )
hItem = NULL;
tc.SelectItem(hItem);
if( PreTrackPopupMenu( pMenu, hItem ) )
{
ClientToScreen(&point);
pMenu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
}
//CTreeViewEx::OnRButtonDown(nFlags, point);
}
void CImgCategView::OnUpdateImgAddDir(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
CTreeCtrl &tc = GetTreeCtrl();
BOOL bEnable = TRUE;
HTREEITEM hItem = tc.GetSelectedItem();
if( hItem != NULL )
{
CDirFileNode * pNode = (CDirFileNode *)tc.GetItemData(hItem);
if( !m_pInfo->IsDirNode(pNode) )
bEnable = FALSE;
}
pCmdUI->Enable( bEnable );
}
void CImgCategView::OnUpdateImgAddFile(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -