【问题标题】:VS 2005 C++ edit content of the CRichEditCtrl instanceVS 2005 C++ 编辑 CRichEditCtrl 实例的内容
【发布时间】:2014-06-07 06:11:45
【问题描述】:

我在 VMWare 映像上安装了 Windows XP Professional SP3,并在其上安装了 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:“AFX_CMDHANDLERINFO”的未解析 typeref 令牌 (01000016);图像可能无法运行

TextFormatter.obj:警告 LNK4248:“AFX_CMDHANDLERINFO”的未解析 typeref 令牌 (01000012);图像可能无法运行

TextFormatterDlg.obj:警告 LNK4248:“IAccessibleProxy”的未解析类型引用令牌 (01000015);图像可能无法运行

我不确定自己在做什么,因为我只熟悉较新的框架,而且我也不了解 Windows。

输入文件存在,如果我调试应用程序,我可以看到读取的文本,但我在编辑框中看不到任何更改。我尝试调用 pCRichEditCtrl.UpdateData(true); 但没有任何改变。

添加一个变量来获取盒子的控制器(pCRichEditCtrl)是否足够?似乎指针没有指向正确的控件项。

你知道缺少什么吗?

【问题讨论】:

  • 我已经给出了使用直接 MFC 加载您的控件的答案——您如何/在哪里声明 pCRichEditCtrl?以及如何将其连接到您的控件?
  • 我通过 GUI 添加它:右键单击 RichEdit 控件 -> 添加变量... 附加信息:如果我添加以下行,则 RichEdit 显示文本,但仅从第 2 行开始:UpdateData(TRUE); 很奇怪。
  • 使用pCRichEditCtrl 的设置编辑了我的答案,下面的简单测试项目适用于我没有UpdateData(),只有当您有“值”类型的变量时才需要这样做

标签: c++ mfc visual-studio-2005 richedit


【解决方案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();
}



编辑:控制变量pCRichEditCtrl

a) 应在对话框类中声明为CRichEditCtrl pCRichEditCtrl;

b) 应该连接到控件的ID(例如:IDC_RICHEDIT21),比如

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

c) 我已经测试了以下代码,它适用于我(在每次单击按钮时将“aa”添加到控制窗口)

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

【讨论】:

  • 感谢您的提示,但这并不能解决我的主要问题。文件阅读对我有用。
  • 感谢您对我的问题所做的额外工作。 a) 通过 GUI 操作自动添加(添加变量...) b) 与 a) c) 对我不起作用我必须在 while 循环之前使用 UpdateData(FALSE); 并且也在循环中使用。我不知道为什么,但这是使它工作的唯一方法。也许问题是我对这个版本的 Visual Studio 框架的工作流程一无所知。你能给我一个关于这个特定版本的基础知识的很好的在线指南,尤其是关于控制和事件处理的吗?这对我来说就足够了;)
  • 控制和事件处理在 VS 版本中没有太大变化,这是我找到的最清晰的文章:functionx.com/visualc/controls/managing.htm(大多数其他文章描述了如何管理“值”类型的变量,在您的情况下,它是“控制”类型的变量)
【解决方案2】:

我与社区分享最终解决方案,以供面临相同问题的人使用。我不知道为什么我必须在CWinApp 继承上使用Update(FALSE); 两次,但它解决了一切。如果有人有想法或更好(更好)的解决方案,请毫不犹豫地与我们分享,我会将接受的标志移至该版本(如果可能,我之前没有尝试过)。

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();
}

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 2011-01-17
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多