深入淺出MFC筆記1-Win32和MFC程式對比
//////////////////////////////////////////////////// //test1.cpp //編譯:cl /EHsc test1.cpp user32.lib #include <windows.h> CHAR g_appName[] = "TestWin32"; //訊息處理函式 LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam); //錯誤輸出函式 void ErrorOutput(); //主入口函式 int WinMain(HINSTANCE hInst,HINSTANCE hPreInst,LPSTR lpCmd,int iCmdShow) { //定義窗體類,最主要的是定義了窗體類的訊息處理函式入口 WNDCLASS wc; wc.style = CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = WndProc;//指定訊息處理函式入口 wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInst; wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND; wc.lpszMenuName = NULL; wc.lpszClassName = g_appName; //在登錄檔中註冊上面定義的窗體類 if(!RegisterClass(&wc))//user32.lib { ErrorOutput(); return -1; } //利用前面定義的窗體類來建立窗體物件 HWND hWnd = CreateWindow(g_appName,"Test",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,hInst,NULL); if(hWnd == NULL) { ErrorOutput(); return -1; } //顯示窗體物件 ShowWindow(hWnd,iCmdShow); UpdateWindow(hWnd); MSG msg; //開始訊息處理迴圈 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam) { switch(nMsg) { //關閉視窗時要傳送WM_QUIT,否則不能結束程序 case WM_DESTROY: PostQuitMessage(0); return 0; } //使用預設的訊息處理函式 return DefWindowProc(hWnd,nMsg,wParam,lParam); } void ErrorOutput() { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), 0, // Default language (LPTSTR) &lpMsgBuf, 0, NULL); MessageBox(NULL,(LPCTSTR)lpMsgBuf,"Error",MB_OK); LocalFree(lpMsgBuf); } ////////////////////////////////////////////////////
上面的程式要點可以規納如下:
1、設定窗體類的各個屬性並註冊此窗體類。
2、定義窗體類的訊息處理函式。
3、根據註冊的窗體類來建立應用程式的窗體。
4、顯示註冊的窗體並開始訊息迴圈。
因為MFC對上面的過程進行了封裝,所以在MFC程式中,上面大部分的過程我們是看不見的。但為了能隨心所欲的使用MFC(或許更大程度上是滿足我們的好奇心(∩_∩)),我們就需要弄清楚MFC程式和上面的程式中各個過程的對應關係。
下面我們在來看一個使用MFC的封裝庫完成的簡單的窗體程式。
/////////////////////////////////////////////////// //file:test2.cpp //編譯:cl /c /EHsc test2.cpp //連線:link /SUBSYSTEM:WINDOWS test2.obj #include <afxwin.h> class MyApp : public CWinApp { public: virtual BOOL InitInstance(); }; class MyFrame : public CFrameWnd { public: MyFrame(); }; MyFrame::MyFrame() { Create(0,_T("My App")); } BOOL MyApp::InitInstance() { m_pMainWnd = new MyFrame(); m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return true; } MyApp g_app; ///////////////////////////////////////////////////
上面的程式碼確實比直接使用WIN32 API要簡單很多。但是對比第一個程式中的要點,我們原來總結的要點在這裡卻再也找不到對應了。
MFC到底做了什麼?註冊窗體、建立窗體和訊息迴圈等過程都在哪裡?帶著上面的這些疑問,讓我們來剖析上面的這個“簡單的”MFC程式吧!
上面的內容主要只是讓一個WIN32程式和MFC程式運轉起來。
*上面內容均在侯俊傑先生的《深入淺出MFC》中有細緻規範的說明。
相關推薦
深入淺出MFC筆記1-Win32和MFC程式對比
MFC是Miscrosoft Foundation Classes的縮寫,是微軟對Windows API的封裝,所以要學習MFC,首先要對Win32程式有一個基本的瞭解,下面用一個例子來說明Win32
MFC筆記1-動態建立CChecklistbox
一、動態建立CChecklistbox 在VS中,CCheckListBox控制元件無法選擇,能選的只有CListBox控制元件,這個控制元件的選項前面沒有checkbox,如何才能用CCheckListBox了,方法如下: 1. 新建對話方塊應用 2.給對話方塊加一個Lis
多執行緒在C、Win32和MFC下的使用方法
一.前言 執行緒是執行路徑。一個程序至少要有一個執行緒,也可能包含多個執行緒。若程序關閉了,則在程序中所有的執行緒也自動被銷燬。當我們在一個應用程式中建立一個執行緒時,實際上,它是第二個執行緒。在C或C++中,程式的入口函式是main或wmain(Unicode版本
Git總結筆記1-搭建和使用30條簡明筆記
工作區 本地倉庫 模式 ins git windows 歷史 總結 log 1.環境搭建: Linux:安裝git安裝包(yum install -y git) Windows:到官網下載安裝包 安裝完成後配置如下用戶名和郵箱: git config --global us
機器學習筆記 1 LMS和梯度下降(批梯度下降) 20170617
temp eas 理解 import 樣本 alt mes show 超過 # 概念 LMS(least mean square):(最小均方法)通過最小化均方誤差來求最佳參數的方法。 GD(gradient descent) : (梯度下降法)一種參數更新法則。可以作為L
《Oracle PL/SQL開發指南》學習筆記1——Oracle PL/SQL程式開發概覽
本章內容: 1. PL/SQL的歷史和背景 2. Oracle開發架構 知識點: 1. SQL和PL/SQL的關係: The SQL language is the interface to the Oracle Database 12c database
廖雪峰Python筆記[1] - 運算和資料結構
目錄 1 輸入輸出 2 布林運算 3 四則運算 4 list和tuple 5 dict和set 1 輸入輸出 輸出:逗號被空格代替,print也可以進行簡單的計算,字串前加r表示不轉義
《effective java》讀書筆記1(建立和銷燬物件)
第1條:考慮用靜態工廠方法代替構造器 1.what is? 此處的靜態工廠方法與設計模式中的工廠模式不一樣。 比如類 class Person{ //A的構造器 public A(){}; //A的靜態工廠方法可以
【C++】 string學習筆記1——定義和初始化string物件
string學習筆記1 c++初始化string物件的方式有以下幾種常見的方式。 /**定義和初始化string**/ string s1; ///預設的初始化,s1為一個空字串。 string s2 = s1;
numpy學習筆記1—ravel() 和 flatten()
numpy的ravel() 和 flatten()函式 簡介 首先宣告兩者所要實現的功能是一致的(將多維陣列降位一維)。這點從兩個單詞的意也可以看出來,ravel(散開,解開),flatten(變平)。兩者的區別在於返回拷貝(copy)還是返回檢視(view
GENSIM 使用筆記1 --- 語料和向量空間
1 本篇說明 本篇部落格來源於GENSIM官方向導文件的第一章,主要供自己後續的翻閱,並通過分享帶給諸位網友一個小小的參照。 從字串到向量 在這一小節當中,將會講述如何通過gensim,將一段文字以向量的形式表示。 首先我們看一下我們的基本文件形
dubbo+zookeeper搭建筆記1——dubbo和zookeeper的安裝
1、安裝zookeeper. 下載連線: http://www.apache.org/dist/zookeeper/ 解壓後,進入到conf裡面,會看到zoo_sample.cfg檔案。將zoo_sample.cfg改為zoo.cfg,修改相關配置內容(主要更改
Golang學習筆記1-組合和介面
主要內容 1.組合 2.介面 3.常見問題 4.總結 1.組合 Golang中沒有OOP中繼承的概念,取而代之的是組合,同樣起到屬性和方法繼承 的作用,特別是匿名組合,其表現形式和繼承的行為類似,但是卻有很多不同的地方,相對於繼承、多型這些典型的OOP思
深入淺出MFC筆記2-MFC程式如何包裝Win32程式
從上一節的Win32程式與MFC程式的對比中可以看到,MFC程式中可執行程式碼只有MyApp::InitInstance()和MyFrame::MyFrame(),可以想到MFC程式一定會呼叫此兩個函式,如果你手中有一個好的整合開發環境(如果沒有,那你最好去安裝一個^_^)
VC中的Win32應用程式和MFC程式有什麼分別
WIN32 是Windows的一個子系統,也是最重要的一個。(還有POSIX子系統和OS/2子系統)Win32子系統為應用程式提供了使用系統資源的介面Win32 API,WIN32 API是Windows使用者態下應用程式程式設計的基礎。因此所有在WIN32API基礎上的應用
深入淺出MFC筆記3-MFC程式的訊息流轉
對於上面的過程我們可能會對設定的訊息處理函式有疑問,如果建立的視窗的訊息處理函式是Windows預設的訊息處理,那麼MFC如何對各種訊息進行響應呢?對於這個問題我們回到CWnd::CreateEx函式中,我們可以看到在CFrameWnd::PreCreateWindow函式
VC6使用GDI+進行影象的特效處理和MFC學習筆記-1
GDI+是微軟提供的做圖形處理方面的一套類庫,這裡記錄下學習過程,還有MFC的學習過程。想完成一個能開啟,顯示影象並進行特效處理,轉存的小程式。 一.環境搭建和小測試 由於VC6.0不帶GDI+的類庫,需要自己下載相關檔案,貌似高版本的VS會自帶GDI+。 建立一個多文件的
MFC入門(三)-- MFC圖片/文字控制元件(迴圈顯示文字和圖片的小程式)
慣例附上前幾個部落格的連結: MFC入門(一)簡單配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入門(二)讀取輸入字元:http://blog.csdn.net/zmdsjtu/article/details/52315088 &
MFC筆記(四)——多執行緒程式設計1:模組、程序、執行緒間的基本概念
一、模組、程序、執行緒 1.1 模組 一段可執行的程式(包括EXE和DLL),其程式程式碼、資料、資源被載入到記憶體中,由系統建立一個數據結構來管理它。這段程式就是一個模組。這裡所說
MFC(1):第一個MFC程式建立及遇見的問題解決
1 專案建立及程式碼編寫 (1)建立一個win32空專案,建立完成後,右鍵屬性-->專案預設值-->MFC的使用-->在共享 DLL 中使用 MFC-->確定 (2)編寫標頭檔案mfc.h #include <afxwin.h> class CMy