由于最近在做一个项目,需要用到wxWidgets这个框架,但是wxWidgets这个框架目前来看使用范围不是很广,很多资料在网上都很难找到。因此,想把自己工作中遇到的一些有关wxWidgets的问题发到网上来,一来方便大家搜索,二来也对自己做个总结。
在项目中,需要用到登录窗口,登录中必然要有文本框输入用户名和密码进行验证,然后想做成像QQ那样可以在文本框中有提示信息说明此文本框的作用。先上图,看看效果:
像上图那样,文本框没有获得焦点的时候,提示输入信息,文本框获得焦点的时候,用户可以输入字符。那具体代码中应该怎么实现呢?
首先,窗口的布局信息,是在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();
}
这样子处理后,就可以起到提示的作用了。