Скрещиваем элемент управления Edit и кнопку просмотраАвтор: PJ Arends
ОписаниеОбычно, для того, чтобы позволить пользователю выбрать файл и директорию, создаётся два элемента управления: Edit и кнопка просмотра, которая вызывает обычный диалог выбора файла. Здесь же представлен класс, совмещающий эти два контрола. Возможности
Использование контролаЧтобы ключить данный элемент управления в своё
приложение, добавьте в проект файлы FileEditCtrl.h и
FileEditCtrl.cpp. Затем рекомендуется добавить
следующие строки как ресурсы в таблицу строк с
идентификаторами // FEC_IDS_ALLFILES будет определён в resource.h если будет находиться
// в ресурсе таблицы строк
#if !defined FEC_IDS_ALLFILES
#define FEC_NORESOURCESTRINGS so this class knows how to handle these strings
#define FEC_IDS_ALLFILES _T"All Files (*.*)|*.*||")
#define FEC_IDS_BUTTONTIP _T("Browse")
#define FEC_IDS_FILEDIALOGTITLE _T("Browse for File")
#define FEC_IDS_SEPERATOR _T(";")
#define FEC_IDS_NOFILE _T("Enter an existing file.")
#define FEC_IDS_NOTEXIST _T("%s does not exist.")
#define FEC_IDS_NOTFILE _T("%s is not a file.")
#define FEC_IDS_NOTFOLDER _T("%s is not a folder.")
#define FEC_IDS_OKBUTTON _T("OK")
#endif
Чтобы использовать контрол в диалоговом окне с
установками поумолчанию, создайте улемент
управления edit в шаблоне диалога, добавьте
переменную CString в класс диалога и в void CFileEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFileEditDlg)
//}}AFX_DATA_MAP
DDX_FileEditCtrl(pDX, IDC_EDIT1, m_String, FEC_FOLDER |
FEC_TRAILINGSLASH | FEC_BUTTONTIP);
DDV_FileEditCtrl(pDX, IDC_EDIT1);
...
}
Поскольку эти функции не поддерживаются класс
визардом, то они должны быть помещены за
пределами блока Если Вам потребуется разместить несколько
таких контролов в диалоге (например для выбора
нескольких файлов), то добавьте переменную void CFileEditDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFileEditDlg)
//}}AFX_DATA_MAP
...
DDX_FileEditCtrl(pDX, IDC_EDIT2, m_FileEditCtrl,
FEC_FILE | FEC_BUTTONLEFT | FEC_BUTTONTIP | FEC_CLIENTTIP);
DDV_FileEditCtrl(pDX, IDC_EDIT2);
}
Затем в BOOL CFileEditDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
// Изменяем контрол для выбора нескольких файлов
if (OPENFILENAME *ofn = m_FileEditCtrl.GetOpenFileName())
{
ofn->Flags |= OFN_ALLOWMULTISELECT;
buffer = new TCHAR[2000];
::ZeroMemory(buffer, 2000);
ofn->lpstrFile = buffer;
ofn->nMaxFile = 2000;
}
m_FileEditCtrl.SetClientTipText("Files");
return TRUE; // возвращаем TRUE, если на контроле не установлен фокус
}
Для получения имён файлов из контрола,
используем функции-члены BOOL CFileEditApp::InitInstance()
{
...
CFileEditDlg dlg;
m_pMainWnd = &dlg
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
int n = 1;
TRACE ("\nFiles entered :\n");
POSITION pos = dlg.m_FileEditCtrl.GetStartPosition();
while (pos)
{
CString x = dlg.m_FileEditCtrl.GetNextPathName(pos);
TRACE ("%03d - %s\n",n, x);
n++;
}
TRACE ("Directory entered :\n %s\n\n",dlg.m_String);
}
...
return FALSE;
}
Элемент управления посылает сообщение typedef struct tagFEC_NOTIFY {
NMHDR hdr;
CFileEditCtrl* pFEC; // указатель на контрол, который
// отсылает уведомляющее сообщение
tagFEC_NOTIFY (CFileEditCtrl *FEC, UINT code);
} FEC_NOTIFY;
#define FEC_NM_PREBROWSE 1 // уведомляющий код, отправляемый
// до появления диалога
#define FEC_NM_POSTBROWSE 2 // уведомляющий код, отправляемый
// после появления диалога
Постоянное обновление данного контрола доступно сдесь.
|