Duilib 一些可能被忽略的问题

最近使用DUILIB做界面时发现一些问题,做个记录.


首先是xml的caption属性

<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Window size="1024,768" caption="0,0,0,768">
    <Font name="微软雅黑" size="12" bold="false" italic="false" />
    <Font name="微软雅黑" size="12" bold="true" italic="false" />
    <Font name="微软雅黑" size="14" bold="false" italic="false" />
    <Font name="微软雅黑" size="16" bold="false" italic="false" />
    .......
</windows>

一般默认情况capiton是30,如果覆盖整个区域会出现什么情况呢, 我们会发现在任何地方按下鼠标左键 窗口都可以进行移动而不是 紧紧在顶部30像素范围内,并且会发现原本能响应鼠标操作的控件无效了.

解决办法,如下:

LRESULT CFrameWindowWnd::OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
 
	POINT pt; pt.x = GET_X_LPARAM(lParam); pt.y = GET_Y_LPARAM(lParam);
	::ScreenToClient(*this, &pt);
	RECT rcClient;
	::GetClientRect(*this, &rcClient);
	if( !::IsZoomed(*this) )
	{
		RECT rcSizeBox = m_pm.GetSizeBox();
		if( pt.y < rcClient.top + rcSizeBox.top ) {
			if( pt.x < rcClient.left + rcSizeBox.left ) return HTTOPLEFT;
			if( pt.x > rcClient.right - rcSizeBox.right ) return HTTOPRIGHT;
			return HTTOP;
		}
		else if( pt.y > rcClient.bottom - rcSizeBox.bottom ) {
			if( pt.x < rcClient.left + rcSizeBox.left ) return HTBOTTOMLEFT;
			if( pt.x > rcClient.right - rcSizeBox.right ) return HTBOTTOMRIGHT;
			return HTBOTTOM;
		}
		if( pt.x < rcClient.left + rcSizeBox.left ) return HTLEFT;
		if( pt.x > rcClient.right - rcSizeBox.right ) return HTRIGHT;
	}

	RECT rcCaption = m_pm.GetCaptionRect();
	if( pt.x >= rcClient.left + rcCaption.left && pt.x < rcClient.right - rcCaption.right && pt.y >= rcCaption.top && pt.y < rcCaption.bottom ) 
	{
		CControlUI* pControl = static_cast<CControlUI*>(m_pm.FindControl(pt));
		if( 
			pControl && 
			_tcscmp(pControl->GetClass(), _T("ButtonUI")) != 0 && 
			_tcscmp(pControl->GetClass(), _T("OptionUI")) != 0 &&
			_tcscmp(pControl->GetClass(), _T("TextUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("EditUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("ListUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("CheckBoxUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("SliderUI")) != 0  &&
			//_tcscmp(pControl->GetClass(), _T("ListHeaderItemUI")) != 0  &&		
			_tcscmp(pControl->GetClass(), _T("ListTextElementUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("ListLabelElementUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("ListContainerElementUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("ScrollBarUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("TreeViewUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("TreeNodeUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("TreeNodeLayoutUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("ProgressGIFUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("ButtonGifUI")) != 0  &&
			_tcscmp(pControl->GetClass(), _T("LabelGifUI")) != 0 
			)
		{			
			return  HTCAPTION;
		}
	}

	return HTCLIENT;
}
添加将需要响应控件添加至过程..添加好以后控件即可响应鼠标操作,但还有第二个问题


List右键菜单存在问题,若list中无任何项目则右键无法弹出菜单,如果添加一条则在添加的list项上右键则可弹出菜单.经过分析List控件在创建时分为listhead和listbody ,而listheard默认有类名而 listbody则无类名,因此即便通过上面添加类名的方式也无法响应.所以需要对duilib源码进行修改.具体修改如下

UIList.h 找到 class UILIB_API CListBodyUI : public CVerticalLayoutUI 添加public

LPCTSTR GetClass() const;

UIList.cpp 添加

LPCTSTR CListBodyUI::GetClass() const
{
	return _T("ListBodyUI");
}
最后将 类名 ListBodyUI添加至 窗口OnNcHitTest 即可...

其他控件类似这种解决方法...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值