Résolvez le problème que NetEase open source duilib est livré avec RichEdit et que le clavier ne peut pas être entré dans certains systèmes

phénomène

Récemment, duilib basé sur la maintenance open source de NetEase a créé un client. Après sa mise en ligne, les utilisateurs ont signalé une série de problèmes. Le problème le plus étrange est que RichEdit ne peut parfois pas être entré.
Insérez la description de l'image ici

sondage

Après avoir testé avec l'exemple officiel, il a été constaté qu'il y avait également des problèmes:

Le XML de ces deux RichEdits est le suivant:

<!-- 单行文本 -->
<RichEdit class="simple input" height="30" margin="0,3" padding="6,6,6" promptmode="true" prompttext="Single line text control" promptcolor="lightcolor"/>

<!-- 多行文本 -->
<RichEdit class="prompt" name="edit" bkcolor="bk_wnd_lightcolor" width="stretch" height="stretch" 
            multiline="true" vscrollbar="true" hscrollbar="true" autovscroll="true" 
            normaltextcolor="darkcolor" wantreturnmsg="true" rich="true"/>

Solution

Après avoir constamment changé le test de style, il existe 2 façons:

  • Remplacez la classe = "entrée simple" dans le texte d'une seule ligne par class = "entrée"
  • Le style simple est défini dans global.xml, recherchez la définition de simple dans ce fichier et supprimez wanttab = "false"
<Class name="simple" multiline="false" autohscroll="true" wantreturnmsg="true" rich="false" normaltextcolor="darkcolor" disabledtextcolor="textdefaultdisablecolor"/>
<!-- <Class name="simple" multiline="false" autohscroll="true" wantreturnmsg="true" wanttab="false" rich="false" normaltextcolor="darkcolor" disabledtextcolor="textdefaultdisablecolor"/> -->

Par conséquent, il est finalement déterminé qu'il existe une relation avec wanttab = "false".

Question de suivi

Après avoir supprimé wanttab = "false", j'ai trouvé que la zone de saisie du nom d'utilisateur et du mot de passe, en appuyant sur Tab lorsque le nom d'utilisateur, ajoutera un onglet \ t au lieu d'une nouvelle ligne , je dois donc continuer à le résoudre.

Après avoir lu attentivement le code pertinent de duilib après la modification de NetEase, traitez-le manuellement dans RichEdit \ t pour l'envelopper.

void RichEdit::OnChar(EventArgs& event)
{
    
    
	//TAB
	if (::GetKeyState(VK_TAB) < 0) {
    
    
		if (!m_bWantTab) {
    
    
			if (m_pWindow != NULL)
				m_pWindow->SendNotify((Control*)this, kEventTab);
			return;
		}

		// added_by [email protected] 2021-01-28 tab ignore
		// m_bWantTabEx是新增的属性,需要外部主动赋值。
		if (!m_bWantTabEx) {
    
    
			if (m_pWindow != NULL)
				m_pWindow->SetNextTabControl(::GetKeyState(VK_SHIFT) >= 0);
			return;
		}
	}
	//Number
	if (m_bNumberOnly) {
    
    
		if (event.wParam < '0' || event.wParam > '9')
			return;
	}

	TxSendMessage(WM_CHAR, event.wParam, event.lParam, NULL);
}

En supposant que l'interface de connexion s'appelle LoginForm, dans InitWindow, appelez SetWantTabEx (fonction supplémentaire ajoutée pour résoudre le problème que certains ordinateurs ne peuvent pas saisir) pour la définir.

void LoginForm::InitWindow() {
    
    
	// ...
    passwd_ = static_cast<ui::RichEdit*>(FindControl(L"passwd"));
    ed_phone_ = static_cast<ui::RichEdit*>(FindControl(L"ed_phone"));
    ed_sms_ = static_cast<ui::RichEdit*>(FindControl(L"ed_sms"));

    // SetWantTabEx是新增的函数,自己可以在RichEdit.h中新增即可。
	ed_phone_->SetWantTabEx(false);
	passwd_->SetWantTabEx(false);
	ed_sms_->SetWantTabEx(false);
	
	// ...
}

post-scriptum

Le site officiel n'a pas été mis à jour depuis plus d'un an et j'ai conservé tous les problèmes trouvés dans le fichier README.md de cette branche. Si vous en avez besoin, veuillez déplacer:

Je suppose que tu aimes

Origine blog.csdn.net/xmcy001122/article/details/113343899
conseillé
Classement