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

📄 imgcategview.cpp

📁 Resource editor base speadrum Chinese mobile
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -