注意:
::函數名()-爲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
一、刪除主程序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;//建立一個程序對象
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;