📄 fileeditctrl.cpp
字号:
//
// Parameters :
// None
//
// Returns :
// A MFC POSITION structure that points to the first file in the control
//
// Note :
// Use this function to get the starting position for the GetNextPathName() function
//
/////////////////////////////////////////////////////////////////////////////
POSITION CFileEditCtrl::GetStartPosition()
{
if (IsWindow(this) && m_bTextChanged)
{
FillBuffers();
m_bTextChanged = FALSE;
}
return m_Files.GetHeadPosition();
}
/////////////////////////////////////////////////////////////////////////////
//
// CFileEditCtrl::GetValidFolder (protected member function)
// Removes all files and nonexistant folders from the given path
// Adds a slash to the end of the path string if it is not already there
//
// Parameters :
// Path [in] - The path to check
// [out] - The new path
//
// Returns :
// TRUE if the original path is valid
// FALSE if the original path was invalid and has been changed
//
/////////////////////////////////////////////////////////////////////////////
BOOL CFileEditCtrl::GetValidFolder(LPTSTR Path)
{
CString buffer = Path;
BOOL valid = TRUE;
int pos = -1;
do {
DWORD attrib = GetFileAttributes(buffer);
if (0xffffffff != attrib && (attrib & FILE_ATTRIBUTE_DIRECTORY))
{ // the path is a valid folder
if (_T('\\') != buffer[buffer.GetLength() - 1])
buffer += _T("\\");
_tcscpy (Path, buffer);
return valid;
}
valid = FALSE;
pos = buffer.ReverseFind(_T('\\'));
if (pos > 0)
{
int len = buffer.GetLength();
buffer.Delete(pos, len - pos);
}
} while (pos > 0);
// no valid folder, set 'Path' to empty string
*Path = _T('\0');
return valid;
}
/////////////////////////////////////////////////////////////////////////////
//
// CFileEditCtrl::ModifyFlags (public member function)
// Modifies the control flags
//
// Parameters :
// remove [in] - The flags to remove
// add [in] - The flags to add
//
// Returns :
// TRUE if the flags are successfully modified
// FALSE if not
//
// Note :
// See the FileEditCtrl.h file for descriptions of the flags used
//
/////////////////////////////////////////////////////////////////////////////
BOOL CFileEditCtrl::ModifyFlags(DWORD remove, DWORD add)
{
DWORD Flags = GetFlags();
Flags &= ~remove;
Flags |= add;
return SetFlags(Flags);
}
/////////////////////////////////////////////////////////////////////////////
//
// CFileEditCtrl::OnChange (protected member function)
// Handles the EN_CHANGE message
// Sets the m_bTextChanged flag
//
// Parameters :
// None
//
// Returns :
// FALSE
//
// Note :
// Returning FALSE allows the parent window to also handle the EN_CHANGE message
//
/////////////////////////////////////////////////////////////////////////////
BOOL CFileEditCtrl::OnChange()
{
m_bTextChanged = TRUE;
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
//
// CFileEditCtrl::OnDropFiles (protected member function)
// Handles the WM_DROPFILES message
// Sets the control text to display the files dropped onto the control
//
// Parameters :
// hDropInfo [in] - handle to the drop structure supplied by windows
//
// Returns :
// Nothing
//
// Note :
// The control must have the WS_EX_ACCEPTFILES extended windows
// style bit set in order for drag and drop to work
//
/////////////////////////////////////////////////////////////////////////////
void CFileEditCtrl::OnDropFiles(HDROP hDropInfo)
{
if (this == GetCapture())
ReleaseCapture();
int FolderLength = 0;
CString szDroppedFiles = _T(""); // the new window text
CString DropBuffer; // buffer to contain the dropped files
CString szSeparator;
#if defined FEC_NORESOURCESTRINGS
szSeparator = FEC_IDS_SEPARATOR; // get the file separator character
#else
szSeparator.LoadString(FEC_IDS_SEPARATOR);
#endif
ASSERT(szSeparator.GetLength() == 1); // must be one character only
szSeparator += _T(" ");
DWORD Flags = GetFlags();
UINT nDropCount = DragQueryFile(hDropInfo, 0xffffffff, NULL, 0);
if (nDropCount && ((Flags & FEC_FOLDER) || ((Flags & FEC_FILE) && !(Flags & FEC_MULTIPLE))))
// if (files dropped && (finding folder || (finding files && finding only one file)))
nDropCount = 1;
for (UINT x = 0; x < nDropCount; x++)
{
DragQueryFile(hDropInfo, x, DropBuffer.GetBuffer(_MAX_PATH), _MAX_PATH);
DropBuffer.ReleaseBuffer();
if ((Flags & FEC_FILE) && !(Flags & FEC_NODEREFERENCELINKS))
{ // resolve any shortcut (*.lnk or *.pif) files
CString Ext = DropBuffer.Right(4);
Ext.MakeLower();
if (_T(".lnk") == Ext || _T(".pif") == Ext)
DereferenceLink(DropBuffer);
}
if (0 == x)
{ // first file has complete path, get the length of the path
TCHAR Drive[_MAX_DRIVE];
TCHAR Path[_MAX_PATH];
_tsplitpath(DropBuffer, Drive, Path, NULL, NULL);
FolderLength = _tcslen(Drive) + _tcslen(Path);
}
else
{ // all the rest of the files will drop the path if it
// is the same as the first file's path
if (DropBuffer.Left(FolderLength) == szDroppedFiles.Left(FolderLength))
DropBuffer.Delete(0, FolderLength);
szDroppedFiles += szSeparator;
}
szDroppedFiles += DropBuffer;
}
DragFinish(hDropInfo);
// notify parent window that a drop occured (thanks Remon)
LRESULT result = 0;
CWnd *pParent = GetParent();
if (IsWindow(pParent))
{
FEC_NOTIFY notify(this, FEC_NM_DROP);
notify.pNewText = &szDroppedFiles;
result = pParent->SendMessage(WM_NOTIFY, (WPARAM)GetDlgCtrlID(), (LPARAM)¬ify);
}
if (0 == result)
SetWindowText(szDroppedFiles);
}
/////////////////////////////////////////////////////////////////////////////
//
// CFileEditCtrl::OnEnable (protected member function)
// Handles the WM_ENABLE message
// enables or disables the control, and redraws the button to reflect the new state
//
// Parameters :
// bEnable [in] - Enabled flag, TRUE to enable, FALSE to disable
//
// Returns :
// Nothing
//
/////////////////////////////////////////////////////////////////////////////
void CFileEditCtrl::OnEnable(BOOL bEnable)
{
CEdit::OnEnable(bEnable);
Redraw(TRUE);
DrawButton(BTN_UP);
}
/////////////////////////////////////////////////////////////////////////////
//
// CFileEditCtrl::OnKeyDown (protected member function)
// Handles the WM_KEYDOWN message
// Checks for the <CTRL> + 'period' keystroke, calls ButtonClicked() if found
//
// Parameters :
// nChar [in] - The virtual key code
// nRepCnt [in] - not used here, passed on to the base class
// nFlags [in] - not used here, passed on to the base class
//
// Returns :
// Nothing
//
/////////////////////////////////////////////////////////////////////////////
void CFileEditCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
#ifndef VK_OEM_PERIOD
#define VK_OEM_PERIOD 0xBE
#endif
if ((VK_OEM_PERIOD == nChar || VK_DECIMAL == nChar) && GetKeyState(VK_CONTROL) < 0)
ButtonClicked();
else
CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}
/////////////////////////////////////////////////////////////////////////////
//
// CFileEditCtrl::OnKillFocus (protected member function)
// Handles the WM_KILLFOCUS message
// Redraws the border on a flat control
//
// Parameters :
// pNewWnd [in] - not used here, passed on to the base class
//
// Returns :
// Nothing
//
/////////////////////////////////////////////////////////////////////////////
void CFileEditCtrl::OnKillFocus(CWnd *pNewWnd)
{
if (m_bMouseCaptured)
{
ReleaseCapture();
m_bMouseCaptured = FALSE;
if (!(m_nButtonState & BTN_UP))
DrawButton(BTN_UP);
}
CEdit::OnKillFocus(pNewWnd);
Redraw(TRUE);
}
/////////////////////////////////////////////////////////////////////////////
//
// CFileEditCtrl::OnLButtonDown (protected member function)
// Handles the WM_LBUTTONDOWN message
// If the user clicks on the button, capture mouse input, set the focus
// to this control, and draw the button as pressed
//
// Parameters :
// nFlags [in] - not used here, passed on to the base class
// point [in] - the location of the mouse cursor
//
// Returns :
// Nothing
//
// Note:
// If the FEC_FLAT flag is used, the mouse is captured in the WM_MOUSEMOVE
// handler, so we have to use the WM_LBUTTONDOWN message instead of the
// WM_NCLBUTTONDOWN message.
//
/////////////////////////////////////////////////////////////////////////////
void CFileEditCtrl::OnLButtonDown(UINT Flags, CPoint point)
{
CEdit::OnLButtonDown(Flags, point);
if (GetFlags() & FEC_FLAT && !(m_nButtonState & BTN_DISABLED))
{
ClientToScreen(&point);
if (ScreenPointInButtonRect(point))
{
SetCapture(); // should already be captured, but just to make sure
m_bMouseCaptured = TRUE;
DrawButton(BTN_DOWN);
}
}
}
/////////////////////////////////////////////////////////////////////////////
//
// CFileEditCtrl::OnLButtonUp (protected member function)
// Handles the WM_LBUTTONUP message
// Release the mouse capture and draw the button as normal. If the
// cursor is over the button, call ButtonClicked()
//
// Parameters :
// nFlags [in] - not used here, passed on to the base class
// point [in] - the location of the mouse cursor
//
// Returns :
// Nothing
//
/////////////////////////////////////////////////////////////////////////////
void CFileEditCtrl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -