DuiLib官方库中的Checkbox只有Checked和Uncheck两种状态,但我们往往要实现这中需求:
显然,Checkbox自带的属性和方法都不能满足这种需求,这就需要我们自定义重写CheckBox控件。
其实选择状态还是只有2种,因为SetCheck(bool bCheck) 参数只能为true或者false。但我们可以重写CheckBox的
void PaintStatusImage(HDC hDC) 方法,让但所有Checkbox都选中时绘制选中图标,全未选时绘制全未选图标,
未全选时绘制一种半选状态的图标。
修改UICheckBox.h
#ifndef __UICHECKBOX_H__
#define __UICHECKBOX_H__
#pragma once
namespace DuiLib
{
/// 最普通的单选按钮控件,只有是、否两种结果
/// 派生于COptionUI,只是每组只有一个按钮而已,组名为空,配置文件默认属性举例:
/// <CheckBox name="CheckBox" value="height='20' align='left' textpadding='24,0,0,0' normalimage='file='sys_check_btn.png' source='0,0,20,20' dest='0,0,20,20'' selectedimage='file='sys_check_btn.png' source='20,0,40,20' dest='0,0,20,20'' disabledimage='file='sys_check_btn.png' source='40,0,60,20' dest='0,0,20,20''"/>
class UILIB_API CCheckBoxUI : public COptionUI
{
public:
~CCheckBoxUI();
LPCTSTR GetClass() const;
void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);
LPCTSTR GetSelectGroup() const;
void SetSelectGroup(LPCTSTR pStrGroupName);
LPCTSTR GetHalfSelectedImage();
void SetHalfSelectedImage(LPCTSTR pStrImage);
void PaintStatusImage(HDC hDC);
void Selected(bool bSelected);
void SetCheck(bool bCheck);
bool GetCheck() const;
private:
CStdPtrArray m_selectGroup;
CDuiString m_sSelectGroupName;
CDuiString m_sHalfSelectedImage;
};
}
#endif // __UICHECKBOX_H__
UICheckBox.cpp文件:
#include "stdafx.h"
#include "UICheckBox.h"
namespace DuiLib
{
CCheckBoxUI::~CCheckBoxUI()
{
if( !m_sSelectGroupName.IsEmpty() && m_pManager ) m_pManager->RemoveSelectGroup(m_sSelectGroupName, th