我有一个带有菜单和 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) 我有一个CRichEditCtrl,一个算法在其内容上就地工作,迭代内容并进行更改.这似乎导致它每次重新绘制,这会导致闪烁和明显的时间来完成操作,特别是如果控件开始滚动.我想知道是否有一种巧妙的方法可以阻止它重新粉刷一段时间.它实际上是一个使用CRichEditCtrl的自定义子类,所以我想的是:
void MyCustomEditCtrl::DoAlgorithm()
{
enableRepaint(false);
...
//to the actual work
...
enableRepaint(true);
}
Run Code Online (Sandbox Code Playgroud)
什么是最好的方法?一个自定义的on-paint处理程序,在进行操作时什么都不做?或者重新粉刷实际上是禁用?
我正在使用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项目中有一个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) 在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