1. 程式人生 > >2步讓Win32應用程式/控制檯應用使用MFC類庫支援顯示對話方塊

2步讓Win32應用程式/控制檯應用使用MFC類庫支援顯示對話方塊

Win32應用程式/控制檯應用使用MFC類庫

第一步、以VS2013為例,新建3個工程,其中2個為控制檯工程,prj1(不勾選MFC)和prj2(勾選MFC),1個為基於對話方塊的MFC工程prj3



可以發現在所有工程的stdafx.h中發現關於支援MFC的宣告

(第1與2行虛線是prj1與prj2都有的,第2與3行虛線是prj2比prj1多的宣告,第3和4行虛線是prj3的宣告)

////////////////////////////////////////////////////////////////////////////////1

#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>

///////////////////////////////////////////////////////////////////////////////2

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 建構函式將是顯式的
#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS         // 移除對話方塊中的 MFC 控制元件支援

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            //  從 Windows 標頭檔案中排除極少使用的資訊
#endif

#include <afx.h>
#include <afxwin.h>         // MFC 核心元件和標準組件
#include <afxext.h>         // MFC 擴充套件
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>           // MFC 對 Internet Explorer 4 公共控制元件的支援
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>                     // MFC 對 Windows 公共控制元件的支援
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <iostream>

////////////////////////////////////////////////////////////////////////////////////////////////////////////3

#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // 從 Windows 頭中排除極少使用的資料
#endif
#include "targetver.h"

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 建構函式將是顯式的

// 關閉 MFC 對某些常見但經常可放心忽略的警告訊息的隱藏
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC 核心元件和標準組件
#include <afxext.h>         // MFC 擴充套件
#include <afxdisp.h>        // MFC 自動化類
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>           // MFC 對 Internet Explorer 4 公共控制元件的支援
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>             // MFC 對 Windows 公共控制元件的支援
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h>     // 功能區和控制元件條的 MFC 支援

//////////////////////////////////////////////////////////////////////////////////////////////////////////4

可以增加如下宣告

#ifndef VC_EXTRALEAN

#define VC_EXTRALEAN            //  從 Windows 標頭檔案中排除極少使用的資訊

#endif

#include <afx.h>

#include <afxwin.h>         // MFC 核心元件和標準組件

#include <afxext.h>         // MFC 擴充套件

#ifndef _AFX_NO_OLE_SUPPORT

#include <afxdtctl.h>           // MFC 對 Internet Explorer 4 公共控制元件的支援

#endif

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include <afxcmn.h>      // MFC 對 Windows 公共控制元件的支援

#endif // _AFX_NO_AFXCMN_SUPPORT

#include <afxcontrolbars.h>     // 功能區和控制元件條的 MFC 支援

第二步,更改編譯設定      

工程設定中,將MFC的使用由原來的“使用標準windows庫”改為“在共享DLL中使用MFC”
    說明:雖然我們可以建立MFC應用程式然後隱藏視窗來解決這個問題,但是這樣生成的EXE檔案的大小要比前面兩者都大,因為它載入了很多我們用不著的資源,從而造成了浪費。

話外篇:

如果只用到MFC的類的話,這就不用看了,如果比如支援了MFC類庫,想顯示對話方塊之類的,只做到上邊是不夠的。

最簡單的MFC工程應該是

#include <afxwin.h>   
class MyApp : public CWinApp   
{   
public:   
BOOL InitInstance()  //②程式入點   
{   
  CFrameWnd *Frame=new CFrameWnd();//構造框架   
  m_pMainWnd=Frame; //將m_pMainWnd設定為Frame;   
  Frame->Create(NULL,"最簡單的視窗");//建立框架   
  Frame->ShowWindow(SW_SHOW);  //顯示框架   
  return true;         //返回   
 }   
};   
MyApp theApp;  //①建立應用程式。

(摘自“追根究底,剖析MFC六大關鍵技術(第一部分)”http://blog.csdn.net/liyi268/article/details/297875)

對於VS2013新建控制檯工程需要

1、完成以上2步

2、報錯“無法解析的外部符號 _main,該符號在函式 ___tmainCRTStartup 中被引用”
這個問題表明你新建的是一個main型別函式(控制檯程式),而你的程式中有視窗程式,顯然是個win32函式,解決方法:
專案-屬性-連結器-系統-子系統-把控制檯該為windows