以下内容有大部分转载自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非模态添加进程控件方法二(自定义消息方法)的更多相关文章

  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. linux 下apche无法监听端口解决办法(Permission denied: make_sock: could not bind to address)

    想建立一个测试用的虚拟主机,遇到了这个问题:[root@localhost html]# service httpd startStarting httpd: httpd: Could not rel ...

  2. Java 基本IO操作

    1.基本IO操作     有时候我们编写的程序除了自身会定义一些数据信息外,还需要引用外界的数据,或是将自身的数据发送到外界,这时我们需要使用输入与输出. 1)输入与输出       输入:是一个从外 ...

  3. php简单的数组递归

    参照 http://www.oschina.net/code/snippet_105637_11401  的例子   $arr = array('aa' =>  array('bb' => ...

  4. unity3d中设计模式的学习<一>:泛型单例

    单例是游戏开发中比较常见的设计模式,虽然针对的功能不同,但是有一些功能还是共有的,代码也不少,如果能放在一个基类里面是最好不过了,但是单例里需要有个instance功能来返回当前对象,所以这个功能必须 ...

  5. c++中左值的含义

    <<cpp primer plus 6th edition>>中的原文(Chapter 8 Adventures in Functions): What is an lvalu ...

  6. SVG基本图形

    SVG 是使用 XML 来描述二维图形和绘图程序的语言 SVG 指可伸缩矢量图形 (Scalable Vector Graphics) SVG 用来定义用于网络的基于矢量的图形 SVG 使用 XML ...

  7. SpringMVC错误小结

    No mapping found for HTTP request with URI [/SpringMVC/user.do] in DispatcherServlet with name 'spri ...

  8. UVa 10375 - Choose and divide(唯一分解定理)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. UVa 10003 - Cutting Sticks(区间DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  10. yii2.0 在save保存之前的操作(放在模型model文件内)

    public function beforeSave($insert){ if(parent::beforeSave($insert)) { if($insert) { } else { } retu ...