最近使用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 即可...
其他控件类似这种解决方法...