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 ...
随机推荐
- Stack vs Heap
http://gribblelab.org/CBootcamp/7_Memory_Stack_vs_Heap.html Table of Contents Stack vs Heap The Stac ...
- JAVA环境变量安装
需配置的系统环境变量参数: JAVA_HOME:C:\Program Files\Java\jdk1.8.0_60 CLASS_PATH: ;%JAVA_HOME%\lib;%JAVA_HOME%\l ...
- LUHN算法
LUHN算法,主要用来计算信用卡等证件号码的合法性. 1.从卡号最后一位数字开始,偶数位乘以2,如果乘以2的结果是两位数,将两个位上数字相加保存. 2.把所有数字相加,得到总和. 3.如果信用卡号码是 ...
- 如何深入理解一套MQ消息中间件
怎样算是理解了一套MQ中间件呢?原来一知半解的我列了几个维度:demo跑起来,理解其投递次数的语义,理解其事务的特性等等.这是一种角度,但总有种看山不是山的一知半解的感觉.再问一层,比如为什么Kafk ...
- ubuntu 摄像头软件
sudo apt-get install cheese
- API 网关
使用 API 网关 链接:https://github.com/oopsguy/microservices-from-design-to-deployment-chinese译者:Oopsguy ...
- C#图解教程读书笔记(第8章 表达式和运算符)
表达式 字面量 整数字面量 字符字面量 字符串字面量 求值顺序 优先级 结合性 与C和C++不同,在C#中的数字不具有布尔意义. 各种运算符的作用(过) 用户定义类型转换 class XiXiInt ...
- c++11 多线程新特性学习 (1) 管理线程
1.基础介绍 c++11中,线程是通过std::thread对象来开始的,用法为 #include<thread> //必须包含的头文件 void do_work(){ std::cout ...
- Gradle入门实战(Windows版)
Installation Gradle runs on all major operating systems and requires only a Java JDK or JRE version ...
- Python机器学习神器:sklearn&numpy
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDE0MDMzOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...