想新增个OptionHBox 控件类,主要是想实现 option组,动态显示哪个的子项的问题。
发现,原duilib没有这个功能,就参照duilib原有功能,扩展了一下。
目录
1、duilib\Core\Define.h 新增一个宏定义
#define DUI_CTR_OPTIONHBOX (_T("OptionHBox"))
template<typename InheritType = Control>
class UILIB_API OptionTemplate : public CheckBoxTemplate<InheritType>
{
public:
OptionTemplate();
~OptionTemplate();
/// 重写父类方法,提供个性化功能,请参考父类声明
virtual void SetWindow(Window* pManager, Box* pParent, bool bInit = true) override;
virtual void SetAttribute(const std::wstring& strName, const std::wstring& strValue) override;
virtual void Selected(bool bSelected, bool bTriggerEvent = false) override;
virtual void Activate() override;
/**
* @brief 获取所属组名称
* @return 返回组名称
*/
virtual std::wstring GetGroup() const;
/**
* @brief 设置所属组
* @param[in] strGroupName 组名称
* @return 无
*/
virtual void SetGroup(const std::wstring& strGroupName);
protected:
std::wstring m_sGroupName;
};
typedef OptionTemplate<Control> Option;
typedef OptionTemplate<Box> OptionBox;
//新增类型
typedef OptionTemplate<HBox> OptionHBox;
Control* WindowBuilder::CreateControlByClass(const std::wstring& strControlClass)
{
Control* pControl = nullptr;
SIZE_T cchLen = strControlClass.length();
switch( cchLen ) {
case 3:
if( strControlClass == DUI_CTR_BOX ) pControl = new Box;
break;
case 10:
if (strControlClass == DUI_CTR_OPTIONHBOX) pControl = new OptionHBox;
break;
}
return pControl;
}
选中某个子项,同时将其它子项选中状态设置为FALSE
template<typename InheritType>
void OptionTemplate<InheritType>::SelecteItem(std::wstring groupName, int nIndex)
{
if (this->m_pWindow != NULL)
{
if (!groupName.empty()) {
std::vector<Control*>* aOptionGroup = this->m_pWindow->GetOptionGroup(groupName);
ASSERT(aOptionGroup);
if (aOptionGroup) {
int nIndexT = 0;
for (auto it = aOptionGroup->begin(); it != aOptionGroup->end(); it++, nIndexT++) {
auto pControl = static_cast<Option*>(*it);
if (nIndex == nIndexT)
{
pControl->Selected(true, false);
}
else {
pControl->Selected(false,false);
}
}
}
}
this->m_pWindow->SendNotify(this, kEventSelect);
}
else {
this->m_pWindow->SendNotify(this, kEventUnSelect);
}
this->Invalidate();
}
注意: 只有子项 添加group属性,? ?<OptionHBox? ?...? ? 这里面不要添加group 属性了,
否则this->m_pWindow->GetOptionGroup(m_sGroupName),获得的option组,把这个父控件也统计进去了,这样就不对了。
pSizeOptonBox_->SelecteItem(L"sizeGroup",timeSize_);
pSecOptonBox_->SelecteItem(L"time_group", bShowSec_);
wchar_t* GetFileModulePath(wchar_t* path, int size)
{
*path = 0;
GetModuleFileNameW(GetModuleHandleW(NULL), path, size);
if (wchar_t* p = wcsrchr(path, '\\')) {
*(p+1) = 0; //路径后带\\/
}
return path;
}
std::wstring GetAppDir(){
static std::wstring dir;
if (!dir.empty())
return dir;
wchar_t szFileW[280];
GetFileModulePath(szFileW, sizeof(szFileW));
dir = szFileW;
return dir;
}
void TimeForm::WriteIniFile(std::wstring parentItem, std::wstring subItem, std::wstring value)
{
std::wstring dir = GetAppDir();
//测试的时候,给观众传入一个拉流地址
std::wstring iniPath =dir + L"set.ini";
WritePrivateProfileString(parentItem.c_str(), subItem.c_str(), value.c_str(), iniPath.c_str()); //
}
int TimeForm::ReadIniFile(std::wstring section, std::wstring wparam, int nDefault)
{
std::wstring dir = GetAppDir();
//测试的时候,给观众传入一个拉流地址
std::wstring iniPath = dir + L"set.ini";
return ::GetPrivateProfileInt(section.c_str(), wparam.c_str(), nDefault, iniPath.c_str()); //读取是否自动登录
}
enum TimeSize{
Min=0,
Middle,
Max,
MaxBig
};
TimeSize timeSize_ = Min;
读取
timeSize_ = (TimeSize)ReadIniFile(L"TimeWnd", L"size", 0);
pSizeOptonBox_->SetGroup(L"sizeGroup");
pSizeOptonBox_->SelecteItem(timeSize_);
保存
WriteIniFile(L"TimeWnd", L"size", std::to_wstring(timeSize_));