MFC非模态添加进程控件方法二(自定义消息方法)
以下内容有大部分转载自CSDN,经过自己整理完成。
该文主要的方法为在非模态对话框中自定义一组消息函数,然后在主窗口中开辟一个线程通过线程把消息传递给子窗口进行更新。
在子窗口类中定义消息如下:
/*************************************************子窗口*******************************************************************************/
消息函数定义
afx_msg LRESULT Customize(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
消息函数映射
BEGIN_MESSAGE_MAP(CDiaglogATest, CDialogEx)
ON_MESSAGE(WM_CUSTOMIZE, Customize) //自定义消息映射
ON_BN_CLICKED(IDOK, &CDiaglogATest::OnBnClickedOk)
END_MESSAGE_MAP()
消息函数实现
LRESULT CDiaglogATest::Customize(WPARAM wParam, LPARAM lParam)
{
CString strTittle;
if (wParam < )
wParam = ;
else if (wParam >= )
{
wParam = ;
m_Progress1.ShowWindow(FALSE);
UpdateWindow();
} strTittle.Format(_T("自定义消息参数:x=%d,y=%d"), wParam, lParam);
m_Progress1.SetPos(wParam);
SetWindowText(strTittle);
UpdateData(TRUE);
return ;
}
在初始化窗口函数中初始进度条
BOOL CDiaglogATest::OnInitDialog()
{
CDialogEx::OnInitDialog(); m_Progress1.SetRange(, );
m_Progress1.SetStep();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
/*******************************************************父窗口主要是开线程,传消息**********************************************/
//以下线程代码主要实现传递按钮位置参数和,完成后的子窗口销毁消息
struct myThreadParamExanple
{
bool bRunningFlag; // 线程运行标志变量
HWND hwnd; // 线程关联的对话框窗口的句柄
char sFn[_MAX_PATH]; // 文件名
};
//
// 线程处理函数
UINT MyThreadExample(LPVOID *pParam)
{
FILE *fp = fopen(((struct myThreadParamExanple*)pParam)->sFn, "wt");
unsigned long iMaxCOunt = , g_nCount;
int iPercent;
CString msg;
for (g_nCount = ; ((struct myThreadParamExanple*)pParam)->bRunningFlag && g_nCount <= iMaxCOunt; ::InterlockedIncrement((long*)&g_nCount))
{
fprintf(fp, "g_nCount=%d\n", g_nCount);
Sleep();
iPercent = g_nCount * / iMaxCOunt;
::PostMessage((HWND)((struct myThreadParamExanple*)pParam)->hwnd, WM_CUSTOMIZE, iPercent, );//iPercent传递位置参数
}
if (!((struct myThreadParamExanple*)pParam)->bRunningFlag)
fprintf(fp, "\n线程被人为终止\n");
else
fprintf(fp, "\n线程自然结束\n");
fclose(fp); ((struct myThreadParamExanple*)pParam)->bRunningFlag = false;
::PostMessage((HWND)((struct myThreadParamExanple*)pParam)->hwnd, WM_DESTROY, , );//销毁子窗口 return ;
}
//以下代码主要实现了子窗口的显示和线程的创建
CString CMFCApplication2Dlg::GetCurrentPath()
{
TCHAR szFullPath[MAX_PATH];
GetModuleFileName(NULL, szFullPath, MAX_PATH);
CString sFn = szFullPath;
int ret = sFn.ReverseFind(_T('\\'));
sFn = sFn.Left(ret) + _T("\\");
return sFn;
} void CMFCApplication2Dlg::OnBnClickedMfcbutton1()
{
/*
// TODO: 在此添加控件通知处理程序代码
CDiaglogATest* pDlgATest = new CDiaglogATest;
pDlgATest->Create(IDD_DLOG_ATEST, NULL);
pDlgATest->ShowWindow(SW_SHOW);
//pDlgATest->UpdateWindow();
// 线程运行参数
// TODO: Add your command handler code here
*/
CString sFn = GetCurrentPath() + _T("1.txt"); // 线程参数定义和初始化
static struct myThreadParamExanple myParam = { false, NULL, ""};
memcpy(myParam.sFn, sFn, sFn.GetLength()); //strcpy(myParam.sFn, sFn);
struct myThreadParamExanple *pParam = &myParam; if (myParam.bRunningFlag)
{
MessageBox(_T("本操作上次运行尚未结束,您不能再次运行!"),
_T("提示"),
MB_ICONINFORMATION);
return;
}
else
{
// 无模式对话框创建
CDiaglogATest* pDlgATest = new CDiaglogATest(pParam->bRunningFlag, _T("进度111"));
pDlgATest->Create(IDD_DLOG_ATEST, NULL);
pDlgATest->ShowWindow(SW_SHOW);
// 线程运行参数
pParam->bRunningFlag = true; // 设置进程运行标志
pParam->hwnd = pDlgATest->GetSafeHwnd(); // 获取无模式对话框的句柄 // 开线程
pMyThread = AfxBeginThread((AFX_THREADPROC)MyThreadExample, pParam, THREAD_PRIORITY_NORMAL);
} }

该方法也能完美的实现非模态对话框更新进程控件的方法。!!!!
经过一天的折磨才总结了这些方法,欸,道路还好长啊。
MFC非模态添加进程控件方法二(自定义消息方法)的更多相关文章
- MFC非模态添加进程控件方法一(线程方法)
		
由于非模态对话框的自己没有消息循环,创建后无法进行消息处理.需要和父窗口共用消息循环.如果单独在子窗口进行控件由于自己没有单独的消息循环,更新是无法进行的. 如果在父窗口更新控件会造成程序假死.如以下 ...
 - 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 ...
 
随机推荐
- windows下安装jekyll
			
jekyll在其官方网站上说并不建议在windows操作系统安装,可是我们已经在windows环境下操作比较习惯了,而安装linux或mac的成本又比较高.因此,虽然在windows安装jekyll的 ...
 - cnpm install 之后 Angular2 Build --prod 报错
			
95% emittingUnhandled rejection Error: ENOENT: no such file or directory, open 'E:\git_0.28\adminTem ...
 - 转化ico标志
			
emmm,谨此纪念我这七秒钟的记忆. ico最简单的转化方法,上网搜索ico图标转换即可
 - Python函数(入门6)
			
转载请标明出处: http://www.cnblogs.com/why168888/p/6407970.html 本文出自:[Edwin博客园] Python函数 1. Python之调用函数 pri ...
 - Sql去重一些技巧
			
下午的时候遇到点问题,Sql去重,简单的去重可以用 DISTINCT 关键字去重,不过,很多情况下用这个解决不了问题.重复的数据千变万化,例如:类似于qq.微信的最近联系人功能,读取这些数据肯定要和消 ...
 - JavaScript的DOM_节点类型的扩展
			
DOM 自身存在很多类型,比如 Element 类型(元素节点)再比如 Text 类型(文本节点).DOM 还提供了一些扩展功能. 一.Node类型 Node 接口是 DOM1 级就定义了,Node ...
 - MATLAB入门学习(三)
			
我们再来看看矩阵常用的函数,除了上一篇提到的inv还有以下常见命令: det 计算方阵行列式 eig 计算特征值 trace 计算矩阵的迹 norm 计算矩阵的范数或模 orth 正交化 poly 求 ...
 - checkbox的readonly属性设置
			
方式一: checkbox没有readOnly属性,如果使用disabled=“disabled”属性的话,会让checkbox变成灰色的,用户很反感这种样式可以这样让它保持只读: 设置它的oncli ...
 - Yii 多表关联relations
			
1,首先多表关联是在models/xx.php的relations里配置的.而且是互配,但有区别.格式:'VarName'=>array('RelationType', 'ClassName', ...
 - BZOJ2160:拉拉队排练(Manacher)
			
Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训 ...