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 ...
随机推荐
- Linux 虚拟机虚拟网卡问题导致无法连接问题
问题描述 当 Linux 虚拟机启动时,通过串口输出或者启动日志, 观察到虚拟网卡启动或者初始化故障, 导致虚拟机无法连接. 问题分析 常见的超时报错范例如下: CentOS 复制 Bringing ...
- MySQL存储过程和临时表
MySQL创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...
- 【转】修复关于apache-xampp的问题:Port 443 in use by “vmware-hostd.exe”!
在电脑里装了VMware后,再要装xampp,十有八九就会出现这个问题: 11:23:37 [Apache] Problem detected! 11:23:37 [Apache] ...
- IntelliJ IDEA下"Cannot resolve symbol 'log'"的解决方法
转自:https://my.oschina.net/greatqing/blog/703989 最近接手了一个Maven项目,IDE使用的是IntelliJ IDEA,导入后可以编译运行.但是输出日志 ...
- Appium的安装-Mac平台(命令行 & dmg)
其实Appium的安装方式主要有两种: 1)自己安装配置nodejs的环境,然后通过npm进行appium的安装 2)直接下载官网提供的dmg进行安装,dmg里面已经有nodejs的环境和appium ...
- 不错的.net开源项目
Json.NET http://json.codeplex.com/ Json.Net是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Lin ...
- 勒让德定理---阶乘中素因子p的指数
- Could not publish to the server. null argument:
启动tomcat或clean tomcat报错:Could not publish to the server. null argument: Could not publish to the ser ...
- yaml 配置文件
https://www.cnblogs.com/xinjing-jingxin/p/9128293.html ---文件开始 - 列表 key: val 字典 注意:字典里面可以嵌套字典,列表等.(举 ...
- Redis数据类型(下)
集合Set Redis 的集合不是 个线性结构,而是一个哈希表结构,它的内部会根据 hash 分子来 存储和查找数据,理论上 个集合可以存储 232 (大约 42 亿)个元素,因为采用哈希表结 ...