MFC总结(13) -- 在mfc中使用线程 更新Progress Control(2)
来源:互联网 发布:电脑看书软件阅读器 编辑:程序博客网 时间:2024/05/02 00:03
我们在 <MFG总结(12) -- 在mfc中使用线程 更新Progress Control(1)> 中已经实现了线程的使用,但是在我后面的项目中,发现这样 在 第8步骤中的 Cmfc线程Dlg* hh = (Cmfc线程Dlg*)AfxGetApp()->m_pMainWnd; 出现了问题。所以有了下面的一种操作。
我们只需要将原来的代码上进行更改即可。
1、将线程方法放置到类中,不过需要使用static进行修饰。我们在线程方法中需要调用类的成员函数updatePro,所以我们需要定义一个类的静态指针。
上完整代码
// mfc线程Dlg.h : 头文件//#pragma once#include "afxcmn.h"// Cmfc线程Dlg 对话框class Cmfc线程Dlg : public CDialogEx{// 构造public:Cmfc线程Dlg(CWnd* pParent = NULL);// 标准构造函数// 对话框数据enum { IDD = IDD_MFC_DIALOG };protected:virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持// 实现protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()public:CProgressCtrl m_threadProgressCtrl;afx_msg void OnBnClickedButton1();afx_msg void OnTimer(UINT_PTR nIDEvent);<span style="white-space:pre"></span><pre name="code" class="html" style="line-height: 18px;"><span style="white-space:pre"></span>//线程指针CWinThread *m_pThread;
<span style="font-family: Consolas, 'Courier New', Courier, mono, serif;"></span><span style="font-family: Consolas, 'Courier New', Courier, mono, serif;">//更新界面</span>void updatePro(DWORDLONG size);//成员线程函数声明static UINT ThreadFunc(LPVOID pParam);//类静态指针static Cmfc线程Dlg * m_this;};
2、在cpp文件中对 m_this进行声明,并在构造器中将this指针赋值给m_this指针
上完整代码
// mfc线程Dlg.cpp : 实现文件//#include "stdafx.h"#include "mfc线程.h"#include "mfc线程Dlg.h"#include "afxdialogex.h"#ifdef _DEBUG#define new DEBUG_NEW#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// Cmfc线程Dlg 对话框Cmfc线程Dlg * Cmfc线程Dlg::m_this = nullptr;Cmfc线程Dlg::Cmfc线程Dlg(CWnd* pParent /*=NULL*/): CDialogEx(Cmfc线程Dlg::IDD, pParent){m_this = this;m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void Cmfc线程Dlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_THRED_PROGRESS, m_threadProgressCtrl);}BEGIN_MESSAGE_MAP(Cmfc线程Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER()END_MESSAGE_MAP()// Cmfc线程Dlg 消息处理程序BOOL Cmfc线程Dlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码//添加定时器SetTimer(1, 200, NULL);//设置Progress Control//范围m_threadProgressCtrl.SetRange(0, 200);//开始位置m_threadProgressCtrl.SetPos(0);return TRUE; // 除非将焦点设置到控件,否则返回 TRUE}void Cmfc线程Dlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,// 这将由框架自动完成。void Cmfc线程Dlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。HCURSOR Cmfc线程Dlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void Cmfc线程Dlg::updatePro(DWORDLONG size){//线程函数实现CString str;m_threadProgressCtrl.SetPos(size);str.Format(L"%d", size);//给Static Text设置文本内容GetDlgItem(IDC_SHOETEXTSTATIC)->SetWindowText(str);Sleep(500);}UINT Cmfc线程Dlg::ThreadFunc(LPVOID pParam){DWORDLONG size = (DWORDLONG)pParam;//Cmfc线程Dlg* hh = (Cmfc线程Dlg*)AfxGetApp()->m_pMainWnd;m_this->updatePro(size);return 0;}void Cmfc线程Dlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值//一个随机数字DWORDLONG tim = rand() % 200;//启动线程m_pThread = AfxBeginThread(ThreadFunc, (LPVOID)tim); //销毁线程m_pThread->ResumeThread();CDialogEx::OnTimer(nIDEvent);}
0 0
- MFC总结(13) -- 在mfc中使用线程 更新Progress Control(2)
- MFC总结(12) -- 在mfc中使用线程 更新Progress Control(1)
- MFC-进度条Progress Control
- MFC中在线程函数中如何更新CLIST CONTROL中的值呢?求大佬解答
- 在MFC中使用Tab Control
- 在MFC中使用Tab Control
- 在MFC中使用Tab Control
- 在MFC中使用Tab Control
- 在MFC中使用Tab Control
- 在MFC中使用Tab Control
- MFC控件小记-Progress Control
- MFC控件(13):Progress Control与Slider Control
- MFC中使用Tab Control
- 在MFC中使用Tab Control的源代码
- 在MFC中使用Tab Control的方法
- 在MFC中的picture control 中使用opengl作图
- MFC 在线程中通过PostMessage更新界面主线程
- MFC中Spin Control控件使用,同时数据在Edit Control中显示
- 链表自定义队列
- hdu5527Too Rich
- 懒加载
- c#写事物
- javaScript细节之生成不重复的随机数
- MFC总结(13) -- 在mfc中使用线程 更新Progress Control(2)
- 天猫春晚:罅隙密布的消费主义神话
- jquery 选同名input值
- 基于深度学习的人脸识别项目已经接近尾声了
- IONIC 移到开发本地相册图片转换成base64
- python网络编程(TCP客户端/服务器端实现)
- 最简单的条形码生成
- 网页中导入特殊字体@font-face属性详解
- Android listview下拉刷新的实现原理及代码--Android事件传递原理的实践