以下内容有大部分转载自CSDN,经过自己整理完成。

该文主要的方法为在非模态对话框中自定义一组消息函数,然后在主窗口中开辟一个线程通过线程把消息传递给子窗口进行更新。

在子窗口类中定义消息如下:

/*************************************************子窗口*******************************************************************************/

消息函数定义

  1. afx_msg LRESULT Customize(WPARAM wParam, LPARAM lParam);
  2. DECLARE_MESSAGE_MAP()

消息函数映射

  1. BEGIN_MESSAGE_MAP(CDiaglogATest, CDialogEx)
  2. ON_MESSAGE(WM_CUSTOMIZE, Customize) //自定义消息映射
  3. ON_BN_CLICKED(IDOK, &CDiaglogATest::OnBnClickedOk)
  4. END_MESSAGE_MAP()

消息函数实现

  1. LRESULT CDiaglogATest::Customize(WPARAM wParam, LPARAM lParam)
  2. {
  3. CString strTittle;
  4. if (wParam < )
  5. wParam = ;
  6. else if (wParam >= )
  7. {
  8. wParam = ;
  9. m_Progress1.ShowWindow(FALSE);
  10. UpdateWindow();
  11. }
  12.  
  13. strTittle.Format(_T("自定义消息参数:x=%d,y=%d"), wParam, lParam);
  14. m_Progress1.SetPos(wParam);
  15. SetWindowText(strTittle);
  16. UpdateData(TRUE);
  17. return ;
  18. }

在初始化窗口函数中初始进度条

  1. BOOL CDiaglogATest::OnInitDialog()
  2. {
  3. CDialogEx::OnInitDialog();
  4.  
  5. m_Progress1.SetRange(, );
  6. m_Progress1.SetStep();
  7. return TRUE; // return TRUE unless you set the focus to a control
  8. // 异常: OCX 属性页应返回 FALSE
  9. }

/*******************************************************父窗口主要是开线程,传消息**********************************************/

//以下线程代码主要实现传递按钮位置参数和,完成后的子窗口销毁消息

  1. struct myThreadParamExanple
  2. {
  3. bool bRunningFlag; // 线程运行标志变量
  4. HWND hwnd; // 线程关联的对话框窗口的句柄
  5. char sFn[_MAX_PATH]; // 文件名
  6. };
  7. //
  8. // 线程处理函数
  9. UINT MyThreadExample(LPVOID *pParam)
  10. {
  11. FILE *fp = fopen(((struct myThreadParamExanple*)pParam)->sFn, "wt");
  12. unsigned long iMaxCOunt = , g_nCount;
  13. int iPercent;
  14. CString msg;
  15. for (g_nCount = ; ((struct myThreadParamExanple*)pParam)->bRunningFlag && g_nCount <= iMaxCOunt; ::InterlockedIncrement((long*)&g_nCount))
  16. {
  17. fprintf(fp, "g_nCount=%d\n", g_nCount);
  18. Sleep();
  19. iPercent = g_nCount * / iMaxCOunt;
  20. ::PostMessage((HWND)((struct myThreadParamExanple*)pParam)->hwnd, WM_CUSTOMIZE, iPercent, );//iPercent传递位置参数
  21. }
  22. if (!((struct myThreadParamExanple*)pParam)->bRunningFlag)
  23. fprintf(fp, "\n线程被人为终止\n");
  24. else
  25. fprintf(fp, "\n线程自然结束\n");
  26. fclose(fp);
  27.  
  28. ((struct myThreadParamExanple*)pParam)->bRunningFlag = false;
  29. ::PostMessage((HWND)((struct myThreadParamExanple*)pParam)->hwnd, WM_DESTROY, , );//销毁子窗口
  30.  
  31. return ;
  32. }

//以下代码主要实现了子窗口的显示和线程的创建

  1. CString CMFCApplication2Dlg::GetCurrentPath()
  2. {
  3. TCHAR szFullPath[MAX_PATH];
  4. GetModuleFileName(NULL, szFullPath, MAX_PATH);
  5. CString sFn = szFullPath;
  6. int ret = sFn.ReverseFind(_T('\\'));
  7. sFn = sFn.Left(ret) + _T("\\");
  8. return sFn;
  9. }
  10.  
  11. void CMFCApplication2Dlg::OnBnClickedMfcbutton1()
  12. {
  13. /*
  14. // TODO: 在此添加控件通知处理程序代码
  15. CDiaglogATest* pDlgATest = new CDiaglogATest;
  16. pDlgATest->Create(IDD_DLOG_ATEST, NULL);
  17. pDlgATest->ShowWindow(SW_SHOW);
  18. //pDlgATest->UpdateWindow();
  19. // 线程运行参数
  20. // TODO: Add your command handler code here
  21. */
  22. CString sFn = GetCurrentPath() + _T("1.txt");
  23.  
  24. // 线程参数定义和初始化
  25. static struct myThreadParamExanple myParam = { false, NULL, ""};
  26. memcpy(myParam.sFn, sFn, sFn.GetLength()); //strcpy(myParam.sFn, sFn);
  27. struct myThreadParamExanple *pParam = &myParam;
  28.  
  29. if (myParam.bRunningFlag)
  30. {
  31. MessageBox(_T("本操作上次运行尚未结束,您不能再次运行!"),
  32. _T("提示"),
  33. MB_ICONINFORMATION);
  34. return;
  35. }
  36. else
  37. {
  38. // 无模式对话框创建
  39. CDiaglogATest* pDlgATest = new CDiaglogATest(pParam->bRunningFlag, _T("进度111"));
  40. pDlgATest->Create(IDD_DLOG_ATEST, NULL);
  41. pDlgATest->ShowWindow(SW_SHOW);
  42. // 线程运行参数
  43. pParam->bRunningFlag = true; // 设置进程运行标志
  44. pParam->hwnd = pDlgATest->GetSafeHwnd(); // 获取无模式对话框的句柄
  45.  
  46. // 开线程
  47. pMyThread = AfxBeginThread((AFX_THREADPROC)MyThreadExample, pParam, THREAD_PRIORITY_NORMAL);
  48. }
  49.  
  50. }

该方法也能完美的实现非模态对话框更新进程控件的方法。!!!!

经过一天的折磨才总结了这些方法,欸,道路还好长啊。

MFC非模态添加进程控件方法二(自定义消息方法)的更多相关文章

  1. MFC非模态添加进程控件方法一(线程方法)

    由于非模态对话框的自己没有消息循环,创建后无法进行消息处理.需要和父窗口共用消息循环.如果单独在子窗口进行控件由于自己没有单独的消息循环,更新是无法进行的. 如果在父窗口更新控件会造成程序假死.如以下 ...

  2. mfc非模态对话框

    按照我们的之前的做法,先新建工程. 把基本的内容都添加上. 形成这样一个样子: 并且进行试运行,让程序能够完成加法运算. 值的注意的是,静态文本那里要改一下名字,否则无法将成员变量进行添加. 前期准备 ...

  3. MFC非模态对话框中屏蔽ESC键

    个人的编程经验认为:对于非模态对话框,按下ESC键和点击红叉都会响应OnCancel()函数,而不会去响应OnClose()函数. 我们都知道,如果想屏蔽Enter键,只须重写OnOK()函数即可(重 ...

  4. MFC非模态对话框销毁

    非模态对话框需要重载OnCanel方法, 并调用DestroyWindow, 且不能调用基类的OnCanel重载PostNcDestroy, 需要delete掉this指针 // Overrides  ...

  5. VS2010 MFC中 单独添加ODBC数据库记录集类(CRecordset)方法

    基于VS2010 MFC的项目是之前建好的,后来需要添加数据库. 方法分享于此. 1.  打开自己的项目,项目->添加类. 2. 选MFC ODBC使用者,点右下角的添加. 3. 点数据源. / ...

  6. objectarx MFC 非模态对话框为当前焦点

    dialog.h afx_msg LRESULT OnAcadKeepFocus(WPARAM, LPARAM); dialog.cpp BEGIN_MESSAGE_MAP(CTextDialog, ...

  7. 十三、$.ajax、模态/非模态框、window.open()、href属性、submit()等提交请求优劣及问题解决方法

    1. $.ajax提交请求进行数据更新,并通过回调进行有效提示 function updateAudit(dispacher, control) { var currentpage = documen ...

  8. 控制非模态弹出框(showModelessDialog)唯一且随父页面关闭

    网站开发中,常常会遇到需要弹出窗体的情况,一般弹出框有模态和非模态两种,如下: 模态:window.showModalDialog() 非模态:window.showModelessDialog() ...

  9. 添加RichEdit控件后导致MFC对话框程序无法运行的解决方法

    新建一个基于对话框的MFC程序,对话框上添加了RichEdit控件,编译成功后无法运行起来,Debug版本与Release版本均不行! Windbg分析结果: WARNING: Stack unwin ...

随机推荐

  1. MySQL MHA搭建

    MHA算是业内比较成熟的MySQL高可用解决方案,在MySQL故障切换过程中,MHA能做到自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义 ...

  2. 安装和测试Kafka

    本文主要介绍如何在单节点上安装 Kafka 并测试 broker.producer 和 consumer 功能. 下载 进入下载页面:http://kafka.apache.org/downloads ...

  3. python 生成器&迭代器

    列表生成式 要生成[1x1, 2x2, 3x3, ..., 10x10]>>> [x * x for x in range(1, 11)]for循环后面还可以加上if判断>&g ...

  4. 第二次作业——MathExamLv2

    MathExamLv2--林志松 211406285 李明康 211606314 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际 ...

  5. 阅读SessionFactory源码

    一.阅读类注释 ①.SessionFactory的主要任务是创建Session的实例.通常一个应用程序只有一个单一的SessionFactory对象,而且线程从这个SessionFactory中获取S ...

  6. What is Systems Architecture ?

    What is Systems Architecture ?   Systems Architecture is a generic discipline to handle objects (exi ...

  7. Unix I/O--输入/输出(I/O) : 是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程

    输入/输出(I/O) : 是指主存和外部设备(如磁盘,终端,网络)之间拷贝数据过程 https://www.bbsmax.com/A/o75N88ZxzW/ 10.1 Unix I/O 一个Unix ...

  8. Unix shell输入输出重定向

    敲代码的时候,适当地打印出一些进度或者日志信息经常能帮助我们跟踪程序的执行结果.可是,这些结果或者日志打印信息到屏幕上并不能作为以后检查问题的根据.这就是重定向的作用,敲代码的时候,我们能够方便的将相 ...

  9. Git 初始化全局user.name 和 user.email

    git config --global user.name "username" git config --global user.email "email"

  10. 2019.1.9 Mac安装Iterm2 终端(oh my zsh的安装与配置)

    Mac安装Iterm2 终端(oh my zsh的安装与配置) 安装 curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tool ...