duilib+mfc 移动父窗口

Duilib窗口与Win32窗口的嵌套包含 Duilib对话框与Win32对话框嵌套包含,解决对话框位置调整与消息处理流程 立即下载

制作一个客户端,选择duilib+cef+mfc为客户端界面。父窗口为一个对话框,子窗口为duilib的窗口(Mainframe)。当主界面把mfc的对话框盖住时,发现窗口移动不了(无标题窗口)。为了移动主窗口,记录的解决方法:

  • 第一个解决方法(失败)
...
    if (uMsg == WM_LBUTTONUP)  
    {  
        POINT point = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
        ::ReleaseCapture();  
        ::SendMessage(::GetParent(this->GetHWND()),WM_SYSCOMMAND,SC_DRAGMOVE,0); 
        return 0;
    }
...

这段代码实现了点击窗口任意位置,窗口移动的目的,但是窗口的所有消息都被丢弃了(return 0)。不能采用这个方法。需要监控鼠标移动+鼠标点击的事件。
* 第二个方法(ok)

if (uMsg == WM_MOUSEMOVE)
    {  
        if (::GetAsyncKeyState(VK_LBUTTON) != 0 && m_bStartMove)  
        {   
            POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
            int dx = pt.x - m_StartPt.x;  
            int dy = pt.y - m_StartPt.y;  
            RECT curRect;  
            ::GetWindowRect(m_hWnd, &curRect);  

            int cx = curRect.left + dx;  
            int cy = curRect.top + dy;  

            int  w = curRect.right - curRect.left;  
            int  h = curRect.bottom - curRect.top;  

            SetWindowPos(::GetParent(this->GetHWND()), NULL, cx, cy, w, h, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);  
        }  

    }
    else if (uMsg == WM_LBUTTONDOWN)
    {  
        POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
        m_bStartMove = TRUE;  
        m_StartPt = pt;  
    }
    else if (uMsg == WM_LBUTTONUP)  
    {  
        m_bStartMove = FALSE;  
    }  

不需要任何返回。完整代码如下:

LRESULT MainFrame::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    LRESULT lRes = 0; 
    if (uMsg == WM_MOUSEMOVE)
    {  
        if (::GetAsyncKeyState(VK_LBUTTON) != 0 && m_bStartMove)  
        {   
            POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
            int dx = pt.x - m_StartPt.x;  
            int dy = pt.y - m_StartPt.y;  
            RECT curRect;  
            ::GetWindowRect(m_hWnd, &curRect);  

            int cx = curRect.left + dx;  
            int cy = curRect.top + dy;  

            int  w = curRect.right - curRect.left;  
            int  h = curRect.bottom - curRect.top;  

            SetWindowPos(::GetParent(this->GetHWND()), NULL, cx, cy, w, h, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);  
        }  

    }
    else if (uMsg == WM_LBUTTONDOWN)
    {  
        POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };  
        m_bStartMove = TRUE;  
        m_StartPt = pt;  
    }
    else if (uMsg == WM_LBUTTONUP)  
    {  
        m_bStartMove = FALSE;  
    }  
    if( uMsg == WM_CREATE ) 
    {  
        CPaintManagerUI::SetInstance(AfxGetInstanceHandle());//加载XML的时候,需要使用该句柄去定位EXE的路径,才能加载XML的路径
        CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));//定位图片等资源的位置

        m_pm.Init(m_hWnd);  
        CDialogBuilder builder;  
        CControlUI *pRoot = builder.Create(_T("ui.xml"), (UINT)0, NULL, &m_pm); //加载的XML文件的名称
        ASSERT(pRoot && "Failed to parse XML");  
        m_pm.AttachDialog(pRoot);  
        m_pm.AddNotifier(this);  

        return 0;  
    }  
    else if( uMsg == WM_DESTROY ) 
    {  
        ::PostQuitMessage(0);  
    }  

    if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;  
    return CWindowWnd::HandleMessage(uMsg, wParam, lParam);

}

大功告成!

MFC界面中加载duilib;duilib界面中添加MFC控件。 立即下载

相关推荐

仿新版360安全卫士主界面(基于稍作修改的duilib)

稍微修改了 duilib,使之支持异性窗口、窗口阴影。 可以通过拖动窗口边缘改变窗口大小

MFC对话框构架程序

遗憾的是:从来没有被坚定选择过,就像是,他只是刚好需要,你只是刚好在。。。 ---- 网易云热评 一、对话框架构分类 1、模式对话框,弹出来不能进行其他操作 2、无模式对话框,弹出来后可以进行其他操作 二、新建win32应用程序(模式对话框) 1、创建 2、修改属性 3、添加Dialog资源 4、包含头文件 #include <afxwin.h>#include "resource.h" 5、定义一个类,管理对话框资源 class CM...

Web安全工具库 416

sciter2-界面库及demo(比duilib还好用的界面库)

sciter2-界面库及demo(比duilib还好用的界面库) 以前一直用MFC做界面,虽有朋友推荐多种界面设计,但也就看看,从没真正去了解。最近帮朋友做导航界面,明确要求用HTMLayout,网上搜索了下,看了下介绍,感觉sciter2比HTMLayout做的界面还炫丽,朋友同意后,今天就开始接触。目的是继承CWnd,生成sciterWnd,然后将sciter2封装在里面,通过换html文件来更好sciterWnd界面设计。

duilib中使用mfc控件

2.CControlUI* CDuiFrameWnd::CreateControl(LPCTSTR pstrClassName)中。MFC与duilib之间控件相互调用_mfc程序调用duilib_byxdaz的博客-优快云博客。1. 需要先在xlm上有对应的控件 MyWin32Wnd MyMfcWnd为对应的类名。中create中 CRect的参数为 左上右下,不同控件,修改CRect的位置。pstrClassName 为xml中类名。

u012719076的博客 926

gsplat在windows本地部署

3DGS的cuda提效和优化内存的版本gsplat,使得在有一定GPU计算能力的电脑上也能够尝尝3DGS的效果。我在2025年的开年之初尝试配置过gsplat,由于过程中遇到很多问题,最终还是有一些windows上字符编码的问题,没有跑通,最近看gsplat的github更新了3DGUT,优化了反射和二次折射,以及适用于非线性相机模型,如鱼眼相机等。在data目录下下载好了360_v2的数据,进入之后images文件夹是原始分辨率的图像,images_2是下采样系数为2的数据,以此类推。

yuleaf_csdn的博客 2370

AWS 小白书 [1] 全球架构

小白应该知道的 AWS 知识

boshansolo的博客 704

duilib进阶教程 -- 在duilib中使用MFC (2)

  好人做到底,送佛送到西。虽然上一篇教程已经说得很详细了,但Alberl还是再举一个例子。上一篇教程的主窗口是MFC的,所以这篇教程把主窗口换成duilib的~O(∩_∩)O~   1、我们利用《2013 duilib入门简明教程 -- 完整的自绘标题栏(8)》里的XML做为主窗口,并且把客户区的控件都去掉,换成一个自定义控件<Dialog />。将XML改名为XMP_MAIN.x...

weixin_30920513的博客 341

【超详细】C#的单例模式

本文详细介绍了C#中的单例设计模式,包括两种实现方式:普通类泛型单例(Singleton<T>)和基于MonoBehaviour的组件单例(MonoSingleton<T>)。单例模式通过私有构造、静态私有实例和公共访问入口确保全局唯一实例,具有节省资源、保证数据一致性等优势。文章分别阐述了两者的核心原理、代码实现、使用场景及注意事项,并提供了日志管理器和音效管理器的具体应用示例。特别强调了多线程安全、初始化时机和避免过度使用等重要原则,为Unity开发中合理运用单例模式提供了全面指导。

grapefruit_lyy的博客 1533

在duilib中嵌入win32控件或者MFC控件

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33882443的博客 1321

ICLR 2022)ODConv:即插即用的动态卷积 (附代码)

一定程度上讲,ODConv可以视作CondConv的延续,将CondConv中一个维度上的动态特性进行了扩展,同时了考虑了空域、输入通道、输出通道等维度上的动态性,故称之为全维度动态卷积。ODConv是一种动态卷积算法,它的原理是在卷积过程中,根据输入数据的特征动态地调整卷积核的形状和大小,以适应不同的输入数据。具体来说,ODConv通过引入一个可学习的形变模块,根据输入数据的特征动态地调整卷积核的形状和大小,从而提高了卷积神经网络的性能。此外,相比常规卷积,动态卷积的卷积核参数往往是其n倍。

PLANTTHESON的博客 2万+

Tomcat启动过程中cmd窗口(控制台)中文乱码的问题

tomcat启动时,启动过程日志中文乱码的处理方法。

寻码启示 1942

CWnd与CDialog-MFC窗口与SOUI、Duilib窗口

1.MFC CWnd窗口是所有窗口基类,CDialog与其他所有控件,都是继承于CWnd,然后绘制出来的 所以MFC所有窗口都是真窗口 具体布局就是: 主窗口是真窗口,然后里面各个控件都是真窗口,主窗口创建好后,子控件在onsize里调整好位置就行了 鼠标移到主窗口的控件上时,按下、移动等消息都会被控件接收,主窗口就响应不到了 ---------- 2.SOUI、DUIlib 只有主窗口和对话框窗口是真窗口,里面的所有控件都是绘制上去的,不是真窗口 所以到主窗口的这些控件上时,按下、移动等各种.

kevin的博客 782

Matlab实战:用DQN算法让机器人学会自主避障(附完整代码)

本文详细介绍了如何使用Matlab实现DQN(深度Q网络)算法,使机器人在复杂环境中学会自主避障。通过环境建模、网络架构设计、奖励函数优化及实战调试,提供了完整的代码实现和训练策略,帮助开发者快速应用于机器人路径规划项目。

t8u9v0w1x的博客 232

duilib进阶教程 -- 改进窗口拖动 (12)

  现在大家应该都知道caption="0,0,0,32",是指示标题栏区了吧,如果想要整个窗口都能拖动呢? 那直接把高度改成和窗口一样不就得了~O(∩_∩)O~   嗯,这样是可以,比如窗口高度是600,那么我们指定caption="0,0,0,600",这样整个窗口就可以拖动了,但是如果窗口大小改变了呢?假如调整窗口的大小到800,这个时候最下面的200个像素的高度就不能拖动啦,因此这里进行...

工欲善其事必先利其器,勿在浮砂筑高台 530

PS/Ai/PR/AE等adobe出现正版弹窗提示:Your non-genuine Adobe app will be disabled soon解决办法

就是用专门的清理工具下载,清理工具在文章下方。然后新建三个空的记事本文件,重命名为 Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe。在该文件目录中,分别找到 Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe,然后在防火墙入站规则里,阻止Adobe Genuine Launcher.exe,AdobeGCClient.exe,AGMService.exe。

Q82556499的博客 1万+

OCR文字识别基础

ocr文字识别

m0_47405013的博客 1755

Duilib消息响应

Duilib类似MFC的消息响应如下: DUI_DECLARE_MESSAGE_MAP() DUI_BEGIN_MESSAGE_MAP(CYmChatUI, CXMLWnd) DUI_ON_MSGTYPE(DUI_MSGTYPE_CLICK, OnClick) DUI_END_MESSAGE_MAP() 绑定消息响应函数: #define DUI_MSGTY...

qq_24127015的博客 931

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

2013 duilib入门简明教程 -- 事件处理和消息响应 (17)

Alberl 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)     界面的显示方面就都讲完啦,下面来介绍下控件的响应。     前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理。其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEGIN_MESSAGE_MAP,可以将DUI_MSGTYPE_CLICK消息映射到指定的函数(比如On

rundll64的专栏 1583

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

关于duilib的CTreeViewUI扩展以支持节点拖放的手记

本文主要是记录下对于CtreeViewUI支持不同节点间的拖放功能的扩展过程,抛砖引玉,希望能让更多的人来丰富duilib的功能。   由于客户要求能够在树控件中在各个节点间进行节点拖放,此项目是应用duilib来实现的,但找遍了duilib的例子以及网上的资料,都没有相关可以拖放的树的信息,这下可难倒我这个刚入门的duiliber了,想来想去,拟定了如下三个探索方向: 1. 嵌入windo

TragicGuy的专栏 5117

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

终极Duilib指南:为什么这款Windows界面库能让你的开发效率提升300%?

Duilib不仅仅是一个界面库,更是一种开发理念的革新。它通过XML驱动、硬件加速、模块化设计等先进理念,让Windows界面开发变得更加简单、高效和有趣。 无论你是刚入门的新手,还是经验丰富的开发者,Duilib都能为你带来显著的效率提升。从今天开始,告别繁琐的界面代码,拥抱Duilib带来的开发新体验! **如果你觉得这篇文章对你有帮助,请点赞、收藏、关注三连!** 我们下期将深入解析Du

gitblog_00918的博客 771

duilib入门问题集

引入duilib时请确保引入头文件开始时先引入COMUTIL.H头文件 #include "COMUTIL.H" #include "UIlib.h" duilib基本程序结构 在stdafx.h文件中加入 #include "COMUTIL.H" #include "UIlib.h" using namespace DuiLib; #ifn

hkwlg1314的博客 1312

qt ui界面无法移动控件_常用的Windows C++软件界面库介绍

最近悟空问答上有不少人问,有哪些好用的C++界面库,我是做Windows应用程序开发的,做过很多UI客户端程序,对这一点比较了解,在此结合这些年的开发经验,给大家推荐几款常用的、免费的C++界面库,以供参考。1、微软的MFC我刚毕业那会,基本用的都是MFC,感觉相对来说是比较简单的。MFC是微软基于Windows系统开发的一套经典C++桌面程序开发框架,集成在微软的Visual Studio开发环...

weixin_28856717的博客 845

VC/MFC 前景

mfc=没饭吃。可以不学,可以先试着用纯win32编写计算器。了解窗口类,消息循环,窗口过程这些本质的东西。另外可能需要用到窗口子类化,超类化。 对模板有所了解,可以接着学学atl里是怎么包装window的,主要是个思路。更多控件的包装可以看下wtl。 接着就是directui的概念,可以学下duilib, 不少客户端用这个开发的。有能力的公司,估计也是基于这套思路开发ui框架的。主要

phenixyf的专栏 2858

Duilib 拖放按钮时获取当前按钮和拖放位置的布局名称

最近由于公司要换界面 库所以想起了我之前用过的DUIlib 虽然之前也没有多深入但是能趁着这个机会把这个库用好。这个库由于网上版本较多,所以选择了旗舰版的一个分支,到目前还不错。功能其实比较简单,就是窗口有一排按钮要将按钮拖放到一块区域内然后根据按钮名创建对应得节点,这个功能在MFC 上其实很好实现,我这里有现成的例子,但是DUILIB虽然消息跟MFC 一样但是毕竟两个界面库肯定不能像MFC 那样做。好在这个库比较成熟了提供不少机制。这个问题其实也困扰了我好几天,首先按钮类要实现拖拽的效果并且加移动的阴影,

王春雨的博客 405

duilib 子窗口位置_duilib入门简明教程 -- 界面布局(9) (转)

效果如图:可以看到整个最小化按钮都被拉伸了,其中两边的矩形色块是因为图片的边框也被拉伸了。我们再加上最大化按钮和关闭按钮,XML如下:效果如图:可以发现三个按钮被均匀拉伸了。但是我们显然不想让按钮被拉伸,怎么办呢?还记得前面说的占位布局吗?因为我们想让按钮显示到右边,所以我们要占住左边的部分。 那我们加一个占位试试。不过,(1)亲们知道这个占位要加到哪一行么?当然是加到按钮的上面! 那我们加到按钮...

weixin_42353053的博客 481
上一篇: 记录一下结构体排序的问题(vector,map)
下一篇: openstack horizon 极其缓慢的问题
猫影
博客等级 码龄10年 31粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值