• C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理


    一、MFC概念和作用

    1、全称Microsoft Foundation Class Library,我们称为微软基础类库,封闭了绝大部分的win32 Api函数,C++语法中的数据结构,程序的运行流程
    MFC就是一个库(动态库,静态库)
    MFC还是一个程序框架
    2、为什么使用MFC
    基于框架编程。提高工作效率,降低开发周期,节约开发成本。
    二、几个重要的头文件
    afx.h    -绝大部分类的声明头文件
    afxwin.h -包括了afx.h和windows.h
    afxext.h -提供了扩展窗体类的支持(工具栏,状态栏等)
    三、使用MFC
    1、使用MFC库做自己的控制台程序
    入口函数 _tmain()不同于以往的main()
    CWinApp theApp;-全局程序对象。


    注意:
    ::函数名()-为win32的API函数。


    以Afx开头的函数,为MFC库里的全局函数。


    2、使用MFC库做自己的库程序(MFC AppWizard dll)
    规则动态库:能够被不论什么程序调用
    扩展动态库:仅仅能被支持MFC的程序调用
    3、MFC窗体程序
    单文档视图构架程序。
    CFrameWnd-框架窗体类;
    CWinApp-应用程序类,负责管理整个程序的运行流程;
    CDocument-文档类,负责管理数据(数据的提取、转换、存储等操作);
    CView-视图窗体类,负责显示数据
    多文档视图构架程序。
    CMDIChildWnd-子框架窗体类,负责管理子框架窗体。


    CMDIFrameWnd-主框架窗体类
    CWinApp-应用程序类,负责管理整个程序的运行流程;
    CDocument-文档类,负责管理数据(数据的提取、转换、存储等操作);
    CView-视图窗体类,负责显示数据
    对话框程序
    CWinApp-应用程序类,负责管理整个程序的运行流程;
    CDialog-对话框类
    四、MFC类的介绍
    CObject -mfc库绝大部分类的基类,封装了MFC库中最主要的一些机制,执行时类信息机制/动态创建机制/序列化机制.
    CCmdTarget-消息映射机制基类
    CWinThread/CWinApp-应用程序类
    CDocTemplate及其子类 -文档模版类
    CDocument及其子类-文档类,封装了对各种数据的操作。
    Exceptions - 异常类,封装了MFC中的各种异常情况。
    CFile-文操作类
    CWnd  -全部窗体类基类
    FrameWindows  框架窗体类,封装了对各种框架窗体的操作
    ControlBars-各种工具栏类,封闭了对各种工具栏的操作
    Dialog Boxes 对话框类。
    Views 视图窗体类
    Controls 控件类
    CDC/CGdiObject 封装了画图操作
    CArray/AList/CMap  对C++中的数据的封装,以C开头。


    机制1:MFC入口函数机制

    如今学习时。MFC都是建立Win32 Application程序。然后通过下列步骤改为MFC程序,仅仅有一步步了解怎么去手动创建MFC,以后通过MFC向导自己主动生成的大量MFC代码我们才干看得懂。


    1、删除主程序cpp中的入口函数
    2、将stdafx.h中的windows.h改为afxwin.h
    3、project-设置 中选择使用MFC库
    4、自己定义框架类和程序类,继承自MFC类,并重写CWinApp的InitInstance方法:
    class CMyFrameWnd:public CFrameWnd
    {
    };
    class CMyWinApp:public CWinApp
    {
    public:
    CMyWinApp();
    virtual BOOL InitInstance();
    };
    CMyWinApp::CMyWinApp()
    {
    }
    BOOL CMyWinApp::InitInstance()
    {
    CMyFrameWnd *pFrame=new CMyFrameWnd;
    pFrame->Create(NULL,"MFC base");
    m_pMainWnd=pFrame;
    pFrame->ShowWindow(SW_SHOW);
    pFrame->UpdateWindow();
    return true;
    }
    5、创建一个程序类对象(触发点):
    CMyWinApp theApp;


    AFX_MODULE_STATE* pModuleState = AfxGetModuleState();//获取当前程序模块状态信息
    AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;//获取当前线程状态信息
    pThreadState->m_pCurrentWinThread = this;//theapp全局对象信息赋值
    pModuleState->m_pCurrentWinApp = this;
    ASSERT(bool表达式);//假设表达式不成立,则弹出错误,不往下运行
    全局函数:AfxGetApp(),AfxGetThread() 获取theApp地址
    AfxMessageBox();//弹出消息
    vc6中。查看-调试窗体-call stack 能够看到被谁调用
    可重写(前加virtual):
    BOOL CMyWinApp::InitApplication();
    BOOL CMyWinApp::InitInstance()//初始化
    int  CMyWinApp::Run()//执行
    BOOL CMyWinApp::OnIdle(LONG lcount);//空暇时处理
    int CMyWinApp::ExitInstance();

    演示样例代码:

    // MFCbase.cpp : Defines the entry point for the application.
    //
    
    #include "stdafx.h"
    class CMyFrameWnd:public CFrameWnd
    {
    
    };
    class CMyWinApp:public CWinApp
    {
    public:
    
    	CMyWinApp();
    	virtual BOOL InitInstance();
    	virtual int Run();
    };
    CMyWinApp::CMyWinApp()
    {
    
    }
    BOOL CMyWinApp::InitInstance()
    {
    	CMyFrameWnd *pFrame=new CMyFrameWnd;
    	pFrame->Create(NULL,"MFC base");
    	m_pMainWnd=pFrame;
    	pFrame->ShowWindow(SW_SHOW);
    	pFrame->UpdateWindow();
    	return true;
    }
    int CMyWinApp::Run()
    {
    	AfxMessageBox("run");
    	return CWinApp::Run();
    }
    CMyWinApp theApp;//创建一个程序对象
    



    机制2:MFC窗体创建机制:

    AfxGetInstanceHandle();//全局句柄
    1、载入菜单
    2、调用CreateEx 设计、注冊窗体类
    PreCreateWindow():
    WNDCLASS   wndcls;wndcls.lpfWinProc=DefWindowProc;
    AfxRegisterWithIcon(),AfxRegisterClass()
    ::RegisterClass注冊一个局部窗体类。类名“AfxFrameOrView42sd”,默认处理函数。
    AfxHookWindowCreate(pFrame) 埋下勾子
    CHandleMap* pMap = afxMapHWND(TRUE);
    AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();//映射对象保存到全局变量
    pState->m_pmapHWND = new CHandleMap(...);
    pMap->SetPermanent(m_hWnd = hWndNew, this);
        //pFrame->m_hWnd 为窗体句柄。


    CWnd* pWnd=CWnd::FromHandlePermanent(hWnd);
    //pState->m_pmapHWND->LookupPermanent(HANDLE h)成员,可通过窗体句柄获取pFrame
    ::CreateWindowEx函数,创建窗体
    3、钩子处理函数
    将框架对象地址和窗体句柄建立一一相应关系。


    利用::SetWindowLong,将窗体处理函数更改为AfxWndProc.


    ----------MSDN Library Visual Studio 6.0
    //埋下勾子
    HHOOK SetWindowsHookEx(
      int idHook,        // 勾子类型
      HOOKPROC lpfn,     // 处理函数(不同类型不同)
      HINSTANCE hMod,    // 进程句柄,NULL时不限制范围
      DWORD dwThreadId   // 线程ID
    );
    //勾子类型为WH_CBT时的处理函数
    LRESULT CALLBACK CBTProc(
      int nCode,      // hook code
      WPARAM wParam,  // 创建好的窗体句柄
      LPARAM lParam   // depends on hook code
    );
    //勾子处理函数改动默认处理函数
    WNDPROC afxWndProc = AfxGetAfxWndProc();
    oldWndProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC,(DWORD)afxWndProc);
    //改动窗体处理函数
    LONG SetWindowLong(
      HWND hWnd,       // 窗体句柄
      int nIndex,      // 传入:GWL_WNDPROC
      LONG dwNewLong   // 窗体处理函数地址
    );
    //全局变量信息
    _AFX_THREAD_STATE* pThreadState=_afxThreadState.GetDate();
    ::GetCurrentThreadId();//获取当前线程ID
    pThreadState->m_pWndInit = pWnd;//赋值到全局变量


    ::CreateWindowEx() //此函数处理完后直接进入勾子处理函数


    重写消息处理函数
    LRESULT CMyFrameWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch(message)
    {
    case WM_CREATE:
    AfxMessageBox("WM_CREATE");
    break;
    }
    return CFrameWnd::WindowProc(message,wParam,lParam);

    }

    演示样例:

    // MFCcreate2.cpp : Defines the entry point for the application.
    #include "stdafx.h"
    
    class CMyFrameWnd:public CFrameWnd
    {
    public:
    	virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
    };
    LRESULT CMyFrameWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    	switch(message)
    	{
    	case WM_CREATE:
    		AfxMessageBox("WM_CREATE");
    		break;
    	case WM_PAINT:
    		{
    			PAINTSTRUCT ps={0};
    			HDC hdc=::BeginPaint(this->m_hWnd,&ps);
    			::TextOut(hdc,100,100,"hello",5);
    			::EndPaint(this->m_hWnd,&ps);
    		}
    		break;
    	case WM_MOUSEMOVE:
    		{
    			//g_xpos=LOWORD(lParam);
    			//g_ypos=HIWORD(lParam);
    			::InvalidateRect(this->m_hWnd,NULL,true);
    		}
    		break;
    	}
    	return CFrameWnd::WindowProc(message,wParam,lParam);
    }
    class CMyWinApp:public CWinApp
    {
    public:
    	virtual BOOL InitInstance();
    };
    BOOL CMyWinApp::InitInstance()
    {
    	CMyFrameWnd *pFrame=new CMyFrameWnd;
    	pFrame->Create(NULL,"MFCcreate");
    	m_pMainWnd=pFrame;
    	pFrame->ShowWindow(SW_SHOW);
    	pFrame->UpdateWindow();
    	return TRUE;
    	//return CWinApp::InitInstance();
    }
    CMyWinApp theApp;
    
    





  • 相关阅读:
    不要随便用#define 沉沉_
    转载堆和栈的区别 沉沉_
    转载include包含源文件引发的错误 沉沉_
    浅议C和C++中的内存分配 沉沉_
    volatile 的应用 沉沉_
    Debian显示txt乱码
    Debian 64位安装wink
    Debian安装vmware虚拟机
    Debian安装scim中文、日语输入法
    Debian安装chrome
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5237644.html
Copyright © 2020-2023  润新知