1. 程式人生 > >深入淺出MFC筆記1-Win32和MFC程式對比

深入淺出MFC筆記1-Win32和MFC程式對比

MFC是Miscrosoft Foundation Classes的縮寫,是微軟對Windows API的封裝,所以要學習MFC,首先要對Win32程式有一個基本的瞭解,下面用一個例子來說明Win32程式的基本結構。

////////////////////////////////////////////////////
//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-Win32MFC程式對比

MFC是Miscrosoft Foundation Classes的縮寫,是微軟對Windows API的封裝,所以要學習MFC,首先要對Win32程式有一個基本的瞭解,下面用一個例子來說明Win32

MFC筆記1-動態建立CChecklistbox

一、動態建立CChecklistbox 在VS中,CCheckListBox控制元件無法選擇,能選的只有CListBox控制元件,這個控制元件的選項前面沒有checkbox,如何才能用CCheckListBox了,方法如下: 1. 新建對話方塊應用 2.給對話方塊加一個Lis

多執行緒在C、Win32MFC下的使用方法

一.前言    執行緒是執行路徑。一個程序至少要有一個執行緒,也可能包含多個執行緒。若程序關閉了,則在程序中所有的執行緒也自動被銷燬。當我們在一個應用程式中建立一個執行緒時,實際上,它是第二個執行緒。在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——dubbozookeeper的安裝

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