MFC 課程總結

《基於MFC框架開發》
馬志國 149198978
1 MFC課程的組成
1.1 MFC應用程序的組成部分、執行機制和執行流程(10.5天)。
1.2 Windows平臺上的數據庫訪問技術(1.5天)
MFC的ODBC類和Ado組件
1.3 Windows平臺上的網絡通訊編程 (1天)
基本的socket函數和MFC的socket類
1.4 項目:遠程控制系統 (3天)
2 MFC課程目標
2.1 掌握MFC的原理和機制
2.2 熟練掌握斷點調試和查看堆棧調用,瞭解函數的調用關係。
2.3 熟練掌握類嚮導的使用
2.4 熟練使用MSDN
3 對你們的要求
3.1 不要缺課
3.2 營造良好的學習氣氛
----------------------------------------------------
day01 MFC的基礎
1 什麼是MFC?
Microsoft Foundation Class Library,微軟基礎類庫。一方面是
一個應用程序的編程框架。另外一方面是一個龐大的類庫。
2 爲何要使用MFC?
提升項目的開發效率,縮短項目的開發週期,下降開發費用。
3 MFC開發的程序的類型
3.1 應用程序
3.1.1 單文檔視圖程序
1> CWinApp類-應用程序類。維護整個應用程序的運行過程
2> CFrameWnd類-主框架窗口類。建立主框架窗口。
3> CEditView類-視圖類。建立視圖窗口,顯示數據。
4> CDocument類-文檔類。管理數據,包括數據的保存和加載
3.1.2 多文檔視圖程序
1> CMDIFrameWnd類-多文檔的主框架窗口類。
2> CMDIChildWnd類-多文檔的子框架窗口類。
3> CWinApp類-應用程序類。維護整個應用程序的運行過程
4> CEditView類-視圖類。建立視圖窗口,顯示數據。
5> CDocument類-文檔類。管理數據,包括數據的保存和加載
3.1.3 基於對話框的程序
1> CWinApp類-應用程序類。維護整個應用程序的運行過程
2> CDialogEx類-對話框類。建立對話框窗口。
任何一個MFC的應用程序,都必然存在一個CWinApp的子類,和
由子類建立的一個全局應用程序對象theApp。
3.2 庫程序
3.2.1 規則庫,接口是規則的,意味着任何windows平臺上的C++
程序均可以使用規則庫。(自己仍然是一個動態庫)
1> 在內部靜態連接MFC庫
2> 在內部動態連接MFC庫
3.2.2 擴展庫,接口是MFC的,意味着只能被MFC程序調用。通常
只用來擴展MFC的功能。
3.3 控制檯程序
4 MFC經常使用的類
4.1 CObject類-MFC中最頂層的類,提供MFC基本的機制,例如:
運行時類信息以及動態建立等。
4.2 CCmdTarget類-父類是CObject類,提供了對命令消息的查找處理
4.3 CWinApp類-應用程序類,負責維護MFC程序的運行。
4.4 CWnd類-窗口類,封裝了操做窗口的Win32 API。主要包括框架窗 口類、對話框類、視圖類和控件類。
4.5 CDocument類-文檔類,管理數據的,包括對數據的存儲和加載。
4.6 CException類-異常類。
4.7 CFile類-文件操做。
4.8 MFC的繪圖類-包括繪圖設備和繪圖對象。
4.9 MFC的集合類-包括動態數組、鏈表和映射。
4.10 非CObject類的子類
CString類、CTime類、CTimeSpan類、CSize類、CRect類等。
5 第一個MFC程序
5.1 使用Win32嚮導建立空項目,經過項目屬性設置MFC環境。
5.2 在項目中添加源文件MFCBase.cpp,開始編碼。
5.3 添加頭文件afxwin.h
5.4 添加CWinApp的子類CMyWinApp類,而且使用子類建立全局的
應用程序對象theApp。
5.5 添加CFrameWnd的子類CMyFrameWnd類。
5.6 在CMyWinApp類中重寫InitInstance函數,在函數中使用
CMyFrameWnd類建立並顯示窗口。

6 MFC的程序啓動機制(入口函數機制)
與Win32程序同樣,MFC程序也是從WinMain函數開始執行。只不過
MFC程序的WinMain函數是由MFC框架在底層代碼提供的,用戶不用
也不能本身編寫WinMain函數。
7 MFC程序的執行流程
參考輔助文件中的註釋
8 CWinApp類的總結:
8.1 虛函數
InitInstance-必須重寫的函數,在函數中完成對象以及窗口的 建立,各類庫的加載。
ExitInstance-通常會重寫的函數,在函數中完成資源的釋放以 及各類庫的卸載。
OnIdle-不多會重寫的函數,在函數中主要完成空閒處理。
Run -通常不會重寫的函數,在函數中主要完成消息循環。
8.2 成員
m_pMainWnd-保存主窗口對象的地址
數據庫


快捷鍵:
F5-調試的方式啓動程序
Ctrl+F5-直接啓動
Shift+F5-中止調試
F9-設置/取消斷點
F10-單步執行,遇到函數調用,當成一條語句執行過去。
F11-單步執行,遇到函數調用,進入被調用的函數內部。編程


day2windows

一 窗口建立過程
Win32: 設計和註冊窗口類 ->建立窗口 ->消息循環 ->窗口處理函數
MFC: PreCreateWindow() ->::AfxctxCreateWindow-> Run( ) -> AfxWndProc 數組


Hook-鉤子,是Windows編程的一個機制,關聯一個鉤子處理函數,是一個回調函數。
當知足鉤子條件時,鉤子處理函數會被系統調用。
1 設置鉤子的函數
HHOOK SetWindowsHookEx(
int idHook, // 鉤子類型
HOOKPROC lpfn, // 鉤子處理函數
HINSTANCE hMod, // 通常是一個包含鉤子處理函數的動態庫句柄
DWORD dwThreadId //當前線程ID
);
1 建立過程(Create函數的執行過程)
1.1 調用LoadMenu()函數加載菜單
1.2 調用CreateEx()函數建立窗口
1.2.1 調用PreCreateWindow()函數設計和註冊窗口類。
1.2.2 調用AfxHookWindowCreate()函數設置CBT類型的鉤子
1.2.3 調用AfxctxCreateWindowEx()函數建立窗口
1.2.4 一旦建立窗口,觸發鉤子處理函數_AfxCbtFilterHook()調用,在函數中:
1>鏈接窗口對象地址和窗口句柄
2>將窗口處理函數設置爲MFC框架提供的AfxWndProc函數。
1.2.5 重寫回到1.2.3 如下的代碼繼續執行... 服務器


2 CFrameWnd類的總結:
2.1 虛函數
2.1.1 PreCreateWindow()-函數功能是設計和註冊窗口類。經過重寫該函數能夠通 過傳參的方式設置窗口的特徵。
2.1.2 WindowProc()-它是一個窗口處理函數。經過重寫該函數,咱們處理消息。
2.2 成員變量
m_hWnd-保存窗口句柄。 網絡

day3
一 消息映射
1 概念
消息映射是指消息ID與消息處理函數的對應關係。
2 實現
2.1 在類的定義中添加消息映射的聲明宏
DECLARE_MESSAGE_MAP( )
在類的實現中添加消息映射的實現宏
BEGIN_MESSAGE_MAP( theClass,baseClass)
END_MESSAGE_MAP( )
2.2 在消息映射的實現宏中添加具體的消息映射
BEGIN_MESSAGE_MAP( theClass,baseClass)
ON_MESSAGE(消息ID,消息處理函數)
END_MESSAGE_MAP( )
2.3 添加消息處理函數的聲明和實現
3 實現原理
3.1 展開宏
......
3.2 成員函數介紹
3.2.1 GetThisMessageMap( )-靜態的成員函數
3.2.2 GetMessageMap( )-虛函數,在函數中,只是調用了GetThisMessageMap( )
這個函數。
3.3 GetThisMessageMap( )函數的執行過程
3.3.1 _messageEntries[]-靜態的結構體數組,類型是AFX_MSGMAP_ENTRY。保存
了當前類對消息的處理的信息
struct AFX_MSGMAP_ENTRY
{
UINT nMessage; // 窗口消息的ID
UINT nCode; // 通知消息的通知碼
UINT nID; // 控件或菜單ID
UINT nLastID; // 在一個ID範圍中表示最後一個控件或菜單ID框架

UINT_PTR nSig; // 消息處理函數的類型,根據函數的返回值和參數劃分
AFX_PMSG pfn; //消息處理函數的指針
};
3.3.2 messageMap-靜態的結構體變量。類型是AFX_MSGMAP。
struct AFX_MSGMAP
{
//函數指針,保存了父類的GetThisMessageMap函數的地址。
const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();
//結構體指針,保存了當前類的 _messageEntries[]這是數組的地址
const AFX_MSGMAP_ENTRY* lpEntries;
};
3.3.3 return &messageMap; ,返回3.3.2 這個結構體變量的地址。
3.4 各部分之間的關係
GetMessageMap( )
|->GetThisMessageMap( )
|->&messageMap
|->&_messageEntries[0]
|->消息ID與消息處理函數的對應關係
WM_CREATE----OnCreate
WM_PAINT ----OnPaint
|->&CFrameWnd::GetThisMessageMap
|->&CFrameWnd::messageMap
|->&CFrameWnd::_messageEntries[0]
|->消息ID與消息處理函數的對應關係
WM_CREATE ---- OnCreate
WM_SIZE ----OnSize
......
|->&CWnd::GetThisMessageMap
|->&CWnd::messageMap
|->&CWnd::_messageEntries[0]
WM_CLOSE --OnClose
...
|->...... 異步

分析關係,造成一個繼承層次關係上的消息的處理信息的鏈表。
4 實現過程
二 MFC對消息的分類
1 窗口消息(標準消息)-與建立過程相關的消息以及鼠標、鍵盤和定時器等消息。
消息映射宏的通常格式:
ON_WM_XXX( )
例如:ON_WM_CREATE、ON_WM_SIZE( )、ON_WM_MOUSEMOVE( )
2 命令消息-菜單、工具欄和加速鍵等消息
消息映射宏的通常格式:
ON_COMMAND(消息ID,消息處理函數)
3 通知消息-大部分的控件的消息都是通知消息
ON_EN_CHANGE(控件ID,消息處理函數)socket

day4
一 MFC的菜單
1 相關類
CMenu類-封裝了菜單句柄和操做菜單的API函數。
2 CMenu類的使用
2.1 加載菜單資源
CMenu::LoadMenu
2.2 將菜單設置到窗口
CWnd::SetMenu
2.3 上下文菜單,在窗口的ON_WM_CONTEXTMENU( )消息處理函數中添加
2.3.1 加載菜單資源
CMenu::LoadMenu
2.3.2 獲取某個菜單項下的子菜單
CMenu::GetSubMenu
2.3.3 顯示
CMenu::TrackPopupMenu
2.4 菜單的顯示狀態
ON_UPDATE_COMMAND_UI
2.5 命令消息
窗口消息對消息鏈表的遍歷查找過程是在CWnd::OnWndMsg函數中完成的。
命令消息對消息鏈表的遍歷查找過程是在CCmdTarget::OnCmdMsg函數中完成的。
處理順序:
CFrameWnd->App
二 MFC工具欄
1 相關類
CToolBar類-提供了工具欄的相關操做。
#include <afxext.h>
2 CToolBar類的使用
2.1 建立工具欄窗口
CToolBar::Create
2.2 加載工具欄資源
CToolBar::LoadToolBar
2.3 停靠工具欄(船塢化)
2.3.1 工具欄容許停靠
CToolBar::EnableDocking
2.3.2 框架窗口容許被停靠
CFrameWnd::EnableDocking
2.3.3 停靠工具欄
CFrameWnd::DockControlBaride

課堂練習:建立一個工具欄,停靠在窗口的右邊,並經過菜單控制它的顯示狀態。
三 MFC的狀態欄
1 相關類
CStatusBar類-提供了狀態欄的相關操做。
2 CStatusBar類的使用
2.1 建立狀態欄窗口
CStatusBar::Create
2.2 設置狀態欄指示器
CStatusBar::SetIndicates
2.3 設置狀態欄文本
CStatusBar::SetPaneText

day5

一 MFC視圖
1 相關類
CView類-父類是CWnd類,是專門用來顯示數據的窗口。包含了純虛函數OnDraw,它
是一個抽象類。使用時,一般在子類中重寫OnDraw函數。
2 CView的使用
2.1 CWnd::PostNcDestroy- 在窗口被銷燬後,默認的被成員函數OnNcDestroy調用。
派生類可使用該函數完成用戶的資源清理工做,例如:
delete this。
void CView::PostNcDestroy()
{
delete this;//對象的自銷燬
}
void CFrameWnd::PostNcDestroy()
{
delete this;//對象的自銷燬
}
2.2 視圖窗口的大小可以自適應框架窗口
在框架窗口的WM_SIZE消息處理函數中,根據框架窗口的客戶區大小設置視圖。
另外,設置視圖的ID爲AFX_IDW_PANE_FIRST,也能夠達到自適應的效果。
2.3 活動視圖
2.3.1 CFrameWnd::SetActiveView-設置活動視圖的函數。
2.3.2 在函數內部存在一個指針變量的賦值操做
m_pViewActive=m_pwndView;
2.4 對命令消息的處理順序
ActiveView->Frame->App
2.5 OnDraw和OnPaint
CView::OnPaint函數調用CMyView::OnDraw函數。
CMyView::OnPaint
二 運行時類信息
1 概念
程序在運行的時候,獲取對象的類信息和判斷對象是否屬於某個類。
2 實現
2.1 實現條件
2.1.1 直接或者間接的從CObject派生。
2.1.2 在類的定義中添加運行時類信息的聲明宏
DECLARE_DYNAMIC(theClass)
在類的實現中添加運行時類信息的實現宏
IMPLEMENT_DYNAMIC(theClass,baseClass)
2.2 相關函數
2.2.1 CObject::GetRuntimeClass-獲取當前類的運行時類信息
struct CRuntimeClass
{
LPCSTR m_lpszClassName;//類的名稱字符串
int m_nObjectSize;//對象大小
UINT m_wSchema//類的版本
CObject* (PASCAL* m_pfnCreateObject)( );//NULL

CRuntimeClass* m_pBaseClass;//指向下一個節點的指針
};
2.2.2 CObject::IsKindOf -判斷對象是否屬於某個類
3 實現原理
3.1 展開宏
......
3.2 成員的做用
3.2.1 classCDog-靜態的結構體變量,類型是CRuntimeClass。保存了當前類的
名稱、大小、版本等信息。還保存了父類的運行時類信息變量
classCAnimal的地址。
3.2.2 GetRuntimeClass-虛函數,做用是獲取classCDog的地址。
3.3 成員之間的關係
GetRuntimeClass( )
|->&classCDog
|->CDog類的名稱、大小和版本等信息
|->&classCAnimal
|->CAnimal類的名稱、大小和版本等信息
|->&classCObject
|->CObject了的名稱、大小和版本等信息
|->NULL

造成一個繼承層次關係上的類的信息鏈表。
3.4 IsKindOf函數的執行流程:
dog.IsKindOf(RUNTIME_CLASS(CObject)) CWnd
&classCDog &classCObject &classCWnd
&classCAnimal
&classCObject TRUE
FALSE
三 動態建立
1 概念
建立未知類型的對象
2 定義支持動態建立的類
2.1 直接或者間接的派生自CObject類。
2.2 在類的定義中添加動態建立的聲明宏
DECLARE_DYNCREATE(theClass)
在類的實現中添加動態建立的實現宏
IMPLEMENT_DYNCREATE(theClass,baseClass)
3 實現原理
3.1 展開宏
.......
在運行時類信息的基礎上,多了一個CreateObject()函數.
3.2 成員的做用
3.2.1 CreateObject-靜態的成員函數,做用是new CDog對象。
3.2.2 classCDog-靜態的結構體變量,類型是CRuntimeClass。在它的成員
m_pfnCreateObject變量中保存了3.2.1 函數的地址。
3.3 建立過程


day6

一 MFC的切分窗口
1 分類
靜態切分-在程序編寫時,就已經肯定了窗口切分的數量。每一個切分窗口對應的視圖類
能夠不相同。最大切分數量16*16.
動態切分-在程序運行時,由用戶根據須要實時的切分窗口。通常狀況,每一個切分窗口
使用相同的視圖類。最大切分數量2*2.
2 相關類
CSplitterWnd類-功能主要是完成窗口切分。
#include <afxwin.h>
3 靜態切分
3.1 在OnCreateClient函數中完成窗口切分。
3.2 調用 CSplitterWnd::CreateStatic-完成窗口靜態切分。
BOOL CreateStatic(
CWnd* pParentWnd, //父窗口對象的地址
int nRows,//行數,不能超過16
int nCols, //列數,不能超過16
DWORD dwStyle = WS_CHILD | WS_VISIBLE, //窗口的風格
UINT nID = AFX_IDW_PANE_FIRST //窗口ID
);
3.3 調用 CSplitterWnd::CreateView建立視圖
virtual BOOL CreateView(
int row, //行號
int col, //列號
CRuntimeClass* pViewClass,//視圖類的運行時類信息
SIZE sizeInit, //初始尺寸
CCreateContext* pContext//建立上下文結構體
);
3.4 根據位置獲取某個視圖
CSplitterWnd::GetPance
3.5 設置活動視圖
CSplitterWnd::SetActivePane

練習:建立一個3*3的靜態切分窗口,每個視圖窗口使用CMyView這是視圖類,並且
每一個視圖窗口大小大體相同。10分鐘
4 動態切分窗口
BOOL Create(
CWnd* pParentWnd, //父窗口
int nMaxRows, //行數的最大值。不能超過2
int nMaxCols, //列數的最大值。不能超過2
SIZE sizeMin, //最小尺寸
CCreateContext* pContext, //建立上下文的結構體,在這兒使用它指定視圖類的運行時類信息
DWORD dwStyle = WS_CHILD | WS_VISIBLE, //窗口的風格
UINT nID = AFX_IDW_PANE_FIRST//窗口ID
);
二 MFC的文檔
1 相關類
CDocument類-文檔類,主要功能是用來管理數據的。
2 CDocument類的使用
在視圖窗口中顯示來自於文檔的數據
2.1 CView::OnInitialUpdate-視圖的初始化更新函數,是一個虛函數。在視圖第一次附加
文檔以後,視圖窗口顯示以前被框架調用。
2.2 CView::GetDocument-獲取與視圖關聯的文檔
2.3 CFrameWnd::InitialUpdateFrame-框架的初始化更新函數,在建立一個新的框架窗口
以後調用該函數,它會引發框架中全部視圖的OnInitialUpdate函數的調用。

3 建立過程
3.1 框架的WM_CREATE消息的處理函數(視圖對象的建立以及視圖窗口的建立)
CFrameWnd::OnCreate(...);
{
return OnCreateHelper(lpcs, pContext);
{
OnCreateClient(lpcs, pContext);
{
CreateView(pContext, AFX_IDW_PANE_FIRST);
{
// 3.1.1 動態建立視圖對象
CWnd* pView = (CWnd*)pContext->m_pNewViewClass->CreateObject();
// 3.1.2 建立視圖窗口
pView->Create(...);
}
}
}
}

3.2 視圖的WM_CREATE消息的處理函數(文檔與視圖之間的關係)
CView::OnCreate(...);
{
pContext->m_pCurrentDoc->AddView(this);
{
//3.2.1 在文檔的成員變量m_viewList這個鏈表中保存了視圖對象地址
m_viewList.AddTail(pView);
//3.2.2 在視圖的成員變量m_pDocument中保存了文檔對象的地址
pView->m_pDocument = this;
}
}
一個文檔能夠保存多個視圖對象地址,即一個文檔能夠對應多個視圖。
一個視圖能夠保存一個文檔對象地址,即一個視圖只對應一個文檔。
4 App、Frame、View和Doc之間的關係
CWinApp
|->m_pMainWnd (CFrameWnd )
|->m_pViewActive ( CView)
|->m_pDocument (CDocument)
|-> m_viewList (CView List)
5 命令消息的處理順序
View->Doc ->Frame->App
三 使用文檔模板類建立文檔視圖程序
1 文檔模板類
CDocTemplate類-文檔模板類,抽象基類,提供了文檔模板的基本功能。
CSingleDocTemplate類-單文檔模板類,父類是CDocTemplate類。用來建立單文檔
視圖程序。
CMultiDocTemplate類-多文檔模板類,父類也是 CDocTemplate類。用來建立多文檔
視圖程序。

day7
一 使用文檔模板類建立文檔視圖程序
1 文檔模板類
CDocTemplate類-文檔模板類,抽象基類,提供了文檔模板的基本功能。
CSingleDocTemplate類-單文檔模板類,父類是CDocTemplate類。用來建立單文檔
視圖程序。
CMultiDocTemplate類-多文檔模板類,父類也是 CDocTemplate類。用來建立多文檔
視圖程序。
2 使用單文檔模板類建立單文檔視圖程序
CSingleDocTemplate(
UINT nIDResource, //資源ID
CRuntimeClass* pDocClass, //文檔類的運行時類信息
CRuntimeClass* pFrameClass, //框架類的運行時類信息
CRuntimeClass* pViewClass//視圖類的運行時類信息
);
從參數咱們能夠推斷出,文檔類、框架類和視圖類在定義時都須要支持動態建立。
2.1建立過程
2.1.1 建立單文檔模板對象
2.1.2 添加到應用程序
2.1.3 新建文檔
2.2 各個類(對象)之間的關係
CWinApp
|->m_pDocManager (CDocManager)
|->m_templateList (CSingleDocTemplate)
|->m_pOnlyDoc (CDocument)
|->m_pMainWnd (CFrameWnd)
|->m_pViewActive (CView)
|->m_pDocument (CDocument)
|->m_viewList (CView List)
|->m_pDocTemplate (CSingleDocTemplate)


2.3獲取四個對象(App、Frame、View、Doc)的函數
2.3.1 應用程序對象(theApp)
AfxGetApp()/AfxGetThread()
2.3.2 主框架窗口對象(Frame)
AfxGetMainWnd()
2.3.3 視圖對象(View)
((CFrameWnd*)AfxGetMainWnd())->GetActiveView( )
2.3.4 文檔對象
((CFrameWnd*)AfxGetMainWnd())->GetActiveView( )->GetDocument( )
3 使用多文檔模板類建立多文檔視圖程序
CMultiDocTemplate(
UINT nIDResource, //子框架窗口對應的資源ID
CRuntimeClass* pDocClass,
CRuntimeClass* pFrameClass, //多文檔的子框架窗口類的運行時類信息
CRuntimeClass* pViewClass
);
多文檔的主框架和子框架分別擁有本身的資源。
4 多文檔視圖程序中多個視圖數據同步的例子
4.1 "新建"菜單:建立新的文檔、子框架和視圖。OnFileNew
4.2 "新建窗口"菜單:基於原有活動視圖對應的文檔,建立新的子框架和視圖。
產生的結果就是一個文檔對應多個視圖。
4.3 捕獲視圖內容發生變化的消息

day8

一 MFC繪圖
1 相關類
1.1 繪圖設備類
1.2 繪圖對象類
畫筆、畫刷、位圖、字體、區域(能夠進行幾何運算)。
2 繪圖設備類的使用
2.1 CDC類-繪圖設備類中的基類。提供了繪圖設備的基本功能。使用它描述通常的繪圖
設備。例如:顯示器、打印機等。
2.1.1 建立
virtual BOOL CreateDC(
LPCTSTR lpszDriverName,//設備的驅動名稱
LPCTSTR lpszDeviceName, //設備的名稱
LPCTSTR lpszOutput, //設備的接口
const void* lpInitData//設備的初始化參數
);
顯示器: CreateDC("DISPLAY",NULL,NULL,NULL);
2.1.2 使用
TextOut/MoveTo/LineTo/Rectangle/Ellipse...
2.1.3 刪除
DeleteDC( )
2.2 CClientDC類-父類是CDC類,表示的是某一個指定窗口的客戶區。
2.3 CPaintDC類-父類也是CDC類,表示的也是某一個指定窗口的客戶區。只在WM_PAINT
消息的處理函數中使用。
3 繪圖對象類的使用
3.1 畫筆、畫刷和字體的使用
3.1.1 建立繪圖對象
3.1.2 將繪圖對象選入到繪圖設備中
3.1.3 在繪圖設備中使用繪圖對象
3.1.4 恢復默認的繪圖對象
3.1.5 刪除繪圖對象
3.2 位圖的使用
3.2.1 建立位圖對象,加載位圖資源
3.2.2 建立與當前繪圖設備兼容的一個內存設備
3.2.3 將位圖選入到兼容設備中
3.2.4 將位圖從兼容設備拷貝到當前設備
3.2.5 刪除兼容設備
3.2.6 刪除位圖對象
3.3 區域的使用
3.3.1 建立區域
CRgn::CreateXXX
3.3.2 幾何運算(能夠屢次)
CRgn::CombineRgn
3.3.3 在繪圖設備填充區域
CDC::FillRgn
二 文件操做
1 相關類
1.1 CFile類-封裝了文件句柄和操做文件的API。
1.2 CFileFind類-提供文件的查找操做。
2 CFile類的使用
2.1 打開或者新建文件
CFile::Open
2.2 文件讀寫
CFile::Read/Write
2.3 關閉
CFile::Close
注意的問題: 1>文件操做一般放到異常處理結構中
2>讀寫時注意文件的指針位置
3 CFileFind類的使用
3.1 開始查找(在哪一個目錄下查找)
CFileFind::FindFile
3.2 查找下一個
CFileFind::FindNextFile
3.3 獲取和判斷文件信息
CFileFind::GetXXX/IsXXX
3.4 結束查找
CFileFind::Close
練習: 1 查找指定目錄下的文件和子目錄(只查找一層)
練習:2 查找指定目錄下的全部文件和子目錄(遇到子目錄繼續查找)
1> 使用遞歸
2> CFileFind::GetFilePath
3>排除.目錄 !CFileFind::IsDots()
三 序列化
1 概念
將數據以二進制流的方式依次寫入到文件和從文件中讀取的過程。
2 相關類
CArchive類-歸檔類,代替CFile::Read/Write完成具體的讀寫操做。
3 CArchive類的使用步驟
3.1 打開或者新建文件
CFile::Open
3.2 文件讀寫
3.2.1 定義CArchive對象
3.2.2 讀寫操做
<<,寫操做
>>,讀操做
3.2.3 關閉
CArchive::Close
3.3 關閉
CFile::Close

day9
一 MFC對話框
1 分類
模式對話框-阻塞的
非模式對話框
2 相關類
CDialog類-父類是CWnd類,提供了對話框的基本操做。
CCommonDialog類-父類是CDialog類,稱爲通用對話框類。包括如下六種不一樣的類型的
通用對話框,經過它的不一樣的子類實現的。分別是文件對話框、顏色對話框、
字體對話框、查找替換對話框、頁面設置對話框和打印對話框。
CPropertyPage類-父類也是CDialog類,稱爲屬性頁對話框。
3 CDialog類的使用
3.1 建立基於模式對話框的程序
3.1.1 添加對話框的資源模板,並與對話框類關聯
3.1.2 建立和顯示對話框
CDialog::DoModal
3.1.3 關閉
CDialog::OnOK/OnCancel
3.2 建立基於非模式對話框的程序
3.2.1 添加對話框的資源模板,並與對話框類關聯
3.2.2 建立和顯示對話框
與通常的框架窗口的建立方式相似
3.2.3 非模式對話框的關閉須要用戶處理
1> 重寫 CDialog::OnOK和 OnCancel函數,在函數中:
DestroyWindow( )
2> 重寫CWnd::PostNcDesroy函數,在函數中:
delete this;
4 在MFC嚮導程序中分別建立模式和非模式對話框
二 控件操做( 對話框數據交換技術)
1 概念
將控件與對話框類的成員變量綁定,經過操做變量的方式達到操做控件的目的。
2 實現步驟
2.1 在對話框類中添加變量
CButton m_wndOK;//控件類型的變量
CString m_strEdit;//值類型的變量
2.2 將控件與變量綁定(重寫CWnd::DoDataExChange函數)
DDX_Control(pDX,控件ID,m_wndOK);//控件類型的綁定函數
DDX_Text(pDX,IDC_EDIT1,m_strEdit);
2.3 控件類型的變量的綁定,直接調用變量的相關函數便可,例如:
m_wndOK.MoveWindow( )
值類型的變量的綁定,須要調用UpdateData(BOOL) 函數。
UpdateData(TRUE)-表示將用戶在控件中輸入的值傳遞給變量。控件=>變量
UpdateData(FALSE)-表示將變量的值放到控件中顯示。 變量=>控件

三 用戶登陸的例子
四 加法運算的例子
五 各類控件
1 靜態控件,包括圖片,靜態文本和分組框。
2 按鈕控件,包括下壓式按鈕、複選框和單選框。對應的控件類是CButton類。
3 組合框控件和列表框控件
3.1 組合框控件,能夠接收用戶的輸入也能夠在多個選項中選擇一項。
對應的控件類CComboBox類。
3.2 列表框控件,能夠在多個選項中選擇一項,也能夠選擇多項。
對應的控件類CListBox類。

day10
一 MFC的 各類控件
1 靜態控件,包括圖片,靜態文本和分組框。
2 按鈕控件,包括下壓式按鈕、複選框和單選框。對應的控件類是CButton類。
3 組合框控件和列表框控件
3.1 組合框控件,能夠接收用戶的輸入也能夠在多個選項中選擇一項。
對應的控件類CComboBox類。
3.2 列表框控件,能夠在多個選項中選擇一項,也能夠選擇多項。
對應的控件類CListBox類。
4 旋轉按鈕、進度條和滑塊控件
4.1 旋轉按鈕,對應的控件類是CSpinButtonCtrl類。
4.2 進度條,對應的控件類是CProgressCtrl類。
4.3 滑塊,對應的控件類是CSliderCtrl類。
5 列表控件,對應的控件類CListCtrl類。
5.1 列表控件有四種View:圖標、小圖標、列表和報表。
5.2 爲控件添加圖標列表
5.2.1 添加位圖資源,設計圖標列表。
5.2.2 使用位圖資源建立圖標列表
CImageList::Create
5.2.3 將圖標列表設置到控件
CListCtrl::SetImageList
5.3 插入列
CListCtrl::InsertColumn
5.4 插入選項
CListCtrl::InsertItem
5.5 設置選項的文本
CListCtrl::SetItemText
5.6 清空列表控件中的數據
CListCtrl::DeleteAllItems
5.7 設置控件的背景圖片
5.7.1 初始化Ole庫
AfxOleInit
5.7.2 設置背景圖片
CListCtrl::SetBkImage
5.7.3 設置字體的背景色透明
CListCtrl::SetTextBkColor(CLR_NONE)
6 樹控件,控件類是CTreeCtrl類 。
6.1 爲控件添加圖標列表
6.1.1 添加位圖資源,設計圖標列表。
6.1.2 使用位圖資源建立圖標列表
CImageList::Create
6.1.3 將圖標列表設置到控件
CTreeCtrl::SetImageList
6.2 插入樹節點
HTREEITEM InsertItem(
LPCTSTR lpszItem,//節點的文本
int nImage, //節點的圖標
int nSelectedImage,//節點被選中時的圖標
HTREEITEM hParent = TVI_ROOT, //默認值表示要插入的節點是根節點;不然該參數爲要插入節點的父節點。
HTREEITEM hInsertAfter = TVI_LAST//默認值表示在末尾添加節點;不然在該參數表示的節點以後插入節點。
);
6.3 獲取當前選中的節點
CTreeCtrl::GetSelectedItem
6.4 刪除節點
CTreeCtrl::DeleteItem
6.5 設置節點的文本
CTreeCtrl::SetItemText
7 屬性頁控件,控件類是CTabCtrl類。

day11
一 屬性頁對話框
1 分類
標籤式
嚮導式
2 相關類
CPropertyPage類-父類是CDialog類,稱爲頁面對話框類。
CPropertySheet類-父類是CWnd類,稱爲表單類。
一個完整的屬性頁對話框實例=一個表單對象+多個頁面對象。
例子:經過屬性頁對話框中的控件,配置視圖中圖形的線寬和顏色。
3 標籤式屬性頁的步驟
3.1 插入資源模板,雙擊生成對應的類,注意父類必定是CPropertyPage類。
3.2 在項目中添加CPropertySheet類的派生類CSetupSheet類。
3.3 在表單中添加頁面
CPropertySheet::AddPage
3.4 顯示對話框
CPropertySheet::DoModal
3.5 將應用按鈕設置爲可用
SetModified(TRUE)
3.6 消息處理 (虛函數)
CPropertyPage::OnApply
注意:當點擊應用按鈕時,全部頁面的OnApply都會被調用。
4 嚮導式屬性頁的步驟
4.1 插入資源模板,雙擊生成對應的類,注意父類必定是CPropertyPage類。
4.2 在項目中添加CPropertySheet類的派生類CSetupSheet類。
4.3 在表單中添加頁面
CPropertySheet::AddPage
4.4 設置爲嚮導模式
CPropertySheet::SetWizardMode
4.5 顯示對話框
CPropertySheet::DoModal
4.6 設置每一個頁面的嚮導按鈕(在頁面的OnSetActive虛函數中設置)
CPropertySheet::SetWizardButtons

入口函數(程序啓動)、消息映射、(命令)消息路由、運行時類信息、

MFC的第二部分 Windows平臺的數據庫訪問
1 簡單介紹
1.1 ODBC-Open Database Connectivity,微軟開放式數據互聯。它是一組用於訪問和
操做數據庫的Win32 API。可使用這組相同的API訪問不一樣類型的數據庫,
訪問以前,首先須要設置ODBC數據源。MFC將這組API進行封裝,造成了
ODBC類。
1.2 DAO-基於ODBC的,目前已經被淘汰
1.3 OLE DB-基於COM組件技術,提供了一組用於訪問和操做數據庫的接口。學習門檻高,
使用難度大,並無流行起來。
1.4 ADO-基於OLE DB之上,作了封裝和簡化,提供了更加簡單的訪問和操做數據庫的接口。
逐漸流行起來,成爲普遍使用的技術之一。

2 ODBC類的使用
2.1 相關類
CDatabase類-主要提供了數據庫的鏈接和關閉。
CRecordset類-主要提供了數據的操做(增刪改查)。
#include <afxdb.h>
2.2 設置ODBC數據源
控制面板\管理工具\數據源ODBC。
2.3 ODBC類的使用步驟

day12

一 使用Ado訪問數據庫
1 Ado是一個單獨的組件,VB、C++以及asp均可以使用它訪問和操做數據庫。
文件:msado15.dll
文件路徑:C:\Program Files\Common Files\System\ado\msado15.dll
2 導入Ado組件
#import "文件路徑" no_namespace rename("EOF","adoEOF")
通常對於MFC程序,導入組件的命令寫到頭文件 "stdafx.h"中。編譯項目,會在項目的
Debug目錄下生成msado15.tlh和msado15.tli兩個文件。
3 COM庫的初始化
3.1 一般在App::InitInstance()函數中完成COM庫的初始化
CoInitialize(NULL);
3.2 一般在App::ExitInstance()函數中完成COM庫的卸載
CoUninitialize( )
4 Ado組件的接口類
4.1 _ConnectionPtr類-功能相似於ODBC的CDatabase類。
4.2 _RecordsetPtr類-功能相似於ODBC的CRecordset類。
一般可使用C++的類封裝 Ado組件的接口類。
5 _ConnectionPtr類的使用
5.1 鏈接數據庫
HRESULT Open (
_bstr_t ConnectionString,//鏈接字符串
_bstr_t UserID,//登陸名稱
_bstr_t Password,//登陸密碼
long Options//鏈接方式,通常不指定,值寫 -1 便可。
);
不一樣類型的數據庫鏈接字符串各不相同,即便相同類型的數據庫因爲版本不一樣,鏈接
字符串也可能不一樣。咱們能夠經過vs2010自帶的工具經過配置生成鏈接字符串。
Access:"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\accounts.mdb"
5.2 關閉數據庫
Close
6 _RecordsetPtr類的使用
6.1 打開表
HRESULT Open (
const _variant_t & Source,//表名、Sql語句、存儲過程名稱
const _variant_t & ActiveConnection,//活動鏈接
enum CursorTypeEnum CursorType,//遊標類型
enum LockTypeEnum LockType,//記錄集的鎖定類型
long Options//adCmdTable/adCmdText/adCmdStoredProc
);
6.2 獲取字段數量
Fields->GetCount( )
6.3 獲取字段的名稱
Fields->GetItem(nIndex)->GetName( )
6.4 獲取字段的值
Fields->GetItem(nIndex)->GetValue( )
6.5 記錄集的指針操做
MoveNext( )
MovePrevious( )
MoveFirst( )
MoveLast( )
IsEOF( )
IsBOF( )
7 執行Sql語句
7.1 _ConnectionPtr類的Execute()函數,側重於完成對數據的增刪改操做。
7.2 _RecordsetPtr類的Open()函數,側重於完成查詢操做,特別是須要制定記錄集的
遊標類型和鎖定類型的時候。

day13

MFC的第三部分 Windows平臺的網絡通訊編程(Socket)
1 簡單介紹
1.1 基本的socket函數
1.2 以WSA開頭的socket函數
1.3 MFC提供的Socket類
2 基本的socket函數的使用(以2.2版本的庫爲例)
2.1 相關文件
dll文件:ws2_32.dll
lib文件:ws2_32.lib
h文件:winsock2.h
2.2 使用步驟
2.2.1 初始socket庫
int WSAStartup(
WORD wVersionRequested,//請求使用的庫的版本
LPWSADATA lpWSAData//返回可用的庫的信息
);
2.2.2 TCP或UDP通訊

2.2.3 卸載socket庫 WSACleanup( )3 TCP通訊 3.1 TCP服務器 3.1.1 建立 3.1.2 綁定 3.1.3 監聽 3.1.4 接收客戶端鏈接 3.1.5 通訊 3.1.6 關閉 3.2 TCP客戶端 3.2.1 建立 3.2.2 鏈接服務器 connect, inet_addr("127.0.0.1") 3.2.3 通訊 3.2.4 關閉 測試1:客戶端和服務器在不一樣的計算機。 測試2:啓動之前在UC編寫的socket服務器,使用vc編寫的客戶端去鏈接和通訊 。4 UDP通訊 4.1 UDP服務器 4.1.1 建立 4.1.2 綁定 4.1.3 通訊 4.1.4 關閉 4.2 UDP客戶端 4.2.1 建立 4.2.2 通訊 4.2.3 關閉 5 使用MFC的socket類完成文件傳輸 5.1 CAsyncSocket類-異步socket類。 5.2 CSocket類-同步socket類,父類是 CAsyncSocket類。 查看網絡端口狀態: netstat -an

相關文章
相關標籤/搜索