Я установил Windows XP Professional SP3 на образ VMWare и Visual Studio 2005 на нем. Я создал новый C ++ MFC-проект на основе диалога с поддержкой / clr. Я поместил элемент управления RichEdit 2.0 в автоматически сгенерированный диалог, и я пытаюсь прочитать текстовый файл и поместить его содержимое в этот элемент управления RichEdit 2.0 нажатием кнопки без форматирования. Я добавил в RichEdit 2.0 переменную pCRichEditCtrl, и вот мой код, который не работает.
CWinApp наследование:
BOOL CTextFormatterApp::InitInstance()
{
...
AfxInitRichEdit2();
CWinApp::InitInstance();
...
}
CDialog наследование:
void CTextFormatterDlg::OnBnClickedButton1()
{
StreamReader^ objReader = gcnew StreamReader("c:\\text.txt");
String ^sLine = "";
sLine = objReader->ReadLine();
while (sLine != nullptr)
{
pCRichEditCtrl.SetSel(pCRichEditCtrl.GetTextLength(), -1);
pCRichEditCtrl.ReplaceSel(CString(sLine));
sLine = objReader->ReadLine();
}
objReader->Close();
}
Я не знаю, считается ли это, но я получаю следующие предупреждения при линковке:
TextFormatterDlg.obj: предупреждение LNK4248: неразрешенный токен typeref (01000016) для ‘AFX_CMDHANDLERINFO’; изображение может не работать
TextFormatter.obj: предупреждение LNK4248: неразрешенный токен typeref (01000012) для ‘AFX_CMDHANDLERINFO’; изображение может не работать
TextFormatterDlg.obj: предупреждение LNK4248: неразрешенный токен typeref (01000015) для ‘IAccessibleProxy’; изображение может не работать
Я не уверен, что я делаю, потому что я знаком только с более новыми фреймворками и не знаю ни Windows.
Входной файл существует, я могу видеть прочитанный текст, если отлаживаю приложение, но не вижу изменений в окне редактирования. Я пытался позвонить pCRichEditCtrl.UpdateData (истина); но ничего не изменилось.
Достаточно ли добавить переменную для получения контроллера коробки (pCRichEditCtrl)? Кажется, указатель не указывает на правильный элемент управления.
Ты хоть представляешь, чего не хватает?
Нет необходимости использовать CLI для чтения текстовых файлов, попробуйте что-то вроде:
void CTextFormatterDlg::OnBnClickedButton1()
{ CStdioFile f1;
CString sLine;
if (!f1.Open(_T("c:\\text.txt"), CFile::modeRead | CFile::typeText))
return;
while (f1.ReadString(sLine))
{ pCRichEditCtrl.SetSel(pCRichEditCtrl.GetTextLength(), -1);
pCRichEditCtrl.ReplaceSel(sLine);
}
f1.Close();
}
РЕДАКТИРОВАТЬ: управляющая переменная pCRichEditCtrl
а) должен быть объявлен в классе диалога как CRichEditCtrl pCRichEditCtrl;
б) должен быть подключен к идентификатору элемента управления (например: IDC_RICHEDIT21
), лайк
void CTextFormatterDlg::DoDataExchange(CDataExchange* pDX)
{ CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_RICHEDIT21, pCRichEditCtrl);
}
в) я протестировал следующий код, и он работает для меня (добавляет «аа» в окно управления при каждом нажатии кнопки)
pCRichEditCtrl.SetSel(pCRichEditCtrl.GetTextLength(), -1);
pCRichEditCtrl.ReplaceSel(TEXT("aa"));
Я делюсь окончательным решением с сообществом, которое будет доступно для тех, кто сталкивается с той же проблемой. Я не знаю, почему я должен использовать Update(FALSE);
на CWinApp
наследование два раза, но это решает все. Если у кого-то есть идея или лучшее (более хорошее) решение, не стесняйтесь поделиться им с нами, я перенесу принятый флаг на эту версию (если это возможно, я не пробовал раньше).
void CTextFormatterDlg::OnBnClickedButton1()
{
StreamReader^ objReader = gcnew StreamReader("c:\\text.txt");
String ^sLine = objReader->ReadLine();
UpdateData(FALSE); //this is the first unexpected first aid
while (sLine != nullptr)
{
pCRichEditCtrl.SetSel(pCRichEditCtrl.GetTextLength(), -1);
pCRichEditCtrl.ReplaceSel(CString(sLine + "\r\n"));
UpdateData(FALSE); //this is the second unexpected first aid
sLine = objReader->ReadLine();
}
objReader->Close();
}