zoukankan      html  css  js  c++  java
  • MFC的用户界面线程

    一.简单认识

    MFC中将线程分为用户界面线程和工作线程,两者最大的区别是前者是和界面相关联的,而后者是进行后台的一些操作.

    二.如何创建

    MFC中的线程大多继承自CWinThread,而相关联的界面可以继承自CFrameWnd,也可以继承自对话框之类的(感觉只要是界面类,就可以吧).

    它的创建过程大概是这样的:

    1.在主线程中建立用户界面线程,比如这里是CMyThread类型的.

    2.在CMyThread::InitInstance中去创建一个界面对象,比如这里是CMyWnd类型的.此时就相当于把用户界面和该线程进行了关联.

    3.在界面对象类中去实现你想要执行的操作,比如鼠标左键会弹出MessageBox之类的.

    三.举个例子

    假如你要完成这样的功能:

    在主窗口中点击鼠标左键,创建用户界面线程,然后在新的界面中点击鼠标左键弹出MessageBox.

    它的实现逻辑大致如下.

    四.关键代码

    这里是用对话框作为主窗口来实现的.

    //MyThread2.h
    
    #pragma once
    #include "afxwin.h"
    #include "MyWnd2.h"
    class CMyThread2 :
        public CWinThread
    {
    public:
        CMyThread2();
        ~CMyThread2();
    
        //重写父类的方法
        virtual BOOL InitInstance();
        virtual int ExitInstance();
    
    public:
        CMyWnd2 *m_pMyWnd;
    };
    //MyThread2.cpp
    #include "stdafx.h"
    #include "MyThread2.h"
    
    CMyThread2::CMyThread2()
    {
    }
    
    
    CMyThread2::~CMyThread2()
    {
        if (m_pMyWnd)
        {
            delete m_pMyWnd;
            m_pMyWnd = NULL;
        }
    }
    
    BOOL CMyThread2::InitInstance()
    {
        m_pMyWnd = new CMyWnd2();
        m_pMyWnd->Create(NULL, _T("用户界面线程"));
        m_pMyWnd->ShowWindow(SW_SHOW);
        m_pMyWnd->UpdateWindow();
        return TRUE;    //此处要返回TRUE,否则线程生成不了.why?(暂莫发散)
    }
    
    int CMyThread2::ExitInstance()
    {
        return 0;
    }
    //MyWnd2.h
    
    #pragma once
    #include "afxwin.h"
    class CMyWnd2 :
        public CFrameWnd
    {
    public:
        CMyWnd2();
        ~CMyWnd2();
    
        //重写父类的方法
        afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
        DECLARE_MESSAGE_MAP()  //这里需要此声明,否则BEGIN_MESSAGE_MAP那里会报错.
    };
    //MyWnd2.cpp
    
    #include "stdafx.h"
    #include "MyWnd2.h"
    
    
    CMyWnd2::CMyWnd2()
    {
    }
    
    
    CMyWnd2::~CMyWnd2()
    {
    }
    
    BEGIN_MESSAGE_MAP(CMyWnd2, CWnd)
        ON_WM_LBUTTONDOWN()    //如果要用到这个响应,就需要在这里声明.
    END_MESSAGE_MAP()
    
    void CMyWnd2::OnLButtonDown(UINT nFlags, CPoint point)
    {
        MessageBox(_T("终于等到你了"), _T("你好啊"), MB_OK);
        CWnd::OnLButtonDown(nFlags, point);
    }
    //UserInterfaceThreadDlg.cpp(主窗口)中的关键代码
    
    void CUserInterfaceThreadDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
        //AfxBeginThread(RUNTIME_CLASS(CMyThread2));//使用这种方法会报内存不足的错误.
        CMyThread2 *myThread = new CMyThread2();    //?? 在这里new,在哪里去释放呢?
        myThread->CreateThread();
        CWnd::OnLButtonDown(nFlags, point);    //记得要把父类的方法在最后写上
    }

    本文参考文章:https://www.cnblogs.com/lidabo/p/3489639.html

    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    Java 8 对 List<List<String>> 排序
    获取自然月的起始日期和终止日期
    Java 中如何计算两个字符串时间之间的时间差?(单位为分钟)
    Java StringJoiner
    回文数
    Java 中的值传递和引用传递问题
    substring
    集合的四种遍历方式
    Java 中的静态嵌套类和非静态嵌套类
    使用 Java 查找字符串中出现次数最多的字符以及出现的次数?
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/12619843.html
Copyright © 2011-2022 走看看