www.pudn.com > snatl.rar > IconSnapDlg.cpp


// IconSnapDlg.cpp : implementation file 
////////////////////////////////////////////////////////////////////// 
// 
//用途:IconSnap对话框类 
//功能:读取ICON,BMP,EXE,DLL,ICL等内部图标,并将其保存为ICO或BMP格式。  
//作者:徐景周 
//日期:2001年9月 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "IconSnap.h" 
#include "IconSnapDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
CIcons *pIcons; 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	CWBButton	m_BtnAbout; //改为位图按钮类 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	virtual BOOL OnInitDialog(); 
	afx_msg void OnAbout(); 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	DDX_Control(pDX, ID_ABOUT, m_BtnAbout); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
	ON_BN_CLICKED(ID_ABOUT, OnAbout) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CIconSnapDlg dialog 
 
CIconSnapDlg::CIconSnapDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CIconSnapDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CIconSnapDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CIconSnapDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CIconSnapDlg) 
	DDX_Control(pDX, IDOK, m_Ok); 
	DDX_Control(pDX, IDCANCEL, m_Cancel); 
	DDX_Control(pDX, IDC_BUTTON_SAVEAS, m_SaveAs); 
	DDX_Control(pDX, IDC_BUTTON_COPY, m_Copy); 
	DDX_Control(pDX, IDC_BUTTON_ABOUT, m_About); 
	DDX_Control(pDX, IDC_LIST1, m_List); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CIconSnapDlg, CDialog) 
	//{{AFX_MSG_MAP(CIconSnapDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_LBN_SELCHANGE(IDC_LIST1, OnSelchangeList1) 
	ON_WM_DESTROY() 
	ON_BN_CLICKED(IDC_BUTTON_SAVEAS, OnButtonSaveas) 
	ON_BN_CLICKED(IDC_BUTTON_ABOUT, OnButtonAbout) 
	ON_BN_CLICKED(IDC_BUTTON_COPY, OnButtonCopy) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CIconSnapDlg message handlers 
 
BOOL CIconSnapDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	//初始化设置位图按钮 
	m_Ok.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 ); 
	m_Cancel.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 ); 
	m_SaveAs.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 ); 
	m_About.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 ); 
	m_Copy.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 ); 
 
	//初始化时,置保存和复制按钮为无效状态 
	m_Copy.EnableWindow (false); 
	m_SaveAs.EnableWindow (false); 
 
	//初始化图标资源变量 
    lpIR = (LPICONRESOURCE )malloc(sizeof(ICONRESOURCE)); 
	lstrcpy( lpIR->szOriginalICOFileName, "Untitled" ); 
	lstrcpy( lpIR->szOriginalDLLFileName, "" ); 
	lpIR->nNumImages = 0; 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CIconSnapDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CIconSnapDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
    //根据左侧图标列表,利用OnPaint()来更新右侧相应图标 
	LPTSTR lpIconID; 
	HICON hIcon; 
	if((lpIconID=(LPTSTR)m_List.GetItemData(m_List.GetCurSel()))!=(LPTSTR)LB_ERR ) 
	{ 
	 if(szOpenFileExtName=="exe"||szOpenFileExtName=="dll"||szOpenFileExtName=="icl") 
	 { 
       hIcon=pIcons->GetIconFromInstance(EDII.hInstance,lpIconID); 
	   CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS); 
	   pStatic->SetIcon (hIcon); 
	 } 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CIconSnapDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
//左侧图标列表改变时,刷新调用OnPaint(). 
void CIconSnapDlg::OnSelchangeList1()  
{ 
    InvalidateRect(NULL,TRUE);	 
} 
 
void CIconSnapDlg::OnDestroy()  
{ 
	CDialog::OnDestroy(); 
	 
    if( lpIR != NULL ) 
	{ 
		UINT i; 
		 
		// 在此释放所有占据的内存 
		for( i=0; i< lpIR->nNumImages; i++ ) 
		{ 
			if( lpIR->IconImages[i].lpBits != NULL ) 
				free( lpIR->IconImages[i].lpBits ); 
		} 
		free( lpIR ); 
	}	 
} 
 
/**************************************************************************** 
* 
*     FUNCTION: MyEnumProcedure 
* 
*     PURPOSE:  Callback for enumerating resources in a DLL/EXE 
* 
*     PARAMS:   HANDLE  hModule  - Handle of the module 
*               LPCTSTR lpszType - Resource Type 
*               LPTSTR  lpszName - Resource Name 
*               LONG    lParam   - Handle of ListBox to add name to 
* 
*     RETURNS:  BOOL - TRUE to continue, FALSE to stop 
* 
\****************************************************************************/ 
BOOL CALLBACK MyEnumProcedure( HANDLE  hModule, LPCTSTR  lpszType, LPTSTR  lpszName, LONG  lParam )	 
{ 
    TCHAR	szBuffer[256]; 
    LONG    nIndex = LB_ERR; 
    LPTSTR	lpID = NULL; 
 
    // Name is from MAKEINTRESOURCE() 
    if( HIWORD(lpszName) == 0 ) 
    { 
        wsprintf( szBuffer, "Icon [%d]", (DWORD)lpszName ); 
        lpID = lpszName; 
    } 
    else 
    { 
        // Name is string 
        lpID = strdup( lpszName ); 
        wsprintf( szBuffer, "Icon [%s]", lpID ); 
    } 
    // Add it to the listbox 
    nIndex = SendDlgItemMessage( (HWND)lParam, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)(szBuffer) ); 
    // Set the item data to be the name of the resource so we can get it later 
    SendDlgItemMessage( (HWND)lParam, IDC_LIST1, LB_SETITEMDATA, (WPARAM)nIndex, (LPARAM)lpID ); 
 
    return TRUE; 
} 
/* End MyEnumProcedure() ***************************************************/ 
 
//读取各种资源内部图标并显示在左侧列表框中 
void CIconSnapDlg::OnOK()  
{	 
	CFileDialog fileDialog( TRUE,"*.ICO",NULL,NULL,"资源文件(*.ICO,*.BMP,*.EXE,*.DLL,*.ICL)|*.ICO;*.BMP;*.EXE;*.DLL;*.ICL||"); 
	if (fileDialog.DoModal() == IDOK)  
	{		 
		szOpenFileName=fileDialog.GetPathName();	 
        szOpenFileExtName= fileDialog.GetFileExt (); 
		szOpenFileExtName.MakeLower (); 
 
		m_List.ResetContent (); //选清空左侧图标列表框 
 
		//读取并显示ICON文件 
        if(szOpenFileExtName =="ico")  
		{ 
			lpIR=pIcons->ReadIconFromICOFile (szOpenFileName);		 
			HICON hIcon; 
			hIcon=ExtractIcon(AfxGetInstanceHandle(),szOpenFileName,0); 
            if(hIcon!=NULL) 
				m_List.AddString (szOpenFileName); 
			CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS); 
	        pStatic->SetIcon (hIcon); 
		} 
		else if(szOpenFileExtName == "bmp") //读取并显示BMP文件 
		{ 
            pIcons->IconImageFromBMPFile (szOpenFileName,&lpIR->IconImages[0],TRUE); 
			HICON hIcon; 
			hIcon=pIcons->MakeIconFromResource (&lpIR->IconImages [0]); 
			if(hIcon!=NULL)  
				m_List.AddString (szOpenFileName); 
            CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONS); 
	        pStatic->SetIcon (hIcon); 
		} 
        else //读取并显示EXE、DLL等资源文件 
		{ 
		   HINSTANCE  hLibrary; 
 
		   // Load the DLL/EXE - NOTE: must be a 32bit EXE/DLL for this to work 
		   if( (hLibrary = LoadLibraryEx( szOpenFileName, NULL, LOAD_LIBRARY_AS_DATAFILE )) == NULL ) 
		   { 
		 	// Failed to load - abort 
			MessageBox( szOpenFileName+ "文件载入错误,必须是WIN32的文件!", "错误", MB_OK ); 
			return; 
		   } 
	    	// Store the info 
		   EDII.szFileName =szOpenFileName; 
		   EDII.hInstance = hLibrary; 
	     
		   // Fill in the listbox with the icons available 
		   if( ! EnumResourceNames( EDII.hInstance, RT_GROUP_ICON, (ENUMRESNAMEPROC )MyEnumProcedure, (LPARAM)GetSafeHwnd()) ) 
		   { 
			MessageBox( "列举图标资源名时出错!", "错误", MB_OK ); 
			return; 
		   } 
		} 
 
		m_List.SetCurSel (0); 
		if( m_List.GetCount()  == 0 ) 
		{ 
			MessageBox( "此文件中没有图标资源!", "错误", MB_OK ); 
			//无图标资源,置保存和复制按钮为无效状态 
			m_Copy.EnableWindow (false); 
			m_SaveAs.EnableWindow (false); 
			return; 
		} 
        //有图标资源,置保存和复制按钮为有效状态 
		m_Copy.EnableWindow (true); 
		m_SaveAs.EnableWindow (true); 
 
		//刷新调用OnPaint来显示图标 
		InvalidateRect(NULL,TRUE); 
	}	 
} 
 
//保存图标资源为ICO或BMP格式文件 
void CIconSnapDlg::OnButtonSaveas()  
{ 
	LPTSTR lpIconID; 
 
  	CFileDialog fileDialog( FALSE,"*.ICO",NULL,NULL,"图标文件(*.ICO)|*.ICO|位图文件(*.BMP)|*.BMP||"); 
	if (fileDialog.DoModal() == IDOK)  
	{ 
		szSaveFileName=fileDialog.GetPathName();	 
        szSaveFileExtName= fileDialog.GetFileExt (); 
		szSaveFileExtName.MakeLower (); 
 
		if(szOpenFileExtName=="exe"||szOpenFileExtName=="dll"||szOpenFileExtName=="icl") 
           if((lpIconID=(LPTSTR)m_List.GetItemData (m_List.GetCurSel()))!= (LPTSTR)LB_ERR) 
		    	lpIR=pIcons->ReadIconFromEXEFile (szOpenFileName,lpIconID); 
        if(szSaveFileExtName=="bmp") 
		{ 
		  if(lpIR!=NULL && m_List.GetCount ()>0) 
		  { 
			BeginWaitCursor(); 
			pIcons->IconImageToBMPFile (szSaveFileName,&lpIR->IconImages [0]); 
			EndWaitCursor(); 
		  } 
		  else 
            MessageBox( "没有可保存的图标资源!", "错误", MB_OK ); 
		} 
		else if(szSaveFileExtName=="ico") 
		{ 
          if(lpIR!=NULL && m_List.GetCount ()>0) 
		  { 
			BeginWaitCursor(); 
			pIcons->WriteIconToICOFile (lpIR,szSaveFileName); 
			EndWaitCursor(); 
		  } 
		  else 
            MessageBox( "没有可保存的图标资源!", "错误", MB_OK ); 
		} 
	} 
} 
 
//显示“关于”对话框 
void CIconSnapDlg::OnButtonAbout()  
{ 
	CAboutDlg dlgAbout; 
	dlgAbout.DoModal(); 
	 
} 
 
//将图标资源复制到系统剪切板中 
void CIconSnapDlg::OnButtonCopy()  
{ 
  	if(lpIR!=NULL && m_List.GetCount ()>0) 
	   pIcons->IconImageToClipBoard (&lpIR->IconImages [0]); 
	else 
	   MessageBox( "没有可复制的图标资源!", "错误", MB_OK ); 
} 
 
 
BOOL CAboutDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
    //设置位图按钮 
	m_BtnAbout.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 ); 
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CAboutDlg::OnAbout()  
{ 
   SendMessage(WM_CLOSE,(WPARAM)0L,(LPARAM)0L);	 
}