duilib 实战 之 悬浮时间小窗口 3 新增一个Option控件类

发布时间:2024年01月23日

想新增个OptionHBox 控件类,主要是想实现 option组,动态显示哪个的子项的问题。

发现,原duilib没有这个功能,就参照duilib原有功能,扩展了一下。

目录

一、duilib新增一个控件类

1、duilib\Core\Define.h 新增一个宏定义

2、Option模板类

3、在WindowBuilder中创建

4、扩展一个 选中某个子项的功能

5、实例

1)、样式

2)、代码中选则子项

3)、保存、读取选中的option

3.1)、AppDir

3.2)、保存、读取 INI 相关函数

3.3)、option选项 保存与读取


一、duilib新增一个控件类

1、duilib\Core\Define.h 新增一个宏定义

#define  DUI_CTR_OPTIONHBOX                       (_T("OptionHBox"))

2、Option模板类


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;

3、在WindowBuilder中创建

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;
}

4、扩展一个 选中某个子项的功能

选中某个子项,同时将其它子项选中状态设置为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();
	}

5、实例

1)、样式

注意: 只有子项 添加group属性,? ?<OptionHBox? ?...? ? 这里面不要添加group 属性了,

否则this->m_pWindow->GetOptionGroup(m_sGroupName),获得的option组,把这个父控件也统计进去了,这样就不对了。

2)、代码中选则子项

	pSizeOptonBox_->SelecteItem(L"sizeGroup",timeSize_);


	pSecOptonBox_->SelecteItem(L"time_group", bShowSec_);

3)、保存、读取选中的option

3.1)、AppDir

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;
}

3.2)、保存、读取 INI 相关函数

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());  //读取是否自动登录   

}
3.3)、option选项 保存与读取

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_));

文章来源:https://blog.csdn.net/shuilan0066/article/details/135528840
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。