标签: cricheditctrl

CRichEditCtrl 在获得焦点时选择所有文本

我有一个带有菜单和 CTabCtrl 的对话框。CTabCtrl 有一个选项卡,其中包含一个 CDialog。反过来,它包含一些静态文本和一个 CRichEditCtrl。窗口获得和失去焦点没有特别的问题。

我自从添加了第二个相同的选项卡,现在每次更改选项卡时,CRichEditCtrl 中的所有文本显然都被选中。它以反转的配色方案显示,如果您按下一个键,所有文本都会被替换。

标志 ECO_NOHIDESEL 的描述说(强调我的):

否定编辑控件的默认行为。默认行为在控件失去输入焦点时隐藏选择,并在控件接收输入焦点时显示选择。如果指定 ECO_NOHIDESEL,则即使控件没有焦点,所选文本也会反转。

“显示选择”对我来说听起来像是“显示此控件上次获得焦点时的任何选择”,这不是正在发生的事情。通常在失去焦点之前没有选择任何内容,但是如果我确实尝试离开选择,请返回另一个选项卡并返回,整个文本像往常一样被选中。

可以阻止这种选择吗?

void EditorDialog::OnTabSelChange(NMHDR * phdr, LRESULT* pResult) {

  CTabCtrl* ptab = (CTabCtrl*) GetDlgItem( IDC_TAB );

  int iPageActive = ptab->GetCurSel();

  if ( iPageActive >= appage.N() ) {
      AKS( AKSWarn, "got tab change to tab %d when I only have %d ppages", iPageActive, appage.N() );
      return;
  }

  ppageActive = appage[ iPageActive ];

  SetActivePagePos();

  SCWinUtilSetWindowTextVA( this, "Editor: %s", ppageActive->pszFileName );
}



void EditorDialog::SetActivePagePos() {

  // STEP 1: …
Run Code Online (Sandbox Code Playgroud)

c++ mfc focus selection cricheditctrl

3
推荐指数
1
解决办法
2045
查看次数

如何停止MFC/win32控件重新绘制

我有一个CRichEditCtrl,一个算法在其内容上就地工作,迭代内容并进行更改.这似乎导致它每次重新绘制,这会导致闪烁和明显的时间来完成操作,特别是如果控件开始滚动.我想知道是否有一种巧妙的方法可以阻止它重新粉刷一段时间.它实际上是一个使用CRichEditCtrl的自定义子类,所以我想的是:

void MyCustomEditCtrl::DoAlgorithm()
{
 enableRepaint(false);
 ...
 //to the actual work
 ...
 enableRepaint(true);
}
Run Code Online (Sandbox Code Playgroud)

什么是最好的方法?一个自定义的on-paint处理程序,在进行操作时什么都不做?或者重新粉刷实际上是禁用?

winapi mfc repaint cricheditctrl

2
推荐指数
1
解决办法
2466
查看次数

什么使:: AfxInitRichEdit2失败,我该如何解决?

我正在使用Visual Studio 2012构建现有的MFC应用程序.该应用程序使用"RichEdit20A"继承的控件和自定义控件CRichEditCtrl.

InitInstance()应用程序调用期间::AfxInitRichEdit2(),哪些调用AtlLoadSystemLibraryUsingFullPath(L"RICHED20.DLL"),哪些调用LoadLibraryExW(pszLibrary, NULL, LOAD_LIBRARY_SEARCH_SYSTEM32).后一个调用失败并返回NULL.GetLastError()返回87(参数不正确.).这在Win7 x64和Win8 x64上都会发生.

失败的调用似乎已在Visual Studio 2012运行时中引入(它位于条件内#if NTDDI_VERSION >= NTDDI_WIN8).使用Visual Studio 2008构建时,应用程序运行正常.

有谁知道为什么会发生这种情况以及如何解决(或解决)这个问题?或者,有没有办法"恢复"运行时使用旧的加载行为?

mfc visual-c++ cricheditctrl visual-studio-2012

2
推荐指数
1
解决办法
1561
查看次数

CRichEditCtrl追加彩色文本?

我在MFC项目中有一个CRichEditCtrl,用作报告日志。根据给定的情况,我需要在控件上附加不同的彩色文本(例如,用于标准通知的蓝线,用于错误的红线等)。我已经很接近使它起作用,但是它的行为仍然很奇怪:

void CMyDlg::InsertText(CString text, COLORREF color, bool bold, bool italic)
{
    CHARFORMAT cf = {0};
    CString txt;
    int txtLen = m_txtLog.GetTextLength();
    m_txtLog.GetTextRange(0, txtLen, txt);

    cf.cbSize = sizeof(cf);
    cf.dwMask = (bold ? CFM_BOLD : 0) | (italic ? CFM_ITALIC : 0) | CFM_COLOR;
    cf.dwEffects = (bold ? CFE_BOLD : 0) | (italic ? CFE_ITALIC : 0) |~CFE_AUTOCOLOR;
    cf.crTextColor = color;

    m_txtLog.SetWindowText(txt + (txt.GetLength() > 0 ? "\n" : "") + text);
    m_txtLog.SetSel(txtLen, m_txtLog.GetTextLength());
    m_txtLog.SetSelectionCharFormat(cf);
}
Run Code Online (Sandbox Code Playgroud)

充其量,最终结果是新添加的行被适当地着色,但是所有先前的文本变为黑色。最重要的是,对于每行追加的文本,开始的选择似乎都增加了1。例如:

Call #1:
- [RED]This is …
Run Code Online (Sandbox Code Playgroud)

c++ mfc text colors cricheditctrl

2
推荐指数
1
解决办法
4518
查看次数

CRichEditCtrl:无法用 Unicode 字符串替换选择内容

在MFC/C++中,我有一个丰富的编辑2.0控件,class CRichEditCtrl,它是RichEdit20W. Rich edit 2.0 控件应该支持 Unicode。我用它来显示 Unicode 字符。但该ReplaceSel函数不接受 Unicode 字符串。例如

CRichEditCtrl re;
wstring line;
auto x = line.c_str(); // array of const wchar_t
re.ReplaceSel(x); // ERROR
Run Code Online (Sandbox Code Playgroud)

收到编译器错误,因为CRichEditCtrl::ReplaceSel原型为

void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE);
Run Code Online (Sandbox Code Playgroud)

并且LPCTSTR是一个const char *.

如何使用 Unicode 字符串进行替换?

Windows 11 专业版 Visual Studio 2022

c++ mfc cricheditctrl

2
推荐指数
1
解决办法
105
查看次数