2014-06-07 3 views
0

Я установил Windows XP Professional SP3 на образ VMWare и Visual Studio 2005 на нем. Я создал новый проект на основе C++ MFC с поддержкой/clr. Я поставил элемент управления RichEdit 2.0 в автоматически сгенерированный диалог, и я пытаюсь прочитать текстовый файл и поместить его содержимое в этот элемент управления RichEdit 2.0 нажатием кнопки без форматирования. Я добавил переменную в RichEdit 2.0, называемую pCRichEditCtrl, и вот мой код, который не работает.VS 2005 C++ редактирует содержимое экземпляра CRichEditCtrl

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 (true);, но ничего не изменилось.

Достаточно ли добавить переменную для получения контроллера поля (pCRichEditCtrl)? Кажется, что указатель не указывает на правильный элемент управления.

У вас есть идеи, что не хватает?

+0

10 Я дал ответ, чтобы загрузить ваш контроль, используя прямой MFC - как/где вы объявляете 'pCRichEditCtrl'? и как вы подключаете его к вашему контролю? –

+0

Я добавил его через графический интерфейс: щелкните правой кнопкой мыши элемент управления RichEdit -> Добавить переменную ... Дополнительная информация: если я добавлю следующую строку, то RichEdit отобразит текст, но только со второй строки: ** UpdateData (TRUE) ;** Это странно. – bdevay

+0

отредактировал мой ответ с настройками для 'pCRichEditCtrl', простой тестовый проект, как показано ниже, работает для меня без' UpdateData() ', это необходимо, только если у вас есть переменные типа« значение » –

ответ

0

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

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



EDIT: управление переменной pCRichEditCtrl

а) должны быть объявлены в классе диалога как CRichEditCtrl pCRichEditCtrl;

b) должно быть подключено к идентификатору элемента управления (например: IDC_RICHEDIT21), как

void CTextFormatterDlg::DoDataExchange(CDataExchange* pDX) 
{ CDialogEx::DoDataExchange(pDX); 
    DDX_Control(pDX, IDC_RICHEDIT21, pCRichEditCtrl); 
} 

с) Я тестировал следующий код и он работает для меня (добавляет «AA» в окне управления на каждой кнопке мыши)

pCRichEditCtrl.SetSel(pCRichEditCtrl.GetTextLength(), -1); 
pCRichEditCtrl.ReplaceSel(TEXT("aa")); 
+0

Спасибо за подсказку, но это не так решить мою главную проблему. Чтение файлов работает для меня. – bdevay

+0

Благодарим вас за дополнительную работу по моей проблеме. a) добавлено автоматически с помощью действия GUI (добавить переменную ...) b) то же, что и) c) не работает для меня Мне нужно использовать 'UpdateData (FALSE);' перед циклом 'while' AND в цикле. Я не знаю, почему, но это единственный способ заставить его работать. Возможно, проблема в том, что я ничего не знаю о рабочем процессе этой версии среды Visual Studio. Могли бы вы предложить мне хороший онлайн-руководство об основах этой конкретной версии, особенно о контроле и обработке событий? Мне было бы достаточно указать вам;) – bdevay

+1

Управление и обработка событий не сильно изменились по сравнению с версиями VS, это самая ясная статья, на которой я нахожу: http://www.functionx.com/visualc/controls/ manage.htm (большинство других статей описывают, как управлять переменными типа «значение», в вашем случае это переменная типа «control») –

Смежные вопросы