我有一个带有菜单和 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: Make the proper tab page visible.
for ( int i = 0; i < appage.N(); i++ )
appage[i]->ShowWindow( SW_HIDE );
ppageActive->ShowWindow( SW_SHOW );
// STEP 2: Make the new tab page the right size and position.
CTabCtrl* ptab = (CTabCtrl*) GetDlgItem( IDC_TAB );
CRect rectTab, rectItem;
ptab->GetClientRect( &rectTab );
ptab->GetItemRect( 0, &rectItem );
int iPageX = rectItem.left + 2;
int iPageY = rectItem.bottom + 4;
int iPageW = rectTab.right - 2 - iPageX;
int iPageH = rectTab.bottom - 2 - iPageY;
ppageActive->SetWindowPos( &wndTop, iPageX, iPageY, iPageW, iPageH, SWP_SHOWWINDOW | SWP_NOZORDER );
// STEP 3: Give the window focus and let it know to redraw.
ppageActive->SetFocus();
// When the tab changes the entire content of the RichEdit is selected for some reason.
// As a workaround I manually clear the selection.
CRichEditCtrl* prich = (CRichEditCtrl*) ppageActive->GetDlgItem( IDC_PATCH );
prich->SetSel(-1,-1);
// Redrawing just the prich, or the ppageActive, or the ptab, doesn't
// cause the RichEdit to redraw correctly, but Redrawing the entire dialog does.
RedrawWindow();
}