第二人生的源码分析(九十五)LLCheckBoxCtrl类实现复选按钮

在第二人生的登录界面里,可以看到输入密码的下面有一个复选按钮,如下图所示:
这个按钮在这里主要用来设置是否帮助用户保存密码在磁盘里的,这样可以使用户每次不用输入密码,就可以登录进去。那么这个按钮是怎么样实现的呢?现在就分析跟这个相关的代码,它的继承代码如下:
class LLCheckBoxCtrl
: public LLUICtrl
可见 LLCheckBoxCtrl类也是控件类来的,它主要两部分组成:LLButton和LLTextBox。这两个类都是前面学习过的按钮类和静态文本框。在LLCheckBoxCtrl类声明如下:
#001 protected:
#002     // note: value is stored in toggle state of button
#003  LLButton*     mButton;
#004  LLTextBox*    mLabel;
#005     const LLFontGL* mFont;
#006     LLColor4        mTextEnabledColor;
#007     LLColor4        mTextDisabledColor;
 
LLCheckBoxCtrl类的显示代码,如下:
#001 void LLCheckBoxCtrl::draw()
#002 {
 
根据是否选择来显示文本不同的颜色。
#003     if (getEnabled())
#004     {
#005         mLabel->setColor( mTextEnabledColor );
#006     }
#007     else
#008     {
#009         mLabel->setColor( mTextDisabledColor );
#010     }
#011 
#012     // Draw children
#013     LLUICtrl::draw();
#014 }
 
由于使用前面两个现成的组件构造一个新组件,这样不需要使用更多复杂的代码,就可以实现这样的功能了,因此就这样简单的。当然这两个组件的构造是在 LLCheckBoxCtrl类构造函数里创建的,如下:
#001 LLCheckBoxCtrl::LLCheckBoxCtrl(const LLString& name, const LLRect& rect,
#002                                 const LLString& label,
#003                                 const LLFontGL* font,
#004                                 void (*commit_callback)(LLUICtrl* ctrl, void*
#005 userdata),
#006                                 void* callback_user_data,
#007                                 BOOL initial_value,
#008                                 BOOL use_radio_style,
#009                                 const LLString& control_which)
#010 : LLUICtrl(name, rect, TRUE, commit_callback, callback_user_data, FOLLOWS_LEFT | FOLLOWS_TOP),
#011     mTextEnabledColor( LLUI::sColorsGroup->getColor( "LabelTextColor" ) ),
#012     mTextDisabledColor( LLUI::sColorsGroup->getColor( "LabelDisabledColor" ) ),
#013     mRadioStyle( use_radio_style ),
#014     mInitialValue( initial_value ),
#015     mSetValue( initial_value )
#016 {
#017     if (font)
#018     {
#019         mFont = font;
#020     }
#021     else
#022     {
#023         mFont = LLFontGL::sSansSerifSmall;
#024     }
#025 
#026     // must be big enough to hold all children
#027     setUseBoundingRect(TRUE);
#028 
#029     mKeyboardFocusOnClick = TRUE;
#030 
#031     // Label (add a little space to make sure text actually renders)
#032     const S32 FUDGE = 10;
#033     S32 text_width = mFont->getWidth( label ) + FUDGE;
#034     S32 text_height = llround(mFont->getLineHeight());
#035     LLRect label_rect;
#036     label_rect.setOriginAndSize(
#037         LLCHECKBOXCTRL_HPAD + LLCHECKBOXCTRL_BTN_SIZE + LLCHECKBOXCTRL_SPACING,
#038         LLCHECKBOXCTRL_VPAD + 1, // padding to get better alignment
#039         text_width + LLCHECKBOXCTRL_HPAD,
#040         text_height );
#041 
#042     // *HACK Get rid of this with SL-55508...
#043     // this allows blank check boxes and radio boxes for now
#044     LLString local_label = label;
#045     if(local_label.empty())
#046     {
#047         local_label = " ";
#048     }
#049 
#050  mLabel = new LLTextBox( "CheckboxCtrl Label", label_rect, local_label.c_str(), mFont );
#051     mLabel->setFollowsLeft();
#052     mLabel->setFollowsBottom();
#053  addChild(mLabel);
#054 
#055     // Button
#056     // Note: button cover the label by extending all the way to the right.
#057     LLRect btn_rect;
#058     btn_rect.setOriginAndSize(
#059         LLCHECKBOXCTRL_HPAD,
#060         LLCHECKBOXCTRL_VPAD,
#061         LLCHECKBOXCTRL_BTN_SIZE + LLCHECKBOXCTRL_SPACING + text_width + LLCHECKBOXCTRL_HPAD,
#062         llmax( text_height, LLCHECKBOXCTRL_BTN_SIZE ) + LLCHECKBOXCTRL_VPAD);
#063     LLString active_true_id, active_false_id;
#064     LLString inactive_true_id, inactive_false_id;
#065     if (mRadioStyle)
#066     {
#067         active_true_id = "UIImgRadioActiveSelectedUUID";
#068         active_false_id = "UIImgRadioActiveUUID";
#069         inactive_true_id = "UIImgRadioInactiveSelectedUUID";
#070         inactive_false_id = "UIImgRadioInactiveUUID";
#071       mButton = new LLButton(
#072          "Radio control button", btn_rect,
#073          active_false_id, active_true_id, control_which,
#074          &LLCheckBoxCtrl::onButtonPress, this, LLFontGL::sSansSerif );
#075         mButton->setDisabledImages( inactive_false_id, inactive_true_id );
#076         mButton->setHoverGlowStrength(0.35f);
#077     }
#078     else
#079     {
#080         active_false_id = "UIImgCheckboxActiveUUID";
#081         active_true_id = "UIImgCheckboxActiveSelectedUUID";
#082         inactive_true_id = "UIImgCheckboxInactiveSelectedUUID";
#083         inactive_false_id = "UIImgCheckboxInactiveUUID";
#084       mButton = new LLButton(
#085          "Checkbox control button", btn_rect,
#086          active_false_id, active_true_id, control_which,
#087          &LLCheckBoxCtrl::onButtonPress, this, LLFontGL::sSansSerif );
#088         mButton->setDisabledImages( inactive_false_id, inactive_true_id );
#089         mButton->setHoverGlowStrength(0.35f);
#090     }
#091     mButton->setIsToggle(TRUE);
#092     mButton->setToggleState( initial_value );
#093     mButton->setFollowsLeft();
#094     mButton->setFollowsBottom();
#095     mButton->setCommitOnReturn(FALSE);
#096  addChild(mButton);
#097 }
 
这样简单就实现了一个复选框的功能。

转载于:https://www.cnblogs.com/ajuanabc/archive/2008/06/19/2464047.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值