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