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

📄 prefdialogassoc.cpp

📁 Crimson编辑器的英文版,完成从韩文版变成英文版的移植,并且附带可执行文件和注册表文件,无需原先的安装包,是改写编辑器的最理想选择.
💻 CPP
字号:
#include "stdafx.h"
#include "cedtHeader.h"
#include "PrefDialog.h"
#include "registry.h"


void CPreferenceDialog::InitAssocPage()
{
	m_bAssocInfoLoaded = FALSE;
}

void CPreferenceDialog::SizeAssocPage()
{
	INT nPosY;

	nPosY  = 26; m_stcAssocSettingsBox.MoveWindow(170, nPosY, 360, 175);
	nPosY += 10; m_lstAssocExtensions.MoveWindow(180, nPosY, 120, 152);
	nPosY +=  0; m_edtAssocAssociate.MoveWindow(320, nPosY, 100, 18);	 m_btnAssocAssociate.MoveWindow(430, nPosY, 70, 18);

	nPosY += 30; m_stcAssocAssociated.MoveWindow(320, nPosY, 200, 14);
	nPosY += 20; m_lstAssocAssociated.MoveWindow(320, nPosY, 100, 102);	 m_btnAssocRestore.MoveWindow(430, nPosY, 70, 18);

	nPosY  = 26 + 150;
	nPosY += 35; m_stcAssocItemBox.MoveWindow(170, nPosY, 360, 75);
	nPosY += 10; m_stcAssocDescription.MoveWindow(180, nPosY, 80, 14);	 m_edtAssocDescription.MoveWindow(270, nPosY-3, 230, 18);
	nPosY += 20; m_stcAssocProgram.MoveWindow(180, nPosY, 80, 14);		 m_edtAssocProgram.MoveWindow(270, nPosY-3, 230, 18);		 m_btnAssocProgram.MoveWindow(505, nPosY-3, 20, 18);
	nPosY += 20; m_stcAssocDefaultIcon.MoveWindow(180, nPosY, 80, 14);	 m_edtAssocDefaultIcon.MoveWindow(270, nPosY-3, 230, 18);	 m_btnAssocDefaultIcon.MoveWindow(505, nPosY-3, 20, 18);
}

void CPreferenceDialog::ShowAssocPage()
{
	INT nCmdShow = (m_nActiveCategory == PREF_CATEGORY_ASSOC) ? SW_SHOW : SW_HIDE;

	m_stcAssocSettingsBox.ShowWindow(nCmdShow);
	m_lstAssocExtensions.ShowWindow(nCmdShow);
	m_edtAssocAssociate.ShowWindow(nCmdShow);		m_btnAssocAssociate.ShowWindow(nCmdShow);

	m_stcAssocAssociated.ShowWindow(nCmdShow);
	m_lstAssocAssociated.ShowWindow(nCmdShow);		m_btnAssocRestore.ShowWindow(nCmdShow);

	m_stcAssocItemBox.ShowWindow(nCmdShow);
	m_stcAssocDescription.ShowWindow(nCmdShow);		m_edtAssocDescription.ShowWindow(nCmdShow);
	m_stcAssocProgram.ShowWindow(nCmdShow);			m_edtAssocProgram.ShowWindow(nCmdShow);			m_btnAssocProgram.ShowWindow(nCmdShow);
	m_stcAssocDefaultIcon.ShowWindow(nCmdShow);		m_edtAssocDefaultIcon.ShowWindow(nCmdShow);		m_btnAssocDefaultIcon.ShowWindow(nCmdShow);
}


BOOL CPreferenceDialog::LoadAssocSettings()
{
	if( m_bAssocInfoLoaded ) return TRUE;

	TCHAR szKeyName[2048]; CString szProgID, szExtension;
	DWORD dwSize = 2048; INT nCount = 0; CWaitCursor wait;
	
	while( ::RegEnumKeyEx(HKEY_CLASSES_ROOT, nCount, szKeyName, & dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS ) {
		if( szKeyName[0] == '.' && GetRegKeyValue(HKEY_CLASSES_ROOT, szKeyName, "", szProgID) ) {
			szExtension = szKeyName; szExtension.MakeLower();
			m_lstAssocExtensions.AddString(szExtension);

			if( ! strncmp(szProgID, PROGID_FILEASSOC_CRIMSONEDITOR, strlen(PROGID_FILEASSOC_CRIMSONEDITOR)) ) {
				m_lstAssocAssociated.AddString(szExtension);
			}
		}

		dwSize = 2048; nCount++; 
	}

	if( ! m_szActiveAssocExtension.GetLength() ) m_lstAssocExtensions.GetText( 0, m_szActiveAssocExtension );

	SetAssocExtensionsCurSel( m_szActiveAssocExtension );
	m_edtAssocAssociate.SetWindowText( m_szActiveAssocExtension );
	SetAssocAssociatedCurSel( m_szActiveAssocExtension );
	DispAssociationInfo( m_szActiveAssocExtension );

	m_bAssocInfoLoaded = TRUE;

	return TRUE;
}

BOOL CPreferenceDialog::SaveAssocSettings()
{
	return TRUE;
}

void CPreferenceDialog::DispAssociationInfo(LPCTSTR lpszExtension)
{
	CString szProgID, szRegPath1, szRegPath2;
	GetRegKeyValue(HKEY_CLASSES_ROOT, lpszExtension, "", szProgID);
	szRegPath1 = szProgID + "\\Shell\\Open\\Command";
	szRegPath2 = szProgID + "\\DefaultIcon";

	CString szDescription, szProgram, szDefaultIcon;
	GetRegKeyValue(HKEY_CLASSES_ROOT, szProgID, "", szDescription);
	GetRegKeyValue(HKEY_CLASSES_ROOT, szRegPath1, "", szProgram);
	GetRegKeyValue(HKEY_CLASSES_ROOT, szRegPath2, "", szDefaultIcon);

	m_edtAssocDescription.SetWindowText( szDescription );
	m_edtAssocProgram.SetWindowText( szProgram );
	m_edtAssocDefaultIcon.SetWindowText( szDefaultIcon );
}

void CPreferenceDialog::UpdateAssociationInfo(LPCTSTR lpszExtension)
{
	CString szProgID, szRegPath1, szRegPath2;
	GetRegKeyValue(HKEY_CLASSES_ROOT, lpszExtension, "", szProgID);
	szRegPath1 = szProgID + "\\Shell\\Open\\Command";
	szRegPath2 = szProgID + "\\DefaultIcon";

	CString szDescription, szProgram, szDefaultIcon;
	GetRegKeyValue(HKEY_CLASSES_ROOT, szProgID, "", szDescription);
	GetRegKeyValue(HKEY_CLASSES_ROOT, szRegPath1, "", szProgram);
	GetRegKeyValue(HKEY_CLASSES_ROOT, szRegPath2, "", szDefaultIcon);

	CString szDescription2, szProgram2, szDefaultIcon2;
	m_edtAssocDescription.GetWindowText( szDescription2 );
	m_edtAssocProgram.GetWindowText( szProgram2 );
	m_edtAssocDefaultIcon.GetWindowText( szDefaultIcon2 );

	if( szDescription.Compare( szDescription2 ) )
		SetRegKeyValue(HKEY_CLASSES_ROOT, szProgID, "", szDescription2);
	if( szProgram.Compare( szProgram2 ) )
		SetRegKeyValue(HKEY_CLASSES_ROOT, szRegPath1, "", szProgram2);
	if( szDefaultIcon.Compare( szDefaultIcon2 ) )
		SetRegKeyValue(HKEY_CLASSES_ROOT, szRegPath2, "", szDefaultIcon2);
}

void CPreferenceDialog::SetAssocExtensionsCurSel(LPCTSTR lpszExtension)
{
	INT nFound = m_lstAssocExtensions.FindStringExact(-1, lpszExtension);
	if( nFound == LB_ERR) nFound = -1;
	m_lstAssocExtensions.SetCurSel( nFound );
}

void CPreferenceDialog::SetAssocAssociatedCurSel(LPCTSTR lpszExtension)
{
	INT nFound = m_lstAssocAssociated.FindStringExact(-1, lpszExtension);
	if( nFound == LB_ERR) nFound = -1;
	m_lstAssocAssociated.SetCurSel( nFound );
}

BOOL CPreferenceDialog::AssociateExtension(LPCTSTR lpszExtension)
{
	// find existing progID
	BOOL bOldProgID; CString szOldProgID;
	bOldProgID = GetRegKeyValue(HKEY_CLASSES_ROOT, lpszExtension, "", szOldProgID);

	// new progID
	CString szNewProgID = PROGID_FILEASSOC_CRIMSONEDITOR;
	szNewProgID += lpszExtension;

	// get description
	CString szDescription;
	if( bOldProgID ) GetRegKeyValue(HKEY_CLASSES_ROOT, szOldProgID, "", szDescription);

	if( ! szDescription.GetLength() ) {
		szDescription = LPCTSTR(lpszExtension + 1);
		szDescription.MakeUpper(); szDescription += " File";
	}

	// register new progID
	if( ! SetRegKeyValue(HKEY_CLASSES_ROOT, szNewProgID, "", szDescription) ) return FALSE;

	// register existing progID to restore association
	if( ! SetRegKeyValue(HKEY_CLASSES_ROOT, szNewProgID, "backup", szOldProgID) ) return FALSE;

	// register default icon
	CString szRegPath1 = szNewProgID + "\\DefaultIcon";
	CString szDefaultIcon = CCedtApp::m_szInstallDirectory + "\\cedttype.ico";
	if( ! SetRegKeyValue(HKEY_CLASSES_ROOT, szRegPath1, "", szDefaultIcon) ) return FALSE;

	// register shell/open/command
	CString szRegPath2 = szNewProgID + "\\shell\\open\\command";
	CString szProgram = CCedtApp::m_szInstallDirectory + "\\cedt.exe \"%1\"";
	if( ! SetRegKeyValue(HKEY_CLASSES_ROOT, szRegPath2, "", szProgram) ) return FALSE;

	// associate extension
	if( ! SetRegKeyValue(HKEY_CLASSES_ROOT, lpszExtension, "", szNewProgID) ) return FALSE;

	return TRUE;
}


BOOL CPreferenceDialog::RestoreAssociation(LPCTSTR lpszExtension)
{
	// new progID
	CString szNewProgID = PROGID_FILEASSOC_CRIMSONEDITOR;
	szNewProgID += lpszExtension;

	// find old progID
	BOOL bOldProgID; CString szOldProgID;
	bOldProgID = GetRegKeyValue(HKEY_CLASSES_ROOT, szNewProgID, "backup", szOldProgID);

	// delete default icon
	CString szRegPath1 = szNewProgID + "\\DefaultIcon";
	if( ! DeleteRegKey(HKEY_CLASSES_ROOT, szRegPath1) ) return FALSE;

	// delete shell/open/command
	CString szRegPath2 = szNewProgID + "\\shell\\open\\command";
	if( ! DeleteRegKey(HKEY_CLASSES_ROOT, szRegPath2) ) return FALSE;

	// delete new progID
	if( ! DeleteRegKey(HKEY_CLASSES_ROOT, szNewProgID) ) return FALSE;

	if( szOldProgID.GetLength() ) { // restore association
		if( ! SetRegKeyValue(HKEY_CLASSES_ROOT, lpszExtension, "", szOldProgID) ) return FALSE;
	} else { // delete registered extension
		if( ! DeleteRegKey(HKEY_CLASSES_ROOT, lpszExtension) ) return FALSE;
	}

	return TRUE;
}

void CPreferenceDialog::OnSelchangeAssocExtensions() 
{
	INT nSelect = m_lstAssocExtensions.GetCurSel(); if( nSelect == LB_ERR) return;
	m_lstAssocExtensions.GetText(nSelect, m_szActiveAssocExtension);

	m_edtAssocAssociate.SetWindowText( m_szActiveAssocExtension );
	SetAssocAssociatedCurSel( m_szActiveAssocExtension );
	DispAssociationInfo( m_szActiveAssocExtension );
}

void CPreferenceDialog::OnSelchangeAssocAssociated() 
{
	INT nSelect = m_lstAssocAssociated.GetCurSel(); if( nSelect == LB_ERR ) return;
	m_lstAssocAssociated.GetText(nSelect, m_szActiveAssocExtension);

	m_edtAssocAssociate.SetWindowText( m_szActiveAssocExtension );
	SetAssocExtensionsCurSel( m_szActiveAssocExtension );
	DispAssociationInfo( m_szActiveAssocExtension );
}

void CPreferenceDialog::OnAssocAssociate() 
{
	CString szExtension; m_edtAssocAssociate.GetWindowText( szExtension );
	szExtension.TrimLeft(); szExtension.TrimRight(); szExtension.MakeLower();
	if( szExtension[0] != '.' ) szExtension = CString(".") + szExtension;
	if( szExtension.GetLength() < 2 ) return; // null extension

	INT nFound = m_lstAssocAssociated.FindStringExact(-1, szExtension);
	if( nFound != LB_ERR ) return; // already associated

	if( ! AssociateExtension( szExtension ) ) return; // association failed 
	m_lstAssocAssociated.AddString( szExtension );

	nFound = m_lstAssocExtensions.FindStringExact(-1, szExtension);
	if( nFound == LB_ERR ) m_lstAssocExtensions.AddString( szExtension );

	SetAssocExtensionsCurSel( szExtension );
	SetAssocAssociatedCurSel( szExtension );
	DispAssociationInfo( szExtension );
}

void CPreferenceDialog::OnAssocRestore() 
{
	INT nSelect = m_lstAssocAssociated.GetCurSel(); if( nSelect == LB_ERR ) return;
	CString szExtension; m_lstAssocAssociated.GetText(nSelect, szExtension);

	if( ! RestoreAssociation( szExtension ) ) return; // restore failed
	m_lstAssocAssociated.DeleteString( nSelect );

	CString szProgID;
	if( ! GetRegKeyValue(HKEY_CLASSES_ROOT, szExtension, "", szProgID) ) {
		INT nFound = m_lstAssocExtensions.FindStringExact(-1, szExtension);
		if( nFound != LB_ERR ) m_lstAssocExtensions.DeleteString( nFound );
	}

	m_lstAssocExtensions.GetText( 0, szExtension );
	SetAssocExtensionsCurSel( szExtension );
	SetAssocAssociatedCurSel( szExtension );
	DispAssociationInfo( szExtension );
}

void CPreferenceDialog::OnKillfocusAssocDescription() 
{
	INT nSelect = m_lstAssocExtensions.GetCurSel(); if( nSelect == LB_ERR) return;
	CString szExtension; m_lstAssocExtensions.GetText(nSelect, szExtension);

	UpdateAssociationInfo( szExtension );
}

void CPreferenceDialog::OnKillfocusAssocProgram() 
{
	INT nSelect = m_lstAssocExtensions.GetCurSel(); if( nSelect == LB_ERR) return;
	CString szExtension; m_lstAssocExtensions.GetText(nSelect, szExtension);

	UpdateAssociationInfo( szExtension );
}

void CPreferenceDialog::OnKillfocusAssocDefaulticon() 
{
	INT nSelect = m_lstAssocExtensions.GetCurSel(); if( nSelect == LB_ERR) return;
	CString szExtension; m_lstAssocExtensions.GetText(nSelect, szExtension);

	UpdateAssociationInfo( szExtension );
}

⌨️ 快捷键说明

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