C++MFC編程筆記day01 MFC介紹、建立MFC程序和重寫消息處理

1、MFC概念和做用

一、全稱Microsoft Foundation Class Library,咱們稱爲微軟基礎類庫,封閉了絕大部分的win32 Api函數,C++語法中的數據結構,程序的運行流程
MFC就是一個庫(動態庫,靜態庫)
MFC仍是一個程序框架
二、爲何使用MFC
基於框架編程。提升工做效率,下降開發週期,節約開發成本。
2、幾個重要的頭文件
afx.h    -絕大部分類的聲明頭文件
afxwin.h -包括了afx.h和windows.h
afxext.h -提供了擴展窗體類的支持(工具欄,狀態欄等)
3、使用MFC
一、使用MFC庫作本身的控制檯程序
入口函數 _tmain()不一樣於以往的main()
CWinApp theApp;-全局程序對象。


注意:
::函數名()-爲win32的API函數。編程


以Afx開頭的函數,爲MFC庫裏的全局函數。windows


二、使用MFC庫作本身的庫程序(MFC AppWizard dll)
規則動態庫:可以被不論什麼程序調用
擴展動態庫:僅僅能被支持MFC的程序調用
三、MFC窗體程序
單文檔視圖構架程序。
CFrameWnd-框架窗體類;
CWinApp-應用程序類,負責管理整個程序的運行流程;
CDocument-文檔類,負責管理數據(數據的提取、轉換、存儲等操做);
CView-視圖窗體類,負責顯示數據
多文檔視圖構架程序。
CMDIChildWnd-子框架窗體類,負責管理子框架窗體。數據結構


CMDIFrameWnd-主框架窗體類
CWinApp-應用程序類,負責管理整個程序的運行流程;
CDocument-文檔類,負責管理數據(數據的提取、轉換、存儲等操做);
CView-視圖窗體類,負責顯示數據
對話框程序
CWinApp-應用程序類,負責管理整個程序的運行流程;
CDialog-對話框類
4、MFC類的介紹
CObject -mfc庫絕大部分類的基類,封裝了MFC庫中最主要的一些機制,執行時類信息機制/動態建立機制/序列化機制.
CCmdTarget-消息映射機制基類
CWinThread/CWinApp-應用程序類
CDocTemplate及其子類 -文檔模版類
CDocument及其子類-文檔類,封裝了對各類數據的操做。
Exceptions - 異常類,封裝了MFC中的各類異常狀況。
CFile-文操做類
CWnd  -所有窗體類基類
FrameWindows  框架窗體類,封裝了對各類框架窗體的操做
ControlBars-各類工具欄類,封閉了對各類工具欄的操做
Dialog Boxes 對話框類。
Views 視圖窗體類
Controls 控件類
CDC/CGdiObject 封裝了畫圖操做
CArray/AList/CMap  對C++中的數據的封裝,以C開頭。


app

機制1:MFC入口函數機制

現在學習時。MFC都是創建Win32 Application程序。而後經過下列步驟改成MFC程序,僅僅有一步步瞭解怎麼去手動建立MFC,之後經過MFC嚮導本身主動生成的大量MFC代碼咱們才幹看得懂。


一、刪除主程序cpp中的入口函數
二、將stdafx.h中的windows.h改成afxwin.h
三、project-設置 中選擇使用MFC庫
四、本身定義框架類和程序類,繼承自MFC類,並重寫CWinApp的InitInstance方法:
class CMyFrameWnd:public CFrameWnd
{
};
class CMyWinApp:public CWinApp
{
public:
CMyWinApp();
virtual BOOL InitInstance();
};
CMyWinApp::CMyWinApp()
{
}
BOOL CMyWinApp::InitInstance()
{
CMyFrameWnd *pFrame=new CMyFrameWnd;
pFrame->Create(NULL,"MFC base");
m_pMainWnd=pFrame;
pFrame->ShowWindow(SW_SHOW);
pFrame->UpdateWindow();
return true;
}
五、建立一個程序類對象(觸發點):
CMyWinApp theApp;


AFX_MODULE_STATE* pModuleState = AfxGetModuleState();//獲取當前程序模塊狀態信息
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;//獲取當前線程狀態信息
pThreadState->m_pCurrentWinThread = this;//theapp全局對象信息賦值
pModuleState->m_pCurrentWinApp = this;
ASSERT(bool表達式);//假設表達式不成立,則彈出錯誤,不往下運行
全局函數:AfxGetApp(),AfxGetThread() 獲取theApp地址
AfxMessageBox();//彈出消息
vc6中。查看-調試窗體-call stack 可以看到被誰調用
可重寫(前加virtual):
BOOL CMyWinApp::InitApplication();
BOOL CMyWinApp::InitInstance()//初始化
int  CMyWinApp::Run()//執行
BOOL CMyWinApp::OnIdle(LONG lcount);//空暇時處理
int CMyWinApp::ExitInstance();
框架

演示樣例代碼:函數

// MFCbase.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
class CMyFrameWnd:public CFrameWnd
{

};
class CMyWinApp:public CWinApp
{
public:

	CMyWinApp();
	virtual BOOL InitInstance();
	virtual int Run();
};
CMyWinApp::CMyWinApp()
{

}
BOOL CMyWinApp::InitInstance()
{
	CMyFrameWnd *pFrame=new CMyFrameWnd;
	pFrame->Create(NULL,"MFC base");
	m_pMainWnd=pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();
	return true;
}
int CMyWinApp::Run()
{
	AfxMessageBox("run");
	return CWinApp::Run();
}
CMyWinApp theApp;//建立一個程序對象



機制2:MFC窗體建立機制:

AfxGetInstanceHandle();//全局句柄
一、載入菜單
二、調用CreateEx 設計、註冊窗體類
PreCreateWindow():
WNDCLASS   wndcls;wndcls.lpfWinProc=DefWindowProc;
AfxRegisterWithIcon(),AfxRegisterClass()
::RegisterClass註冊一個局部窗體類。類名「AfxFrameOrView42sd」,默認處理函數。
AfxHookWindowCreate(pFrame) 埋下勾子
CHandleMap* pMap = afxMapHWND(TRUE);
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();//映射對象保存到全局變量
pState->m_pmapHWND = new CHandleMap(...);
pMap->SetPermanent(m_hWnd = hWndNew, this);
    //pFrame->m_hWnd 爲窗體句柄。


CWnd* pWnd=CWnd::FromHandlePermanent(hWnd);
//pState->m_pmapHWND->LookupPermanent(HANDLE h)成員,可經過窗體句柄獲取pFrame
::CreateWindowEx函數,建立窗體
三、鉤子處理函數
將框架對象地址和窗體句柄創建一一相應關係。工具


利用::SetWindowLong,將窗體處理函數更改成AfxWndProc.


----------MSDN Library Visual Studio 6.0
//埋下勾子
HHOOK SetWindowsHookEx(
  int idHook,        // 勾子類型
  HOOKPROC lpfn,     // 處理函數(不一樣類型不一樣)
  HINSTANCE hMod,    // 進程句柄,NULL時不限制範圍
  DWORD dwThreadId   // 線程ID
);
//勾子類型爲WH_CBT時的處理函數
LRESULT CALLBACK CBTProc(
  int nCode,      // hook code
  WPARAM wParam,  // 建立好的窗體句柄
  LPARAM lParam   // depends on hook code
);
//勾子處理函數改動默認處理函數
WNDPROC afxWndProc = AfxGetAfxWndProc();
oldWndProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC,(DWORD)afxWndProc);
//改動窗體處理函數
LONG SetWindowLong(
  HWND hWnd,       // 窗體句柄
  int nIndex,      // 傳入:GWL_WNDPROC
  LONG dwNewLong   // 窗體處理函數地址
);
//全局變量信息
_AFX_THREAD_STATE* pThreadState=_afxThreadState.GetDate();
::GetCurrentThreadId();//獲取當前線程ID
pThreadState->m_pWndInit = pWnd;//賦值到全局變量


::CreateWindowEx() //此函數處理完後直接進入勾子處理函數


重寫消息處理函數
LRESULT CMyFrameWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
AfxMessageBox("WM_CREATE");
break;
}
return CFrameWnd::WindowProc(message,wParam,lParam);
學習

}this

演示樣例:spa

// MFCcreate2.cpp : Defines the entry point for the application.
#include "stdafx.h"

class CMyFrameWnd:public CFrameWnd
{
public:
	virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
};
LRESULT CMyFrameWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_CREATE:
		AfxMessageBox("WM_CREATE");
		break;
	case WM_PAINT:
		{
			PAINTSTRUCT ps={0};
			HDC hdc=::BeginPaint(this->m_hWnd,&ps);
			::TextOut(hdc,100,100,"hello",5);
			::EndPaint(this->m_hWnd,&ps);
		}
		break;
	case WM_MOUSEMOVE:
		{
			//g_xpos=LOWORD(lParam);
			//g_ypos=HIWORD(lParam);
			::InvalidateRect(this->m_hWnd,NULL,true);
		}
		break;
	}
	return CFrameWnd::WindowProc(message,wParam,lParam);
}
class CMyWinApp:public CWinApp
{
public:
	virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance()
{
	CMyFrameWnd *pFrame=new CMyFrameWnd;
	pFrame->Create(NULL,"MFCcreate");
	m_pMainWnd=pFrame;
	pFrame->ShowWindow(SW_SHOW);
	pFrame->UpdateWindow();
	return TRUE;
	//return CWinApp::InitInstance();
}
CMyWinApp theApp;

相關文章
相關標籤/搜索