#ifndef UI_CONTROL_CHECKBOX_H_ #define UI_CONTROL_CHECKBOX_H_ #pragma once namespace ui { template class UILIB_API CheckBoxTemplate : public ButtonTemplate { public: CheckBoxTemplate(); /// 重写父类方法,提供个性化功能,请参考父类声明 virtual void Activate() override; virtual Image* GetEstimateImage() override; virtual void SetAttribute(const std::wstring& strName, const std::wstring& strValue) override; virtual void PaintStatusColor(IRenderContext* pRender) override; virtual void PaintStatusImage(IRenderContext* pRender) override; virtual void PaintText(IRenderContext* pRender) override; virtual bool HasHotState(); /** * @brief 判断当前是否是选择状态 * @return 返回 true 为选择状态,否则为 false */ bool IsSelected() const { return m_bSelected; } /** * @brief 设置控件是否选择状态 * @param[in] bSelected 为 true 时为选择状态,false 时为取消选择状态 * @param[in] bTriggerEvent 是否发送状态改变事件,true 为发送,否则为 false。默认为 false * @return 无 */ virtual void Selected(bool bSelected, bool bTriggerEvent = false); /** * @brief 获取被选择时的图片 * @param[in] stateType 要获取何种状态下的图片,参考 ControlStateType 枚举 * @return 返回图片位置 */ std::wstring GetSelectedStateImage(ControlStateType stateType); /** * @brief 设置被选择时的图片 * @param[in] stateType 要设置哪中状态下的图片 * @param[in] strImage 图片地址 * @return 无 */ void SetSelectedStateImage(ControlStateType stateType, const std::wstring& strImage); /** * @brief 获取被选择时的文本颜色 * @return 返回被选择时的文本颜色 */ std::wstring GetSelectedTextColor(); /** * @brief 设置被选择时的文本颜色 * @param[in] dwTextColor 要设置的颜色字符串,该颜色必须在 global.xml 中存在 * @return 无 */ void SetSelectedTextColor(const std::wstring& dwTextColor); /** * @brief 获取被选择时的控件颜色 * @param[in] stateType 要获取何种状态下的颜色 * @return 返回颜色字符串,该值在 global.xml 中定义 */ std::wstring GetSelectStateColor(ControlStateType stateType); /** * @brief 设置被选择时的控件颜色 * @param[in] stateType 要设置何种状态下的颜色 * @param[in] stateColor 要设置的颜色 * @return 无 */ void SetSelectedStateColor(ControlStateType stateType, const std::wstring& stateColor); /** * @brief 获取被选择时的前景图片 * @param[in] stateType 要获取何种状态下的前景图片 * @return 返回图片位置 */ std::wstring GetSelectedForeStateImage(ControlStateType stateType); /** * @brief 设置被选择时的前景图片 * @param[in] stateType 要设置何种状态下的前景图片 * @param[in] pStrImage 图片位置 * @return 无 */ void SetSelectedForeStateImage(ControlStateType stateType, const std::wstring& pStrImage); /** * @brief 监听被选择时的事件 * @param[in] callback 被选择时触发的回调函数 * @return 无 */ void AttachSelect(const EventCallback& callback) { this->OnEvent[kEventSelect] += callback; } /** * @brief 监听取消选择时的事件 * @param[in] callback 取消选择时触发的回调函数 * @return 无 */ void AttachUnSelect(const EventCallback& callback) { this->OnEvent[kEventUnSelect] += callback; } protected: bool m_bSelected; std::wstring m_dwSelectedTextColor; StateColorMap m_selectedColorMap; }; template CheckBoxTemplate::CheckBoxTemplate() : m_bSelected(false), m_dwSelectedTextColor(), m_selectedColorMap() { m_selectedColorMap.SetControl(this); } template void CheckBoxTemplate::Activate() { if (!this->IsActivatable()) return; Selected(!m_bSelected, true); } template void CheckBoxTemplate::Selected(bool bSelected, bool bTriggerEvent) { if (m_bSelected == bSelected) return; m_bSelected = bSelected; if (this->m_pWindow != NULL) { if (bTriggerEvent) { if (m_bSelected) { this->m_pWindow->SendNotify(this, kEventSelect); } else { this->m_pWindow->SendNotify(this, kEventUnSelect); } } } this->Invalidate(); } template bool CheckBoxTemplate::HasHotState() { return m_selectedColorMap.HasHotColor() || __super::HasHotState(); } template Image* CheckBoxTemplate::GetEstimateImage() { Image* estimateImage = __super::GetEstimateImage(); if (!estimateImage) { estimateImage = this->m_imageMap.GetEstimateImage(kStateImageSelectedBk); } return estimateImage; } template void CheckBoxTemplate::SetAttribute(const std::wstring& strName, const std::wstring& strValue) { if (strName == _T("selected")) Selected(strValue == _T("true"), true); else if (strName == _T("selectednormalimage")) SetSelectedStateImage(kControlStateNormal, strValue); else if (strName == _T("selectedhotimage")) SetSelectedStateImage(kControlStateHot, strValue); else if (strName == _T("selectedpushedimage")) SetSelectedStateImage(kControlStatePushed, strValue); else if (strName == _T("selecteddisabledimage")) SetSelectedStateImage(kControlStateDisabled, strValue); else if (strName == _T("selectedtextcolor")) SetSelectedTextColor(strValue); else if (strName == _T("selectednormalcolor")) SetSelectedStateColor(kControlStateNormal, strValue); else if (strName == _T("selectedhotcolor")) SetSelectedStateColor(kControlStateHot, strValue); else if (strName == _T("selectedpushedcolor")) SetSelectedStateColor(kControlStatePushed, strValue); else if (strName == _T("selecteddisabledcolor")) SetSelectedStateColor(kControlStateDisabled, strValue); else if (strName == _T("selectedforenormalimage")) SetSelectedForeStateImage(kControlStateNormal, strValue); else if (strName == _T("selectedforehotimage")) SetSelectedForeStateImage(kControlStateHot, strValue); else if (strName == _T("selectedforepushedimage")) SetSelectedForeStateImage(kControlStatePushed, strValue); else if (strName == _T("selectedforedisabledimage")) SetSelectedForeStateImage(kControlStateDisabled, strValue); else __super::SetAttribute(strName, strValue); } template void CheckBoxTemplate::PaintStatusColor(IRenderContext* pRender) { if (!IsSelected()) { __super::PaintStatusColor(pRender); return; } m_selectedColorMap.PaintStatusColor(pRender, this->m_rcPaint, this->m_uButtonState); } template void CheckBoxTemplate::PaintStatusImage(IRenderContext* pRender) { if (!IsSelected()) { __super::PaintStatusImage(pRender); return; } this->m_imageMap.PaintStatusImage(pRender, kStateImageSelectedBk, this->m_uButtonState); this->m_imageMap.PaintStatusImage(pRender, kStateImageSelectedFore, this->m_uButtonState); } template void CheckBoxTemplate::PaintText(IRenderContext* pRender) { if (!IsSelected()) { __super::PaintText(pRender); return; } if (this->GetText().empty()) return; UiRect rc = this->m_rcItem; rc.left += this->m_rcTextPadding.left; rc.right -= this->m_rcTextPadding.right; rc.top += this->m_rcTextPadding.top; rc.bottom -= this->m_rcTextPadding.bottom; std::wstring newTextColor = m_dwSelectedTextColor.empty() ? this->m_textColorMap[kControlStateNormal] : m_dwSelectedTextColor; DWORD dwTextColor = GlobalManager::GetTextColor(newTextColor); DWORD dwDisabledTextColor = GlobalManager::GetTextColor(this->m_textColorMap[kControlStateDisabled]); pRender->DrawText(rc, this->GetText(), this->IsEnabled() ? dwTextColor : dwDisabledTextColor, this->m_iFont, this->m_uTextStyle); } template std::wstring CheckBoxTemplate::GetSelectedStateImage(ControlStateType stateType) { return this->m_imageMap.GetImagePath(kStateImageSelectedBk, stateType); } template void CheckBoxTemplate::SetSelectedStateImage(ControlStateType stateType, const std::wstring& pStrImage) { this->m_imageMap.SetImage(kStateImageSelectedBk, stateType, pStrImage); if (this->GetFixedWidth() == DUI_LENGTH_AUTO || this->GetFixedHeight() == DUI_LENGTH_AUTO) { this->ArrangeAncestor(); } else { this->Invalidate(); } } template std::wstring CheckBoxTemplate::GetSelectedTextColor() { return m_dwSelectedTextColor; } template void CheckBoxTemplate::SetSelectedTextColor(const std::wstring& dwTextColor) { m_dwSelectedTextColor = dwTextColor; this->Invalidate(); } template std::wstring CheckBoxTemplate::GetSelectStateColor(ControlStateType stateType) { return m_selectedColorMap[stateType]; } template void CheckBoxTemplate::SetSelectedStateColor(ControlStateType stateType, const std::wstring& stateColor) { m_selectedColorMap[stateType] = stateColor; this->Invalidate(); } template std::wstring CheckBoxTemplate::GetSelectedForeStateImage(ControlStateType stateType) { return this->m_imageMap.GetImagePath(kStateImageSelectedFore, stateType); } template void CheckBoxTemplate::SetSelectedForeStateImage(ControlStateType stateType, const std::wstring& pStrImage) { this->m_imageMap.SetImage(kStateImageSelectedFore, stateType, pStrImage); if (this->GetFixedWidth() == DUI_LENGTH_AUTO || this->GetFixedHeight() == DUI_LENGTH_AUTO) { this->ArrangeAncestor(); } else { this->Invalidate(); } } typedef CheckBoxTemplate CheckBox; typedef CheckBoxTemplate CheckBoxBox; } // namespace ui #endif // UI_CONTROL_CHECKBOX_H_#ifndef UI_CONTROL_CHECKBOX_H_