C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理
一、MFC概念和作用
1、全稱Microsoft Foundation Class Library,我們稱為微軟基礎類庫,封閉了絕大部分的win32 Api函數,C++語法中的數據結構,程序的執行流程
MFC就是一個庫(動態庫,靜態庫)
MFC還是一個程序框架
2、為什么使用MFC
基于框架編程,提高工作效率,減少開發周期,節約開發成本。
二、幾個重要的頭文件
afx.h ? ?-絕大部分類的聲明頭文件
afxwin.h -包含了afx.h和windows.h
afxext.h -提供了擴展窗口類的支持(工具欄,狀態欄等)
三、使用MFC
1、使用MFC庫做自己的控制臺程序
入口函數 _tmain()不同于以往的main()
CWinApp theApp;-全局程序對象。
注意:
::函數名()-為win32的API函數。
以Afx開頭的函數,為MFC庫里的全局函數。
2、使用MFC庫做自己的庫程序(MFC AppWizard dll)
規則動態庫:可以被任何程序調用
擴展動態庫:只能被支持MFC的程序調用
3、MFC窗口程序
單文檔視圖構架程序。
CFrameWnd-框架窗口類;
CWinApp-應用程序類,負責管理整個程序的執行流程;
CDocument-文檔類,負責管理數據(數據的提取、轉換、存儲等操作);
CView-視圖窗口類,負責顯示數據
多文檔視圖構架程序。
CMDIChildWnd-子框架窗口類,負責管理子框架窗口。
CMDIFrameWnd-主框架窗口類
CWinApp-應用程序類,負責管理整個程序的執行流程;
CDocument-文檔類,負責管理數據(數據的提取、轉換、存儲等操作);
CView-視圖窗口類,負責顯示數據
對話框程序
CWinApp-應用程序類,負責管理整個程序的執行流程;
CDialog-對話框類
四、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開頭。
?
機制1:MFC入口函數機制
現在學習時,MFC都是建立Win32 Application程序,然后通過下列步驟改為MFC程序,只有一步步了解怎么去手動創建MFC,以后通過MFC向導自動生成的大量MFC代碼我們才能看得懂。
1、刪除主程序cpp中的入口函數
2、將stdafx.h中的windows.h改為afxwin.h
3、工程-設置 中選擇使用MFC庫
4、自定義框架類和程序類,繼承自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;
}
5、創建一個程序類對象(觸發點):
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();//全局句柄
1、加載菜單
2、調用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函數,創建窗口
3、鉤子處理函數
將框架對象地址和窗口句柄建立一一對應關系。
利用::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);
}
示例:
?
// 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;總結
以上是生活随笔為你收集整理的C++MFC编程笔记day01 MFC介绍、创建MFC程序和重写消息处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 30分钟,让你成为一个更好的程序员
- 下一篇: H.264编解码流程