zoukankan      html  css  js  c++  java
  • MFC的运行及消息机制(一):从一个空项目开始编写MFC程序

    对比传统的Win32 API编程,MFC封装了很多东西;而AppWizard的使用,更是隐藏了很多过程。这样使得我们对MFC程序的运行的过程顺序、关系、细节把握不清,难以进行高质量的程序编写。

    要想较好的把握MFC,主要的问题有三个方面:

    1.对Win32 API编程及Windows平台的基本机制有一定认识(消息队列和消息分类)

    2.对程序的编译、链接、装载、库等方面有一定认识

    3.对C++的面向对象思想有一定认识(继承和多态、构造函数、this指针等)

    在此基础上,全面地了解MFC的运行及消息机制。


    本篇从一个空项目开始,不借助AppWizard,如同在控制台环境下那样手写全部源码,利用MFC编写一个简单的Hello World窗口程序.

    一 开发环境

    VS2010集成开发环境

    二 过程

    1.从Visual C++中选择添加一个空项目

    2.在项目属性-》配置属性-》常规-》项目默认值-》MFC的使用一栏中,选择使用“在共享DLL中使用MFC”(默认是使用标准Windows库)

    3.在项目分别建立2个.h头文件和.cpp文件,命名为stdafx.h、main.h和stdafx.cpp、main.cpp. 其中,stdafx.h/cpp主要是为了使用预编

    译头功能.为此,需要在项目属性中选择使用预编译头(/Yu); 同时,单独对stdafx.cpp文件的属性进行配置,选择创建预编译头(/Yc). 否则

    预编译头功能无法使用.

    三 详细

    stdafx.h

    #ifndef _QINAFX_H
    
    #define _QINAFX_H
    
    //1.首先包含的是afxwin.h,而在afxwin.h中第一个就包含了afx.h.
    
    //2.在afx.h中又包含了afxver_.h,之后就根据编译参数引入导入库:
    
    // Win32 libraries
    
    //
    
    //#ifndef _AFXDLL
    
    //	#ifndef _UNICODE
    
    //		#ifdef _DEBUG
    
    //			#pragma comment(lib, "nafxcwd.lib")
    
    //		#else
    
    //			#pragma comment(lib, "nafxcw.lib")
    
    //		#endif
    
    //	#else
    
    //		#ifdef _DEBUG
    
    //			#pragma comment(lib, "uafxcwd.lib")
    
    //		#else
    
    //			#pragma comment(lib, "uafxcw.lib")
    
    //		#endif
    
    //	#endif
    
    //#else
    
    //	#ifndef _UNICODE
    
    //		#ifdef _DEBUG
    
    //			#pragma comment(lib, "mfc" _MFC_FILENAME_VER "d.lib")
    
    //			#pragma comment(lib, "mfcs" _MFC_FILENAME_VER "d.lib")
    
    //		#else
    
    //			#pragma comment(lib, "mfc" _MFC_FILENAME_VER ".lib")
    
    //			#pragma comment(lib, "mfcs" _MFC_FILENAME_VER ".lib")
    
    //		#endif
    
    //	#else
    
    //		#ifdef _DEBUG
    
    //			#pragma comment(lib, "mfc" _MFC_FILENAME_VER "ud.lib")
    
    //			#pragma comment(lib, "mfcs" _MFC_FILENAME_VER "ud.lib")
    
    //		#else
    
    //			#pragma comment(lib, "mfc" _MFC_FILENAME_VER "u.lib")
    
    //			#pragma comment(lib, "mfcs" _MFC_FILENAME_VER "u.lib")
    
    //		#endif
    
    //	#endif
    
    //#endif
    
    //
    
    //#ifdef _DLL
    
    //	#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
    
    //		#pragma comment(lib, "msvcrtd.lib")
    
    //	#else
    
    //		#pragma comment(lib, "msvcrt.lib")
    
    //	#endif
    
    //#else
    
    //	#if !defined(_AFX_NO_DEBUG_CRT) && defined(_DEBUG)
    
    //		#pragma comment(lib, "libcmtd.lib")
    
    //	#else
    
    //		#pragma comment(lib, "libcmt.lib")
    
    //	#endif
    
    //#endif
    
    //  #pragma comment(lib, "kernel32.lib")
    
    //  #pragma comment(lib, "user32.lib")
    
    //  #pragma comment(lib, "gdi32.lib")
    
    //  #pragma comment(lib, "msimg32.lib")
    
    //  #pragma comment(lib, "comdlg32.lib")
    
    //  #pragma comment(lib, "winspool.lib")
    
    //  #pragma comment(lib, "advapi32.lib")
    
    //  #pragma comment(lib, "shell32.lib")
    
    //  #pragma comment(lib, "comctl32.lib")
    
    //  #pragma comment(lib, "shlwapi.lib")
    
    // 接着,添加了CObject、CRuntimeClass、CException、CFile等几个关键类的前向声明.
    
    //3.在afxver_.h中,又包含了afxv_w32.h
    
    //4.在afxv_w32.h中,包含了windows.h
    
    #include<afxwin.h>
    
    #endif

    main.h

    #ifndef _QININSIDE_H
    
    #define _QININSIDE_H
    
    class CMFCApp:public CWinApp
    
    {
    
    public:
    
    	virtual BOOL InitInstance();
    
    };
    
    class CMFCFrmWnd:public CFrameWnd
    
    {
    
    public:
    
    	CMFCFrmWnd();
    
    protected:
    
    	afx_msg void OnLButtonDblClk(UINT uFlag, CPoint pt);
    
    	afx_msg void OnPaint();
    
    	DECLARE_MESSAGE_MAP()
    
    };
    
    #endif

    stdafx.cpp

    #include"stdafx.h"

    main.cpp

    #include"stdafx.h"
    
    #include"main.h"
    
    BEGIN_MESSAGE_MAP(CMFCFrmWnd,CFrameWnd)
    
    	ON_WM_LBUTTONDBLCLK()
    
    	ON_WM_PAINT()
    
    END_MESSAGE_MAP()
    
    BOOL CMFCApp::InitInstance()
    
    {
    
    	m_pMainWnd = new CMFCFrmWnd();
    
    	m_pMainWnd->ShowWindow(m_nCmdShow);
    
    	m_pMainWnd->UpdateWindow();
    
    	return true;
    
    }
    
    CMFCFrmWnd::CMFCFrmWnd()
    
    {
    
    	Create(NULL,_T("InsideMFC"));
    
    }
    
    void CMFCFrmWnd::OnLButtonDblClk(UINT uFlag, CPoint pt)
    
    {
    
    	MessageBox(_T("HELLO WORLD!"),NULL,MB_OK);
    
    }
    
    void CMFCFrmWnd::OnPaint()
    
    {
    
    	CPaintDC dc(this);
    
    	dc.TextOut(0,0,_T("HELLO WORLD!"));
    
    }
    
    CMFCApp theApp;

    四 效果图

    效果图

  • 相关阅读:
    ExcelHelper
    c# 文件的读写
    Wav文件操作类
    c# & (与) 、^ (异或)和 >>(<<位移运算)
    c# 高精度的timer
    c# 生成txt文件,写入内容
    C# 对 list<T>中的数据按某字段的大小进行排序
    OC 底层探索 06、 isa 2个经典问题分析
    OC 底层探索 05、属性、成员、实例变量简析
    数据结构与算法 0、 汇总简介
  • 原文地址:https://www.cnblogs.com/qinfengxiaoyue/p/2916116.html
Copyright © 2011-2022 走看看