第二人生的源码分析(九十五)LLCheckBoxCtrl类实现复选按钮 - 大坡3D软件开发 - CSDNBlog

导读:
  新一篇: 第二人生的源码分析(九十六)LLMenuItemGL实现菜单的显示
  在第二人生的登录界面里,可以看到输入密码的下面有一个复选按钮,如下图所示:
  
  
  这个按钮在这里主要用来设置是否帮助用户保存密码在磁盘里的,这样可以使用户每次不用输入密码,就可以登录进去。那么这个按钮是怎么样实现的呢?现在就分析跟这个相关的代码,它的继承代码如下:
  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 }
  
  这样简单就实现了一个复选框的功能。

本文转自
http://blog.csdn.net/caimouse/archive/2008/06/19/2567220.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值