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 ...
随机推荐
- git internal for computer scientists
http://eagain.net/articles/git-for-computer-scientists/ git object storage仅仅是一个DAG of objects, 有几种类型 ...
- MapReduce优化参数
资源相关参数 //以下参数是在用户自己的 MapReduce 应用程序中配置就可以生效 (1) mapreduce.map.memory.mb: 一个 Map Task 可使用的内存上限(单位:MB) ...
- shell语句
一.判断目录是否存在:#!/bin/bash#/bin/bash -n filename.sh 判断语句是否正确 DIR=/root/zhjif [ ! -d $DIR ];then mkdir $D ...
- QT样式
最近在写QT的UI 分享一个助手网页 http://doc.qt.io/qt-4.8/stylesheet-examples.html
- ZT-Android深入浅出之Binder机 制
转贴 不是原创! Android深入浅出之Binder机 制 一说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交 ...
- Maven高级应用--编译全模块包-dist包
1. 在需要生成dist包的模块级别,新建文件夹xxx-xxxx-dist 2. 进入目录,新建pom.xml,建议copy 3. dependencies节点,把要编译成全局包的应用引入进来 < ...
- tcp长连接分包方法
tcp长连接分包的四种方法1.消息长度固定2.使用特殊的字符串作为消息边界.比如http协议的headers以“\r\n”为字段的分隔符3.在每条消息的头部加一个长度字段.这是最常见的4.利用消息本身 ...
- (转)tcp的半连接与完全连接队列
队列及参数 tcp-sync-queue-and-accept-queue-small.jpg server端的半连接队列(syn队列) 在三次握手协议中,服务器维护一个半连接队列,该队列为每个客 ...
- aop的概念以及 cglib-nodep-2.1_3.jar第三方jia包动态代理使用
引入 cglib-nodep-2.1_3.ja包 cglib产生的代理类是目标类的子类 定义接口,让切面都继承它,方便加入到动态代理方法 的那个类中使用 在SalaryInterceptor类中使用 ...
- swift的clourse:字面量化的函数、将函数字面量化-与函数的类型签名相同
1.clourse的签名与函数的签名相同: 所以两者可以相互赋值: 2.可以将函数(表达式)字面量化: 因为可以字面量化,所以和其它的值(变量)没有任何区别,可以存在变量存在的任何地方: 3.clou ...