本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:Duilib – 界面出现不可拖动和不可拉伸的问题
原文链接:https://www.stubbornhuang.com/2491/
发布于:2023年01月30日 15:42:34
修改于:2023年01月30日 15:42:34

1 Duilib软件界面出现不可拖动和不可拉伸的问题
距离上一次用Duilib写Windows软件界面已经几个月了,对于Duilib的使用难免比较生疏,今天就遇到一个比较费解的问题,一般情况下我们在写duilib界面的xml文件时,会如下的对软件主界面进行定义
<Window size="1280,720" maxinfo="1280,720" mininfo="1280,720" sizebox="6,6,6,6" caption="0,0,0,90" showshadow="true" shadowsize="2" shadowposition="0,0" shadowcolor="#F0F0F0" shadowdarkness="155" >
</Window>
其中Window的sizebox
属性定义软件窗口可拖动改变窗口大小的边距,而caption
定义窗口可拖动的标题栏大小的边距,一般情况下,如果我们在界面xml文件中按上述方式定义了这两个属性,那么我们就可以通过鼠标按住软件进行拖动,和将鼠标放在软件四个边界对界面进行拖动拉伸,但是今天即使定义了上述的两个属性,也无法正常的对界面进行拖动和拉伸。
在经过费解和查找问题之后,是由于我对WindowImplBase
类的虚函数OnSysCommand
进行了实现,但是并没有在其中有任何代码实现,这直接导致了后续没有办法对消息进行正常的处理,在WindowImplBase
中,OnSysCommand
的实现如下
LRESULT WindowImplBase::OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if (wParam == SC_CLOSE)
{
bHandled = TRUE;
SendMessage(WM_CLOSE);
return 0;
}
#if defined(WIN32) && !defined(UNDER_CE)
BOOL bZoomed = ::IsZoomed(*this);
LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);
if( ::IsZoomed(*this) != bZoomed ) {
if( !bZoomed ) {
CControlUI* pControl = static_cast<CControlUI*>(m_PaintManager.FindControl(_T("maxbtn")));
if( pControl ) pControl->SetVisible(false);
pControl = static_cast<CControlUI*>(m_PaintManager.FindControl(_T("restorebtn")));
if( pControl ) pControl->SetVisible(true);
}
else {
CControlUI* pControl = static_cast<CControlUI*>(m_PaintManager.FindControl(_T("maxbtn")));
if( pControl ) pControl->SetVisible(true);
pControl = static_cast<CControlUI*>(m_PaintManager.FindControl(_T("restorebtn")));
if( pControl ) pControl->SetVisible(false);
}
}
#else
LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);
#endif
return lRes;
}
如果我们要自定义实现,但是其中并没有使用CWindowWnd::HandleMessage(uMsg, wParam, lParam);
对系统消息进行处理,那么久会导致出现上述的问题,所以解决方法有两种,第一种就是直接使用WindowImplBase
类的虚函数OnSysCommand
实现,不进行复写;第二种就是如果一定要复写的情况下,一定要将CWindowWnd::HandleMessage(uMsg, wParam, lParam);
放在函数体中,比如
LRESULT MainWindow::OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// 有时会在收到WM_NCDESTROY后收到wParam为SC_CLOSE的WM_SYSCOMMAND
if (wParam == SC_CLOSE) {
::PostQuitMessage(0L);
bHandled = TRUE;
return 0;
}
BOOL bZoomed = ::IsZoomed(*this);
LRESULT lRes = CWindowWnd::HandleMessage(uMsg, wParam, lParam);
}
出现这种情况还是由于自己已经很久不写了,以后要多注意这种细节问题。
当前分类随机文章推荐
- Duilib - 为列表控件UIList添加列表子项右键点击消息响应功能 阅读356次,点赞0次
- Duilib - 在主界面xml描述文件中使用ChildLayout或者Include嵌入子界面xml描述文件 阅读471次,点赞0次
- Duilib - Edit编辑控件输入文字时编辑框背景颜色不是所设置的背景颜色的问题 阅读410次,点赞1次
- Duilib - pos和padding属性设置的顺序 阅读2440次,点赞0次
- Duilib - 程序开机自启动 阅读1804次,点赞0次
- Duilib - duilib应用程序实现文件可拖拽的功能 阅读2325次,点赞1次
- Duilib - Duilib的绘制机制和绘制流程 阅读307次,点赞1次
- Duilib - Label控件文本换行 阅读1740次,点赞1次
- Duilib - 设置窗体阴影 阅读2865次,点赞2次
- Duilib - 点击程序关闭按钮最小化到托盘,点击托盘按钮恢复 阅读1571次,点赞0次
全站随机文章推荐
- OpenCV - linux上编译出现undefined reference to cv::dnn::experimental_dnn错误 阅读1537次,点赞0次
- TensorRT - 解决INVALID_ARGUMENT: getPluginCreator could not find plugin ScatterND version 1,TensorRT找不到ScatterND插件的问题 阅读3286次,点赞0次
- 资源分享 - Essential Mathematics for Games and Interactive Applications(First Edition) 英文高清PDF下载 阅读1753次,点赞0次
- 资源分享 - Introduction to 3D Game Programming with DirectX 12 英文高清PDF下载 阅读3011次,点赞1次
- Linux - 编译Crypto++加密库 阅读1113次,点赞1次
- UnrealEngine4 - Can not find such file SceneRenderTargets.h,在UE4 C++层中正确的使用FSceneRenderTargets类 阅读2678次,点赞0次
- C++ - 格式化json字符串,方便展示json字符串的层次结构 阅读2577次,点赞0次
- Youtube运营 - 如何使用一个Google账号创建多个Youtube频道 阅读185次,点赞0次
- 资源分享 - AI Game Engine Programming , Second Edition 英文高清PDF下载 阅读901次,点赞0次
- 资源分享 - Calculus for Computer Graphics , Second Edition 英文高清PDF下载 阅读964次,点赞0次
评论
167