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 ...
随机推荐
- Java不带.classpath的svn项目下载,转成到eclipse中
.classpath是Eclipse的工程文件,别人没有将工程的信息传到SVN库中,就检查不出.classpath文件,识别不了项目结构. 这种做法也是比较提倡的方法.SVN上只要有项目的源码信息就可 ...
- Docker技术三大要点:cgroup, namespace和unionFS的理解
www.docker.com的网页有这样一张有意思的动画: 从这张gif图片,我们不难看出Docker网站想传达这样一条信息, 使用Docker加速了build,ship和run的过程. Docker ...
- POJ-1061 青蛙的约会---扩展欧几里得算法
题目链接: https://cn.vjudge.net/problem/POJ-1061 题目大意: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线 ...
- Java实现身份证号码验证源码分享
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- UIView的多重属性
1)几何属性: 2)位图属性:
- 【[HNOI2004]L语言】
\(Trie\)树+\(DP\) 我们只需要做一个存在性dp就好了 对于每一个字符串,我们设\(f[i]\)表示从\(1\)到\(i\)位是否能被完全匹配 首先\(f[0]=1\),之后我们对于每一个 ...
- Url快捷方式转超链接页
效果:(打了码 可以感受到效果) 问题: 近期发现了之前的一些网页快捷方式文件有50个 查看起来实在不方便 解决: 目前想到了两种 (书签法) (类书签法) 第一种简单快速 (当然有掌握写技巧) ...
- tensorflow一个很好的博客
http://blog.csdn.net/mydear_11000/article/details/53197891
- js去除空格(trim方法)
/** * 去空格 */ String.prototype.trim=function(){ return this.replace(/(^\s*)|(\s*$)/g, ""); ...
- mime中间件
mime中间件Demo,里面用到的有 1.path模块 //引入模块 var path=require('path'); 2.extname方法 //获取文件的扩展名 var extname=path ...