📄 mrucombo.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
//
// MRUCombo.cpp: Implementation file for the CMRUComboBox class.
//
// Written by Michael Dunn <mdunn at inreach dot com>
//
/////////////////////////////////////////////////////////////////////////////
//
// Revision history:
//
// 9/9/1998: First release.
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Counting.h"
#include "MRUCombo.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MRUC_DEFAULT_MRU_SIZE 10
/////////////////////////////////////////////////////////////////////////////
// CMRUComboBox constructor & destructor
//////////////////////////////////////////////////////////////////////////
//
// Function: CMRUComboBox()
//
// Description:
// Class constructor.
//
// Notes:
// Calls base class constructor and initializes member variables.
//
//////////////////////////////////////////////////////////////////////////
CMRUComboBox::CMRUComboBox() : CComboBox(),
m_bRefreshAfterAdd ( FALSE ),
m_bSaveAfterAdd ( FALSE ),
m_bSaveOnDestroy ( TRUE ),
m_nMaxMRUSize ( MRUC_DEFAULT_MRU_SIZE ),
m_pMRU ( NULL ),
m_bParamsChanged ( FALSE )
{
}
//////////////////////////////////////////////////////////////////////////
//
// Function: CMRUComboBox()
//
// Description:
// Class destructor.
//
//////////////////////////////////////////////////////////////////////////
CMRUComboBox::~CMRUComboBox()
{
// Save the MRU if we need to.
if ( m_bSaveOnDestroy )
{
if ( !SaveMRU() )
{
TRACE0("CMRUComboBox -- Warning - SaveMRU() in destructor failed. MRU was not saved.\n");
}
}
// Free up the CRecentFileList object.
if ( NULL != m_pMRU )
{
delete m_pMRU;
}
}
BEGIN_MESSAGE_MAP(CMRUComboBox, CComboBox)
//{{AFX_MSG_MAP(CMRUComboBox)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMRUComboBox MRU operations
//////////////////////////////////////////////////////////////////////////
//
// Function: AddToMRU()
//
// Description:
// Adds a string to the MRU list.
//
// Input:
// szNewItem: [in] The string to add.
//
// Returns:
// TRUE if successful, FALSE if not.
//
//////////////////////////////////////////////////////////////////////////
BOOL CMRUComboBox::AddToMRU ( LPCTSTR szNewItem )
{
// String can't be a null pointer!
ASSERT ( NULL != szNewItem );
// Allocate a new CRecentFileList
// if necessary.
if ( NULL == m_pMRU )
{
if ( !AllocNewMRU() )
{
TRACE0("CMRUComboBox -- AllocNewMRU() failed in AddToMRU().\n");
return FALSE;
}
}
// Add it to the MRU list.
m_pMRU->Add ( szNewItem );
// Automagically refresh the combobox?
if ( m_bRefreshAfterAdd )
{
RefreshCtrl();
}
// Automagically save the MRU?
if ( m_bSaveAfterAdd )
{
SaveMRU();
}
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
//
// Function: EmptyMRU()
//
// Description:
// Removes all strings from the MRU list.
//
// Input:
// Nothing.
//
// Returns:
// Nothing.
//
//////////////////////////////////////////////////////////////////////////
void CMRUComboBox::EmptyMRU()
{
int i;
if ( NULL != m_pMRU )
{
// Remove all strings from the MRU list.
// Go in reverse order to keep the
// strings from changing positions
// while we're doing our dirty work.
for ( i = m_pMRU->GetSize() - 1; i >= 0; i-- )
{
m_pMRU->Remove(i);
}
}
}
//////////////////////////////////////////////////////////////////////////
//
// Function: LoadMRU()
//
// Description:
// Loads an MRU from the registry or the app's INI file.
//
// Input:
// Nothing.
//
// Returns:
// TRUE if successful, FALSE if not.
//
//////////////////////////////////////////////////////////////////////////
BOOL CMRUComboBox::LoadMRU()
{
// We always allocate a new
// CRecentFileList object when loading.
if ( !AllocNewMRU() )
{
TRACE0("CMRUComboBox -- AllocNewMRU() failed in LoadMRU().\n");
return FALSE;
}
m_pMRU->ReadList();
return TRUE;
}
//////////////////////////////////////////////////////////////////////////
//
// Function: SaveMRU()
//
// Description:
// Writes the MRU to the registry or app's INI file.
//
// Input:
// Nothing.
//
// Returns:
// TRUE if successful, FALSE if not.
//
//////////////////////////////////////////////////////////////////////////
BOOL CMRUComboBox::SaveMRU()
{
// If we haven't created a
// CRecentFileList yet, then there's
// nothing to save.
if ( NULL == m_pMRU )
{
TRACE0("CMRUComboBox -- SaveMRU failed - no CRecentFileList created.\n");
return FALSE;
}
// Check that the CRecentFileList
// parameters are kosher.
if ( !VerifyMRUParams() )
{
TRACE0("CMRUComboBox -- SaveMRU() failed - params not set.\n");
return FALSE;
}
// If the registry key/value strings
// have been changed, we need to make
// a new CRecentFileList.
if ( m_bParamsChanged )
{
if ( !AllocNewMRU() )
{
TRACE0("CMRUComboBox -- SaveMRU failed - couldn't reallocate CRecentFileList with new MRU params.\n");
return FALSE;
}
}
m_pMRU->WriteList();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMRUComboBox combobox control operations
//////////////////////////////////////////////////////////////////////////
//
// Function: RefreshCtrl()
//
// Description:
// Sets the contents of the combobox according to the MRU list.
//
// Input:
// Nothing.
//
// Returns:
// Nothing.
//
//////////////////////////////////////////////////////////////////////////
void CMRUComboBox::RefreshCtrl()
{
CString cstrComboText;
// Save the contents of the edit
// portion of the combobox.
GetWindowText ( cstrComboText );
ResetContent();
for ( int i = 0; i < m_pMRU->GetSize(); i++ )
{
// Don't add empty strings to the combobox.
if ( (*m_pMRU)[i].GetLength() > 0 )
{
if ( AddString ( (*m_pMRU)[i] ) < 0 )
{
TRACE1("CMRUComboBox -- Warning - RefreshCtrl() couldn't add MRU item %d to combobox.\n",
i );
}
}
}
// Restore the editbox text.
SetWindowText ( cstrComboText );
}
/////////////////////////////////////////////////////////////////////////////
// CMRUComboBox data accessor functions
//////////////////////////////////////////////////////////////////////////
//
// Function: SetMRURegKey()
//
// Description:
// Sets the registry key (or INI file section) in which the MRU will be
// saved.
//
// Input:
// szRegKey: [in] The key/section name.
//
// Returns:
// Nothing.
//
//////////////////////////////////////////////////////////////////////////
void CMRUComboBox::SetMRURegKey ( LPCTSTR szRegKey )
{
// The key name can't be a null string.
ASSERT ( NULL != szRegKey );
try
{
// Store the reg key name & set the
// changed flag.
m_cstrRegKey = szRegKey;
m_bParamsChanged = TRUE;
}
catch ( CMemoryException )
{
TRACE0("CMRUComboBox -- Memory exception in CMRUComboBox::SetMRURegKey()!\n");
throw;
}
}
//////////////////////////////////////////////////////////////////////////
//
// Function: GetMRURegKey
//
// Description:
// Returns the current registry key or INI file section in which the MRU
// will be saved.
//
// Input:
// Nothing.
//
// Returns:
// The key name.
//
//////////////////////////////////////////////////////////////////////////
const CString& CMRUComboBox::GetMRURegKey() const
{
return m_cstrRegKey;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -