mfc — VS 2005 C ++ редактировать содержимое экземпляра CRichEditCtrl

Я установил 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)? Кажется, указатель не указывает на правильный элемент управления.

Ты хоть представляешь, чего не хватает?

0

Решение

Нет необходимости использовать 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"));
1

Другие решения

Я делюсь окончательным решением с сообществом, которое будет доступно для тех, кто сталкивается с той же проблемой. Я не знаю, почему я должен использовать 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();
}
0

По вопросам рекламы [email protected]