wxWidgets设置登陆窗口用户名和密码的文本提示

本文详细介绍了如何在wxWidgets框架中实现类似QQ的文本框提示功能,包括登录窗口中用户名和密码输入框的提示信息展示与隐藏逻辑。通过设置窗口布局、加载对话框资源和事件处理,实现了文本框在未获得焦点时显示提示信息,获得焦点后自动清除提示并允许用户输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于最近在做一个项目,需要用到wxWidgets这个框架,但是wxWidgets这个框架目前来看使用范围不是很广,很多资料在网上都很难找到。因此,想把自己工作中遇到的一些有关wxWidgets的问题发到网上来,一来方便大家搜索,二来也对自己做个总结。

在项目中,需要用到登录窗口,登录中必然要有文本框输入用户名和密码进行验证,然后想做成像QQ那样可以在文本框中有提示信息说明此文本框的作用。先上图,看看效果:

      pic11    

像上图那样,文本框没有获得焦点的时候,提示输入信息,文本框获得焦点的时候,用户可以输入字符。那具体代码中应该怎么实现呢?

首先,窗口的布局信息,是在XRC文件中的:

<object class="sizeritem">
<span style="white-space:pre">	</span><option>0</option>
<span style="white-space:pre">	</span><flag>wxALL</flag>
<span style="white-space:pre">	</span><border>10</border>
<span style="white-space:pre">	</span><object class="wxTextCtrl" name="ID_EDIT_USERNAME">
<span style="white-space:pre">		</span><size>200,25</size>
<span style="white-space:pre">		</span><value>Username:</value>
<span style="white-space:pre">		</span><style>wxTE_PROCESS_ENTER</style>
<span style="white-space:pre">		</span><fg>#808080</fg>
<span style="white-space:pre">	</span></object>
</object>
<object class="sizeritem">
<span style="white-space:pre">	</span><option>0</option>
<span style="white-space:pre">	</span><flag>wxALL</flag>
<span style="white-space:pre">	</span><border>10</border>
<span style="white-space:pre">	</span><object class="wxTextCtrl" name="ID_EDIT_PASSWORD">
<span style="white-space:pre">		</span><size>200,25</size>
<span style="white-space:pre">		</span><!-- <style>wxTE_PASSWORD</style> -->
<span style="white-space:pre">		</span><value>Password:</value>
<span style="white-space:pre">		</span><fg>#808080</fg>
<span style="white-space:pre">	</span></object>
</object>
然后,在代码中加载对话框资源的函数里设置控件获得焦点事件的处理:

XRCCTRL(*this, "ID_EDIT_USERNAME", wxTextCtrl)->Connect(wxEVT_SET_FOCUS, 
		wxFocusEventHandler(CLogonDialog::OnClearTipValue), 0, this);
XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl)->Connect(wxEVT_SET_FOCUS, 
		wxFocusEventHandler(CLogonDialog::OnClearTipValue), 0, this);
相应的获取焦点事件处理逻辑如下:

void CLogonDialog::OnClearTipValue(wxFocusEvent& event)
{
	if (event.GetId() == XRCID("ID_EDIT_USERNAME"))
	{		
		if (m_usernameTipValue)
		{
			XRCCTRL(*this, "ID_EDIT_USERNAME", wxTextCtrl)->SetValue(_T(""));
			XRCCTRL(*this, "ID_EDIT_USERNAME", wxTextCtrl)->
				SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));

			m_usernameTipValue = false;
		}	
		if (XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl)->GetValue().IsEmpty())
		{
			XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl)->SetValue(_("Password:"));			
			XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl)->
				SetForegroundColour(wxColour(128, 128, 128));

			wxTextCtrl* password = XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl);
			wxTextCtrl_SetPasswordFlag(password, false);

			m_passwordTipValue = true;
		}
	}
	else if (event.GetId() == XRCID("ID_EDIT_PASSWORD"))
	{
		if (m_passwordTipValue)
		{
			XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl)->SetValue(_T(""));
			XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl)->
				SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));

			wxTextCtrl* password = XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl);
			wxTextCtrl_SetPasswordFlag(password, true);

			m_passwordTipValue = false;
		}
		if (XRCCTRL(*this, "ID_EDIT_USERNAME", wxTextCtrl)->GetValue().IsEmpty())
		{
			XRCCTRL(*this, "ID_EDIT_USERNAME", wxTextCtrl)->SetValue(_("Username:"));
			XRCCTRL(*this, "ID_EDIT_USERNAME", wxTextCtrl)->
				SetForegroundColour(wxColour(128, 128, 128));

			m_usernameTipValue = true;
		}
	}
	else 
	{
		if (XRCCTRL(*this, "ID_EDIT_USERNAME", wxTextCtrl)->GetValue().IsEmpty())
		{
			XRCCTRL(*this, "ID_EDIT_USERNAME", wxTextCtrl)->SetValue(_("Username:"));
			XRCCTRL(*this, "ID_EDIT_USERNAME", wxTextCtrl)->
				SetForegroundColour(wxColour(128, 128, 128));

			m_usernameTipValue = true;
		}
		if (XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl)->GetValue().IsEmpty())
		{
			XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl)->SetValue(_("Password:"));
			XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl)->
				SetForegroundColour(wxColour(128, 128, 128));

			wxTextCtrl* password = XRCCTRL(*this, "ID_EDIT_PASSWORD", wxTextCtrl);
			wxTextCtrl_SetPasswordFlag(password, false);

			m_passwordTipValue = true;
		}
	}
	
	event.Skip();
}

这样子处理后,就可以起到提示的作用了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值