MFC非模态添加进程控件方法一(线程方法)
由于非模态对话框的自己没有消息循环,创建后无法进行消息处理。需要和父窗口共用消息循环。如果单独在子窗口进行控件由于自己没有单独的消息循环,更新是无法进行的。
如果在父窗口更新控件会造成程序假死。如以下代码在主窗口更新子窗口消息,界面进入假死状态。因为主界面对主进程进行了sleep(100),如下代码所示
void CModelessDlg::OnBnClickedOk()
{
DLGModeLess *pDlg = new DLGModeLess();
pDlg->Create(IDD_DG_MODLESS, NULL);
pDlg->ShowWindow(SW_SHOW);
pDlg->m_Progress1.SetRange(, );
pDlg->m_Progress1.SetStep();
for (int i = ; i<; i++)
{
pDlg->m_Progress1.StepIt();
Sleep();
}
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnOK();
}
在主窗口尝试开一个线程来更新控件
void CModelessDlg::OnBnClickedOk()
{
AfxBeginThread((AFX_THREADPROC)MyThreadExample, , THREAD_PRIORITY_IDLE);
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnOK();
}
UINT MyThreadExample(LPVOID *pParam)
{
DLGModeLess *pDlg = new DLGModeLess();
pDlg->Create(IDD_DG_MODLESS, NULL);
pDlg->ShowWindow(SW_SHOW);
pDlg->m_Progress1.SetRange(, );
pDlg->m_Progress1.SetStep();
for (int i = ; i<; i++)
{
pDlg->m_Progress1.StepIt();
Sleep();
}
return ;
}
发现这样开线程后,子窗口直接假死都不可以移动了!
我发现在子线程直接开窗口这样做似乎有点愚蠢,这似乎是让整个程序一直跑在子窗口里面,同时还SLEEP(100)和上面在主程序更新一样,同样造成了程序假死。而且是停留在子窗口的假死。
为了不这么愚蠢,我把程序更改如下。创建了一个全局模态窗口的指针,同时在构造函数里面创建了该窗口,然后在按钮事件处响应。在线程处隐藏。这样就可以避免多次创建子窗口。
DLGModeLess *pDlg = new DLGModeLess();//全局新建非模态窗口指针。 // CModelessDlg 对话框
UINT MyThreadExample(LPVOID *pParam)
{
pDlg->m_Progress1.SetRange(, );
pDlg->m_Progress1.SetStep();
for (int i = ; i<; i++)
{
pDlg->m_Progress1.StepIt();
Sleep();
}
pDlg->ShowWindow(false);
return ;
} CModelessDlg::CModelessDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_MODELESS_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
pDlg->Create(IDD_DG_MODLESS, NULL); //构造函数里面创造程序,按钮响应,避免多次创建
}
void CModelessDlg::OnBnClickedOk() //按键响应事件
{
//if (pDlg->GetDlgItem(IDD_DG_MODLESS));
CWnd* pWnd = GetDlgItem(IDD_DG_MODLESS); pDlg->ShowWindow(SW_SHOW);
AfxBeginThread((AFX_THREADPROC)MyThreadExample, , THREAD_PRIORITY_IDLE);
// TODO: 在此添加控件通知处理程序代码
//CDialogEx::OnOK();
}
经过这样的处理之后,我就可以很自在的在非模态窗口中更新进程控件。

跟新的同时可以随便移动子窗口。

更新完成后,由pDlg->ShowWindow(false);线程函数隐藏。

MFC非模态添加进程控件方法一(线程方法)的更多相关文章
- MFC非模态添加进程控件方法二(自定义消息方法)
以下内容有大部分转载自CSDN,经过自己整理完成. 该文主要的方法为在非模态对话框中自定义一组消息函数,然后在主窗口中开辟一个线程通过线程把消息传递给子窗口进行更新. 在子窗口类中定义消息如下: /* ...
- mfc非模态对话框
按照我们的之前的做法,先新建工程. 把基本的内容都添加上. 形成这样一个样子: 并且进行试运行,让程序能够完成加法运算. 值的注意的是,静态文本那里要改一下名字,否则无法将成员变量进行添加. 前期准备 ...
- MFC非模态对话框中屏蔽ESC键
个人的编程经验认为:对于非模态对话框,按下ESC键和点击红叉都会响应OnCancel()函数,而不会去响应OnClose()函数. 我们都知道,如果想屏蔽Enter键,只须重写OnOK()函数即可(重 ...
- MFC非模态对话框销毁
非模态对话框需要重载OnCanel方法, 并调用DestroyWindow, 且不能调用基类的OnCanel重载PostNcDestroy, 需要delete掉this指针 // Overrides ...
- VS2010 MFC中 单独添加ODBC数据库记录集类(CRecordset)方法
基于VS2010 MFC的项目是之前建好的,后来需要添加数据库. 方法分享于此. 1. 打开自己的项目,项目->添加类. 2. 选MFC ODBC使用者,点右下角的添加. 3. 点数据源. / ...
- objectarx MFC 非模态对话框为当前焦点
dialog.h afx_msg LRESULT OnAcadKeepFocus(WPARAM, LPARAM); dialog.cpp BEGIN_MESSAGE_MAP(CTextDialog, ...
- 十三、$.ajax、模态/非模态框、window.open()、href属性、submit()等提交请求优劣及问题解决方法
1. $.ajax提交请求进行数据更新,并通过回调进行有效提示 function updateAudit(dispacher, control) { var currentpage = documen ...
- 控制非模态弹出框(showModelessDialog)唯一且随父页面关闭
网站开发中,常常会遇到需要弹出窗体的情况,一般弹出框有模态和非模态两种,如下: 模态:window.showModalDialog() 非模态:window.showModelessDialog() ...
- 添加RichEdit控件后导致MFC对话框程序无法运行的解决方法
新建一个基于对话框的MFC程序,对话框上添加了RichEdit控件,编译成功后无法运行起来,Debug版本与Release版本均不行! Windbg分析结果: WARNING: Stack unwin ...
随机推荐
- 【Leetcode】【Medium】Word Break
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- 小程序——使用Easy Mock
使用Easy Mock 一.什么是Easy Mock Easy Mock 是一个可视化的能快速生成模拟数据的持久化服务.在实际开发中常见的Mock方式一般是将模拟数据直接写在代码里,利用Java ...
- July 10th 2017 Week 28th Monday
I get that look a lot, but I never let it get to me. 我常常受到异样的目光,但我从不把它们放在眼里. I don't feel good these ...
- Fcoin和Coinex,谁更值得投资?
2018年是数字货币市场很熊的一年,大部分币种在这一年下跌超过了90%.但是这一年对于数字货币的发展也是不平凡的,可以说是至关重要的一年.通证经济商业模型在这一年萌芽,并茁壮成长,2018是通证经济元 ...
- calcurse 日程管理软件
包括有命令行与界面操作两部分: 命令行操作: 1.显示所有的 appointment and events root@zsf:/etc# calcurse -a09/15/13: - 21:35 -& ...
- 为什么要使用base64编码,有哪些情景需求?
Base64编码原理与应用 Java实现BASE64编解码 公钥证书也好,电子邮件数据也好,经常要用到Base64编码,那么为什么要作一下这样的编码呢? 我们知道在计算机中任何数据都是按ascii码存 ...
- Dell R720上的系统安装问题的解决办法(关于RAID建立磁盘阵列的技术)
摘要:本篇是本人在搭建大数量存储.搜索环境时,对于使用Dell PowerEdge R720 and R720xd作为服务器所遇到的一些问题进行的总结. 开始时,我们使用Dell提供的安装光盘(蓝色) ...
- itext-2.1.7.jar
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库.通过iText不仅可以生成PDF或rtf的文档,而且可以将XML.Html文件转化为PDF文件. ...
- POJ-1284 Primitive Roots---原根&欧拉函数
题目链接: https://cn.vjudge.net/problem/POJ-1284 题目大意: 就是给出一个奇素数,求出他的原根的个数. 解题思路: 由于是m是奇素数,m的欧拉函数值为m - 1 ...
- CF587F Duff is Mad
题目 有趣的思想 首先暴力的话,自然是对每一个询问在\(AC\)自动机上跑一遍\(k\),看看跑出来的节点在\(fail\)树到根的路径上有多少个\(l\)到\(r\)之间的结束标记就好了 我们发现无 ...