VC++教程課件資料_第1頁
VC++教程課件資料_第2頁
VC++教程課件資料_第3頁
VC++教程課件資料_第4頁
VC++教程課件資料_第5頁
已閱讀5頁,還剩166頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

VisualC++教程

希望電腦培訓中心

2002.3.19

1

主要內容

?MFC框架基礎(14)

?MFC文檔/視圖結構詳解(12^^

?VisualC++程序設計的其他方向、

?綜合應用程序舉例(2)

教材參考資料

C++程序設計錢能清華大學出財

VisualC++6.0技術內幕(第五版)David

J.KruglinskiMicrosoftPress

MFCVisualC++6編程技術內幕Eugene

Olafsen,KennScribner,K.DavidWhite機械出版

VisualC++聯(lián)機文檔(MSDN)

我的個人總結'

我的Email:linyu_xu@

第一部分MFC框架基礎

SDK風格的Windows程序設訐

MFC層次結構及Appwizard使用

用Appwizard開發(fā)的第一個M(1.5)

事件處理、映射模式及滾動視圖

GDI、顏色及字體(2)、

對話框及控件(2.5)

ActiveX及IE公用控件(1.5)

位圖(1)

應用框架開發(fā)技巧(2)

4

第二部分MFC文檔視圖結構

?菜單、鍵盤及命令處理(1)

O工具欄及狀態(tài)欄(1)

?文檔和視圖分離(1)

?SDI及MDI文檔的讀寫(4)

?打印及打印予覽⑴

拆分窗口及多視圖(1.5)

應用開發(fā)技巧(2)

5

第三部分MFC程序設計的其他方面

多線程程序設計(1)

數(shù)據(jù)庫程序設計(3)

動態(tài)連接庫程序設計(1)

TCP/IP網(wǎng)絡程序設計(2)(Sock和Hinlnet)

MFC和COM程序設計(2)

自動化⑴

多媒體程序設計和圖形程序設計(1)

應用開發(fā)技巧(2)1

6

第四部分綜合應用程序開發(fā)舉例

(2)、

7

第一部分MFC框架基礎

8

第一章SDK風格的Windows

程序設計

9

C++語言回顧

類和對象

C++語言的特點

構造函數(shù)與析構函數(shù)

操作符重載和友員

繼承、多態(tài)性

10

Dos下的消息處理

DOS操作系統(tǒng)

程序需要獲得用戶

擊鍵或使用操作系_________main。

統(tǒng)功能時,調用適匚

當?shù)暮瘮?shù)即可。

________________v________________

調用庫函數(shù)或

調用自定義函數(shù)

11

windowsT的消息處理

12

一個不用MFC框架的Windows

程序、

?必須有一個WinMain。函笳、如下:

-intWINAPIWinMain(HINSTANCE

Curlnstance,HINSTANCEPrelnstance^PSTR

CmdLineJntShowStyle)

?必須有-個消息處理函數(shù),格式如下(

-LongFARPASCALWndProc(HWND

hWnd,UINTmsg9WPARAM

wParam9LPARAMIParam)

13

WinMain的流程

WinMain的四個參數(shù)

?Curlnstance:當前實例的句

Preinstance:同一程序的前一個(一

次運行)

CmdLine:命令行參數(shù),是一個以''0'

結尾的ANSI字符串,不含應用程序名

?ShowStyle:顯示窗口的方式,有如下幾種:

-SW_SHOWNORMAL5SW_SHOWMINIMIZE

D9SW_SHOWMAXIMIZED

15

WndProc中不可缺少的default

分支

returnDefWindowProc(hwnd,msg9wParal^ffaram);

16

顯示一個字符串

第二章MFC層次結構及

Appwizard使用

?MFC層次結構介紹X

?Appwizard的使用詳解

一■個簡單的應用程序MyHello

18

程序分析

WinMain函數(shù)記住,Windows總每個應用

程序都要有WinMain函數(shù),之所以看不見,是

因為它被隱藏在應用程序框架內部\

當用戶運行應用程序時,windows自動調用應

用程序框架內部都WinMain函數(shù),WinMain函

數(shù)會去查找該應用程序的全局構造對象,該對

象有CWinApp所派生出來的類的對象,發(fā)現(xiàn)之后

則開始調用Initlnstance函數(shù)

第三章用AppWizard創(chuàng)建的第

一個MFC程代

)目的:如何編制一個具有一定品的MFC類庫

應用程序(引入簡單的視圖/文檔木踵)

,什么是視圖

-用戶角度:與其他Windows窗口一樣的窗口

-程序員:從MFC的Cview類派生的類的一個對象

單文檔界面和多文檔界面

-單文檔:一次只能打開一個文檔(NotePad)1

-多文檔:一次能打開多個文檔(Word)

20

觀察我們的第一個MFC程序

21

在視圖囪口中繪圖

-通過修改OnDraw()函數(shù)來完成繪圖

?是CView類的虛擬成員函數(shù),每次強圖重畫時調

用(WM_PAINT90nPaint90nDraw)

?如果程序的數(shù)據(jù)被改變,則可以調用視圖的

Invalidate。成員函數(shù),并最終調用OnDraw()

[InvalidatedWM_PAINT^OnDraw()]

?對視圖窗口的重畫不要過于頻繁

-畫圖過程中涉及的MFC類

?設備上下文

.其他圖形設備對象

22

設備上下文

Windows系統(tǒng)不允許直接硬件,

而是通過一個抽象層一設備上下文來進

行通訊

MFC編程中,設備上下文是CDC及其派

生類的對象

?添入代碼:

23

資源

?資源編輯器

-exO3a.rc包含

-加速器、對話框、圖標、菜單、字符串、X

具條、版本信息

-afkres.h(只讀符號),通用的MFC庫資源

-afkres.rc(通用組件),通用的MFC庫資源'

-resource.h(自定義符號)

24

Debug與Release目標

分兩個版本:發(fā)行版和調試

區(qū)別:源碼調試、診斷宏、鏈接庫、編

譯優(yōu)化等方面不同

啟用診斷宏(C:\WINNT\afx.ini

TraceEnabled=l)

-Tools/MFCTracer/enabletracing

予編譯頭文件(stdafk.cppstdafx.h)

-/Yc(stdafx.cpp)>/Yu(復用)、/Fp(pch文件路徑)編譯開關

第四章基本事件處理、映射模式

MFC類庫中有很多On-函數(shù)一由框架調用,完成對■管勺響應。

他們不是虛擬函數(shù),必須通過消息映射結構,使應由框架和我們的代碼

關聯(lián)

消息映射

-當用戶在視圖中按下鼠標,Windows發(fā)送

WM_LBUTTONDOWN消息給視圖窗口,視圖窗口

必須有一個OnLButtonDown(UINTnFlags,CPoint

point)成員函數(shù)來響應該消息,頭文件中加入消息處

理函數(shù)原型afk_msgvoidOnLButtonDown(UINT

nFlags,CPointpoint),通過消息映射宏將框架和函數(shù)

關聯(lián),將消息和消息的響應函數(shù)連接的過程稱為消

息映射。

26

消息映射的步驟:

—定乂函數(shù):voidCMyView::OnLButtonwn(UINT

nFlags,CPointpoint){...}

—函數(shù)原型:afxmsgvoidOnLButtonDown(UI

nFlags,CPointpoint)

-消息映射宏

?BEGIN_MESSAGE_MAP()

-ONWMLBUTTONDOWN

?END_MESSAGE_MAP()

-頭文件中添加:

?DECLARE_MESSAGE_MAP()

27

保存視圖的狀態(tài)

通過一些狀態(tài)的變化反映事件文檔類

之前,存放在視圖的數(shù)據(jù)成員中

-CRectm_rectEllipse;UE^TmnColor

數(shù)據(jù)成員初始化:放在視圖的構造函數(shù)中

-CEx04aView::CEx04aView():m_rectEllipse(0,0,200,20

0),m_nColor(GRAY_BRUSH){}

28

如何反映事件

?鼠標點擊不會引起重畫,需要調用〕、

-CWnd::InvalidateRect(LPRECTrect);

?視圖的客戶區(qū):

CRect,CSize,Cpoint及其相互運算

如何判斷點在矩形內部

-CRectrect;

-if(rect.PtInRect(point){...}

如何判斷點在區(qū)域內部

-CRgnrgn;

-rgn.CreateEllipticRgnlndirect(mrectEllipse);

-if(rgn.PtInRegion(point){...}

?實例

29

為使顯示與顯示分辨率無關,應使用不同于以

像素為單位的坐標系統(tǒng)

設備坐標以像素表示的坐冰

邏輯坐標當前映射方式下的坐標

映射方式邏輯坐標和設備坐標之間的比例關

系。

Windows映射方式

30

MMTEXT映射方式

邏輯坐標和設備坐標1:1

?坐標X向右增加,坐標Y向下增加

?通過調用CDC的SetWindowOrg,

SetViewportOrg改變原點

O)

31

固定縮放的映射方式

-向右X增加,向下Y減少

32

縮放可變的映射方式

-可以改變縮放因子和原點

-MMISOTROPIC和MMANISOTROPIC

-MM_ISOTROPIC縱橫比始終是1;1

-MMANISOTROPIC可以分別改變X和Y縮放因子

33

坐標轉換

T重要的規(guī)帥\

-CDC的成員函數(shù)使用邏輯坐標

-CWnd的成員函數(shù)使用設備坐標

-在設備坐標系中進行擊鍵測試如(CRect::PtInRect)

-用邏輯坐標存儲長期的值。

-CDC的函數(shù)LPtoDP和DPtoLP負責兩個系統(tǒng)之間的

轉換。

-在CView::OnPrepareDC()中完成映射方式設定。

-編程示例

34

滾動窗口

?當窗口比屏幕大時,可能需要急現(xiàn)口。

?通過從CScrollView中派生視圖類可以實現(xiàn)。

?在OnInitialUpdate()中定義邏輯大小和訊射方式。

?見舉例

35

第五章圖形設備接口

?所有與繪制有關的操作都要用益、^素

設備上下文是最重要的GDI元素,代表某個具

體的物理設備

36

設備上下文類

基類是CDC,每個設備上下文對第二個

Windows設備上下文,由32位HDC屬電機識

CDC類的虛擬性是應用框架的一個重要特性。

?………

37

構造和銷毀

-構造設備上下文對象后,應及時銷毀,Windows限

制可獲取設備上下文的數(shù)量。

-構造的兩種方法

38

使用CDC對象繪圖時,屏幕上的容依賴于設

備上下文的當前狀態(tài):

-繪圖需要的相關對象:筆、刷子、字體

-映射方式

-其他方面(文本對齊方式、填充方式等)

39

CPaintDC類

重寫了OnPaint函數(shù)后,需要用品|靴tDC類

OnPaint用正確設置的CPaintDC調用OnDraw();

40

圖形設「接口對象

CBitmap

CBrush

CFont

CPalatte

CPen

CRgn

41

如何構造和銷毀

一步構造

-CPennewPen(PS_DASHDOTDOT,2,(COLDRREF)0);

先定義對象,再創(chuàng)建

-CFontfont;

-font.CreateFont(30,10,0,0,400,FALSE,FALSE,0,

ANSLCHARSET,OUT_DEFAULT_PRECIS,,

CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,

DEFAULT_PITCH|FF_MODERN,"CourierNew");//

TrueType

如何斷開其與設備上下文的關系

-先選出設備上下文,然后析構

-庫存GDI對象自動析構

42

Windows顏色映射

?Windows圖形設備接口提供獨立于溫歸喳^接口

程序中的絕對顏色代碼由圖形設備接口調寸到視頻卡

的某種或某幾種顏色的組合。

?VGA模式下提供16種標準純色

256色視頻卡提供20種標準純色

?16位顏色視頻卡,可以顯示32768中顏色。

?24位真彩色。

43

字體

?字體是GDI對象

?字體的選擇

-與設備無關的Ttuejype字體和與設備有關的字體

(Windows系統(tǒng)顯示字體和LaserJetLinePrinter字體)

-MFC提供選擇準確的打印機字體和大小,然后盡力

使顯示最好。

?打印字體

-以磅來度量

?顯示字體

-顯示字體和打印字體一般不能嚴格匹配,除非使用

MMJTEXT方式。

44

計算字符高度

計算字符高度

字體高度=tmHeight-tm!ntemalGM^^數(shù))

行i^^tmHeight+tmExtemalLeading

對應TEXTMETRIC和GetTextMetrics(&tm);']

46

舉例1

47

舉例2

48

舉例3

49

第六章模態(tài)對話框和Windows公用控

模態(tài)和非模態(tài)對話框

-模態(tài):在對話框關閉之前,不能轉到其他窗

口工作

-非模態(tài):可以轉到其他窗口,但對話框在最

頂端

50

對話框與其他窗口類的不同

對話框是基于資源的,資舒M苦包含

的元素和布局。

對話框包含的窗口元素:控件

一個從CDialog類派生的MFC類完成和對

話框界面的聯(lián)系

51

模態(tài)對話框編程

?編程步驟

-使用對話框編輯器創(chuàng)建對話框資滿

-ClassWizard生成派生對話框類

-ClassWizard添加數(shù)據(jù)成員

-ClassWizard消息映射

-特殊控件初始化

-在視圖中編寫代碼,激活對話框對象

舉例1

52

對話框的運行過程

Cdialog::DoModal()Cdialog::OnOK

OnlnitDialogUpdateData(TRUE)

□Dialog::OnInitDialog

DoDatExchange

53

增強對話框程序

控制OnOK的退出、

?OnCancel處理

掛接滾動條控件

?改進的exO6a

54

識別控件

CWnd指針和控件ID

GetDlgltem返回CWnd指針

GetDlgCtrllD返回ID

設置對話框背景和控件的顏色

(WMCTLCOLOR——OnCtlColor)

?在對話框窗口內部畫圖

?運行時增加控件

55

Windows公用控件

在Windows95中引入,NT也提模

包含在comctl32.dll動態(tài)連接庫中

窗口過程函數(shù)及窗口類注冊代碼包含在該庫中

DLL加載時注冊窗口類、

對公用控件,ClassWizard不能提供數(shù)據(jù)成員支

持,但提供通知消息的映射

應在OnlnitDialog和OnOK中分別初始化和讀取

控件數(shù)據(jù)

56

幾種Windows公用控件

進度指示器控件,對應C++類是CProgressCtrl,

可以調用其成員函數(shù)SetRange和SetPos進行初

始化或更新操作

Slider(跟蹤欄控件),對應的C++類是

CSliderCtrl,不需要映射WM_HSCROLL和

WMVSCROLL即可滾動。

57

幾種Windows公用控件

Spin(微調控件),對應的、

CSpinButtonCtrl,經(jīng)常和一個編輯起使

用,號/伙伴”,編輯控件的Tab順序僅在

Spin之前。SetRange。和SetAccel。及AutoBuddy

和SetBuddyInteger鹿性

58

幾種Windows公用控件

?列表控件,對應的C++類是需要一

個圖片文件夾,CImageList類的對

樹型控件,對應的C++類是CTreeCtrL凡■

HTREEITEM而不是整型索引,插入時他用

TVINSERTSTRUCT結構

59

控件通知消息結構

早期的Windows控件利用WM_》MMAND發(fā)

送通知消息

對于Windows公用控件來說,標準的32位

wParam和IParam參數(shù)是不夠的I

60

結構如下:

舉例2

第七章非模態(tài)對話框

本章介紹非模態(tài)對話框和Windows公用對話本

非模態(tài)對話框:在對話框活動木同時允

許在其他地方工作。

公用對話框包括:文件、頁面設置、顏

色選擇等,包含在comdlg32.dll中

62

非模態(tài)對話框

?MFC中類CDialog為基類

?創(chuàng)建:

-(1)調用CDialog的缺省構造函數(shù)構造對象

-(2)調用CDialog::Create(IDD)創(chuàng)建

可以通過向視圖發(fā)送用戶定義的消息處

理按鈕消息。

(1)SendMessage()

(2)PostMessageQ

63

舉例1

64

Windows公用對話框

CColorDialog

CFileDialog

CFindReplaceDialog

CPageSetupDialog

CFontDialog

CPrintDialog

直接使用公用對話框類

66

Windows公用對話框

?派生新類

?對話框嵌套、

-創(chuàng)建帶有一個特殊成組框的對話框(成組

ID=0x045f)

第八章使用ActiveX控件

1991年推出VB,同時弓|入VBX

VBX被證明是成功的,但它是16品結構的,

不能移植到32位系統(tǒng)

ActiveX是基于COM技術的VBX的強有力的替

ActiveX的開發(fā)可以用MFC和ATL

ActiveX可以在VB和VC中使用

68

普通控件和ActiveX控件

普通控件

-都是子窗口(經(jīng)常在對話框中使用)、

-通過MFC類對象操控

-客戶程序負責創(chuàng)建控件的子窗口

-控件向父窗口發(fā)送標準Windows消息

(BNCLICKED)

-父窗口通過調用對應控件的C++類的成員函數(shù)操作

控件

69

普通控件和ActiveX控件

ActiveX控件

-屬性和方法

-屬性具有符號名字(可以匹配到整型索引)和類型

-方法與函數(shù)非常相似,

-不是向控件容器發(fā)送WM_通知消息,而是“觸發(fā)”

事件入Clicked事件

-可以沒有窗口,窗口的創(chuàng)建是通過控件自己1

(CreatedInplaceactivation)

-常用動態(tài)連接庫存放,但其擴展名是OCX

70

使用ActiveX控件

?安裝

-拷貝相關文件到系統(tǒng)目錄下(*.ocx,*.hlp,*」ic等)

-運行Regsvr32注冊

將想要的控件加到項目中

71

ActiveX控件容器的編程

Calender控件

訪問屬性

控件的C++包裝類

AppWizard中對ActiveX的支持

-AfxEnableControlContainer()

-Stdafk.h中B^#include<afxdisp.h>

利用ClassWizard添加針對ActiveX控件的數(shù)據(jù)

成員和事件處理函數(shù)

72

數(shù)據(jù)成員

可以向對話框類添加兩種數(shù)據(jù)成員

-針對ActiveX控件某個屬性的,可以在控件顯才工前控制

其屬性的值

-針對ActiveX控件的對象數(shù)據(jù)成員,可以方便地操作屬性等

?映射控件事件,

將控件鎖定在內存種

-AfxOleLockControl(m_Cal.GetClsId())

-AfxOleUnlockControl(

一個示例

73

第九章InternetExplorer4控件

發(fā)布IE4的同時,帶有新的COMCTL32.DLL,稱IE4公用控件

IE4公用控件介紹

-日期和時間選取器

-月歷

-IP協(xié)議地址控件

-擴展組合框

?示例

74

第十章位圖

?位圖就是一個位矩陣,影射到顯示器的象靠鼠J

?GDI位圖和DIB位圖

?GDI位圖由MFC的類Cbitmap代表

GDI位圖在同一臺機器的不同程序間可以傳輸,

但不同機器間不可以

DIB帶有自己的顏色信息

彩色位圖和單色位圖

75

使用GDI位圖

?位圖也是GDI對象之一

?首先創(chuàng)建位圖

創(chuàng)建內存設備上下文CreateCompatibleDC

?將位圖選入內存設備上下文SelectObject,

從內存設備上下文將位圖畫到實際的設備上下

文BitBlt或StretchBlt。

76

使用GDI位圖

從資源中裝載位圖

77

映射模式的效果

?如果映射模式不是MMJTEXT,則位圖可能會變形

使用pDC->SetStretchBltMode(OLORONCOLOR);

調用可以使顯示效果好一些

?也可以通過位圖拉伸解決問題

?示例

78

D舊位圖/調色板編程

如果你的程序顯示單一DIB位圖

-創(chuàng)建邏輯調色板(包含DIB位圖的顏色宿息)

-將邏輯調色板“實現(xiàn)”到硬件系統(tǒng)調色板

.如果你的程序是前臺程序,實現(xiàn)過程將把DIB位圖的所有

顏色拷貝到系統(tǒng)調色板(236種顏色,20種由系統(tǒng)保留)

?如果另一個程序是前臺程序,且要顯示236級的綠色場景,

則在你的邏輯調色板和系統(tǒng)調色板之間建立映射,假如有

一個品紅色,則將被映射位標準紅色,如果忘了實現(xiàn)調色

板,則將被映射為綠色

79

何時“實現(xiàn)”調色板

任何程序實現(xiàn)其調色板的時候、^轡序的主

窗口將收至UWM_PALETTECHANGED消息

你程序中的任何-個窗口得到焦點時w

WMQUERYNEWPALETTE消息發(fā)送

在主框架窗口中應響應這兩種消息■

用pDC->SelectPalette()將邏輯調色板選入4

用RealizePalette實現(xiàn)

D舊、象素和顏色表

一個DIB由一個兩維的象素矩港&

每個象素由1、4、8、16、32個位處成.

對于16bpp、24bpp>32bpp的DIB,每個象素是

—jRGB顏色

lbpp>4bpp>8bpp的DIB,有一個顏色表,每

個象素是一個指向顏色表的索引

當需要顯示的顏色多于顯示卡能顯示的顏色時:

-如果DIB包含重要顏色表

-CreateHalftonePalette

81

D舊位圖的結構

BITMAPFILEHEADER結構

-包含到映象位矩陣的偏移量

BITMAPINFOHEADER

-DIB位映象按列、行組織

-從最底行開始

-每行填充到4字節(jié)對齊

83

D舊存取函數(shù)

SetDIBitsToDevice:按一個位圖成一個顯

示象素或一個打印點顯示

StretchDIBits:類似于StretchBlt()

GetDIBits從一個GDI位圖構建DIB

CreateDIBitmap:從DIB構建GDI位圖

CreateDIBSection:創(chuàng)建一個稱為DIB段的特殊

DIB,返回一個GDI位圖句柄

84

構建自己的Cdib類

示例

85

在按扭上放置位圖

86

第二部分MFC文檔/視圖結構詳解

87

第一章菜單、鍵盤加速器及屬性表

本章的主要內容是菜單和命令嘉耀色

同時介紹:

-框架、文檔和視圖的關系

-命令用戶接口更新函數(shù),

-鍵盤加速器、

以RichText控件和屬性表來介紹

88

主框架窗口和文檔類

?SDI模式和MDI模式中的各種窗口

?文檔類X.

Child

windows

Windows菜單

一般由水平菜單列表及附屬的彈出式菜單組成

一般為框架窗口定義默認的菜單資源,創(chuàng)建時

自動裝載、

也可以定義獨立的菜單,用戶程)次裝載

彥Compileex13aView.cppCtrl+F7

Buildexl3a.exeF7

圈RebuildAll

BatchBuild..

Clean

StartDebug?F5

?}Stepjrrto

DebuggerRemoteConnectionF11

!Executeex13aexeCUI+F5"llRuntoCursorCtrl+F1O

AttachtoProcess...

SetActiveConfiguration...-

Configurations...

鍵盤加速鍵

選擇菜單命令的快捷方式(定義菜單時字母前導父

加速鍵:通過把一個組合鍵和命令ID對應即可y|

91

命令處理

應用框架為菜單、加速鍵、工具條、對話框操作產生

的命令消息提供消息路由

?路由的順序如下:\

命令消息映射的步驟:

?一個消息處理函數(shù)

?函數(shù)原型

消息映射表中的一個入口

ON_COMMAND(IDC_TEST,OnTest)

92

命令消息處理的另一條路徑--派生類中的命

令消息處理

?命令消息的路由系統(tǒng)是命2海處理的

.條路往

?類遺傳樹是另-條路徑

-類繼承時同時繼承了全部命令消息函數(shù)和消

息映射表項

-要覆蓋父類的命令消息處理,必須添加派生

類的對應命令消息函數(shù)利消息映射表項

93

更新命令用戶接口處理程序

菜單的外觀需要根據(jù)程序的狀態(tài)調整

菜單第一次顯示的時候調用

?空閑的時候

只能處理彈出式菜單項

94

起源于對話框的命令

如果對話框按扭要發(fā)送命令消》必須在

0X8000—OXDFFF之間

這樣按扭產生的消息是可路由的,可虱在視圖

類或其他地方處理w|

可以先在符號表中添加一個符號,指定其值在

0X8000—OXDFFF之間,然后將控件ID指定為

該ID即可

95

內置框架菜單項

利用AppWizard生成的程序帶黑認的菜

?菜單的項目根據(jù)選擇項的不同而不同、

對于沒有命令處理函數(shù)的菜單項,框架自動禁

用之

96

MFC的文本編輯選擇

利用TextBox或RichTextBox控件

?CEditView是基于TextBox的,文本64K以下,

不支持混合字體

CRichEditView,支持混合字體,大批量文本,

主要用于ActiveX

CRichEditCtrl,與CRichEditView類似

?一個示例

97

屬性彳

?屬性頁

?創(chuàng)建過程

-創(chuàng)建一系列對話框模板

-為每個模板生成一個類,基類CPropertyPage

-ClassWizard生成從CPropertyShcet中派生的類

-針對每個頁面添加一個數(shù)據(jù)成員到屬性表類中

-在構造函數(shù)中逐一調用AddPage

-構造屬性表的一個對象,然后調用DoModal()

98

屬性表的數(shù)據(jù)交換

一個示例

99

CMnu菜單類

創(chuàng)建菜單資源

在程序中創(chuàng)建CMenu對象

調用對象的LoadMenu()

調用某個窗口對象的SetMenu

使用完成后調用Detach,分離出HMENU句柄,

以備再次使用

100

浮動菜單及擴展命令處理程序

?使用菜單編輯器新建菜單

在需要的窗口類中映射WM_GQNTEXTMENT

消息

在消息處理函數(shù)中彈出菜單V

101

第二章工具欄和狀態(tài)欄

控制攔和應用程序框架

-工具欄是CToolBar的對象,狀態(tài)欄是演tatusBar的

對象,兩者都是CControlBar的派生類

?應用框架負責對象的構造,析構、窗口的創(chuàng)建

AppWizard在框架窗口的派生類中創(chuàng)建代碼

102

工具攔

?工具條位圖由一組圖形按扭組成,的畿一文件中

?工具條按扭的狀態(tài):

TBSTATE_ENABLED,TBSTATE_PRESSEDJBSTATE

CHECKED一

工具欄和命令消息

-工具條按扭-般映射一個菜單項,也可以單獨

工具欄也采用更新命令消息處理(UI)來更新

工具提示1

?一個示例

103

狀態(tài)欄

?狀態(tài)欄的定義在數(shù)組indicators中

消息行:調用SetPaneTetxt。設置文1

自己控制狀態(tài)欄:用另一個ID替代

AFXIDWSTATUSBAR,還要:

替換創(chuàng)建函數(shù),映射視圖中關閉和打開狀態(tài)欄的消息ID_VlEW_NATUSBAR

一個示例

Messagepane(subscript0)CAPNUMSCRLJ

StaticUINTindicators1]=

ID_SEP/?ATOR(

IDINDICATORCAPS.

IDJNDICATOR.NUM.

IE重組控件欄

提供工具夾,從而可以水平或垂直移動

內部可以使用下拉式菜單等

CReBar^CReBarCtrl

一個示例

pp:〃神w.而cd舞/二,LinksBestoftheWeb§ChannelGuide初8舶帆

GripperChildwindowBand1LabeltextBand2

bar(combobox)

1VJ

第三章從視圖中分離文檔

106

文檔和視圖交互的函數(shù)

文檔保存數(shù)據(jù),視圖顯示和編/喋據(jù)

CView::GetDocument得到對應的文檔對象

CDocument::UpdateAllViews更新所有的視圖

對象

CView::OnUpdate由框架調用響應

UpdateAllViews調用

CView::OnlnitialUpdate視圖初始化

CDocument::OnNewDocument新建文檔對象時

調用

107

最簡單的文檔視圖結構

?單文檔/單視圖結構

在文檔類中添加數(shù)據(jù)成員(共有

?重寫視圖類的OnlnitialUpdate成員函lol

在視圖的OnDraw函數(shù)中使用文檔類的數(shù)據(jù)成

108

最簡單的文檔視圖結構

?整個流程如下:

?一個示例

109

更高級的文檔/視圖結構

單文檔/多視

在派生文檔類中添加數(shù)據(jù)成員

在派生視圖類中重寫OnUpdate虛擬成員函數(shù)

分析命令消息,分別放在文檔或視圖類中

在派生視圖類中合適的函數(shù)中更新文檔的數(shù)據(jù)

成員

在文檔類合適的函數(shù)中調用UpdateAllViews更

新視圖

110

流程

112

第四章文檔讀寫

113

SDI應用程序的文檔讀寫

串行化(Serialization):將對磁盤上或

從磁盤上恢復的過程

?代表的函數(shù)時:Serialize()

文檔的全部對象存在一個文件中,不能奉獨存

磁盤文件和歸檔

MFC的Cfile類的對象代表磁盤文件

如果你的程序不直接操作磁盤這件,則可以通

過Carchive歸檔對象進行

Persistent

documentobject

CArchiveobjectCFileobject

TheSena£zefunctioniscalledby

theapplicationframeworkwhen

theFileOpenorFileSave

commandischosen

如何串行化

使類成為可串行化的類:DECLARE_SERIAL(類名),

IMPLEMENT_SERIAL(類名,基類名,模式號)

編寫一個Serialize。函數(shù)

在派生類的Serialize。函數(shù)中調用基區(qū)的Serialize。函數(shù),

如果基類是CObject,則不必調用,

Serialize(Carchive&ar)的參數(shù)是一個歸檔類對象的弓|用

歸檔類重載了插入和提取操作符

116

從歸檔類中載入對象

內嵌對象

-必須直接在內嵌對象上調用其串行S函數(shù)4

-之前必須創(chuàng)建該對象

內嵌指針對象

-可以先創(chuàng)建指針對象,然后調用串行化函數(shù)

-也可以直接讀入指針對象(動態(tài)對象創(chuàng)建)

117

對象動態(tài)創(chuàng)建過程

確認對象所屬的類

在堆中申請對象所需的內存、

?將對象的數(shù)據(jù)載入申請的對象的內存

返回申請對象的指針

118

集合類的串行化

集合類的基類是CObject,都支持串行、

如果集合包含不同類對象的指針,則其強的類名都

存入歸檔對象

容器對象(入文檔)包含集合對象,載入的數(shù)據(jù)直接

添加到現(xiàn)存的集合中,所以,在載入之前要清除集合

對象(DeleteContents。)

文檔對象只要聲明DECLARE_DYNCREATE和

IMPLEMENT_DYNCREATE()即可,因為文檔對象從

不和歸檔對象的插入和提取符結合,也不會成為集合

類的元素,其他類都應聲明DECLARE_SERIAL和

IMPLEMENTSERIAL

119

SDI應用程序

Windows應用對象

-每個應用由AppWizard產生的由CWinApp派醇I勺類,并創(chuàng)建全

局對象theApp;

Windows應用的啟動過程

-Windows將程序載入內存

-構造全局對象theApp

-Wind。ws調用全局函數(shù)WinMain()

-WinMain尋找唯一的一個CWinApp的派生類的對象

-WinMain調用theApp的InitlnstanceQ函數(shù)

-你的重寫的InitlnstanceQ啟動載入文檔并顯示主框架窗口和視

圖窗口的進程

-WinMain調用theApp的Run()函數(shù),進入消息循環(huán)

120

文檔模板類

?建立了應用類、文檔類、視圖飛架窗口類

之間的關系

?對象的動態(tài)構造解決類用戶復雜的硬編碼4

?RUNTIMECLASS宏

121

類之間的關系見圖

122

對象間的關系見圖

CWinApp

CViewCView

CFrameWnd

CDocument

文檔模板資源

AddDocTemplate。的第一個參數(shù)是

IDRMAINFRAME,是字符串表的一個資源編

號一

?其結構如下:

124

CWinApp::OnFileNew()

在調用完Initlnstance()之后,調用CWinApp::OnFileNew()[通過

CWinApp::ProcessShellCommand]完成堀下操作:

構造文檔對象,但不載入數(shù)據(jù)(串行底、

構造主框架對象,并創(chuàng)建主框架窗口(IDF&MAINFRAME菜單,

工具條,狀態(tài)條),但不顯示

構造視圖對象,并創(chuàng)建視圖窗口,但不顯示I,

建立文檔、主框架、視圖對象之間的關系

調用虛擬CD。?!??!ㄘ百齟加,該函數(shù)調用

DeleteContents

調用視圖的C百加力.〃/功正加函數(shù)

對框架對象調用虛擬的CFrameWnd::ActivateFrame,顯示主框

架窗口、菜單,工具條,狀態(tài)條

125

關于文檔類的其他操作

OnNewDocument()函數(shù),完成一些初始化操作

將文件打開操作和串行化代碼關聯(lián)

-提示用戶選擇文件、

-對已存在的文檔對象,^^CDocumeitii^OnOpenDocument,

該函數(shù)調用CDocument::DeleteContents歸檔對象,調

用Serialize載入數(shù)據(jù)

-調用CView::OnInitialUpdate()

文檔類的DeleteContents。命以函數(shù):如果彳港從磁盤

載入文檔數(shù)據(jù)(OnFileNew和OnFileOpen),應先調

將存盤和另存操作和Serialize。關聯(lián),兩個操作都要

調用OnSaveDocumentOQnSaveDocument。要調用

Serialize()

文檔“臟”標志,文檔類的數(shù)據(jù)成員m_bModifled表

示,通過SetModifiedFlag。和IsModifled。

?示例

126

MDI應用程序的文檔讀寫

多文檔應用程序與單文檔應用程序的啟動流程基本一致

多文檔模板類CMultiDocTemplate

MDI框架窗口和子窗口:一個MDI應用擁有一個主框架窗口和多

個子框架窗口

主框架窗口直接創(chuàng)建,而子框架窗口則在打開小

MD!main

frame

window

MDI應用程序的文檔讀寫

主框架和文檔模板資源

MDI應用有兩個獨立的字符串和菜單資源分別

IDR_MAINFRAME和IDR_EXnnTYPE,前者代表只有空的主框架

窗口廚的資源—

128

OnFileNew函數(shù)

構造文檔對象,但不載入數(shù)據(jù)

構造子窗口對象,創(chuàng)建子窗口,但不顯示

構造視圖對象,創(chuàng)建視圖窗口,但不顯示

建立文檔、子框架、視圖對象之間的關聯(lián)

調用OnNewDocument

調用OnlnitialUpdate

對子框架窗口調^ActivateFrame

129

對已存在的文檔,創(chuàng)建另外的視圖

構造子窗口對象,創(chuàng)建子窗口,但不顯示

構造視圖對象,創(chuàng)建視圖窗口,但不顯示

建立文檔、子框架、視圖對象之間的關聯(lián)

調用OnlnitialUpdate

對子框架窗口調^ActivateFrame

130

第六章打印和打印予覽

Windows通過提供各種打印機的驅動程序和統(tǒng)”變成接口簡化

了打印編程

標準打印機對話框

交互打印紙張選擇

打印時顯示張數(shù)/打印張數(shù)

131

打印機編程

MFC框架對打印及打印予覽提供很多功能,稱出了數(shù)

設備上下文和OnDraw(0函數(shù):OnPrint->OnDrawOnPain

>OnDraw'

OnPrint。:可以添加打印特有的代碼1

OnPrepareDC:在OnPrint之前調用,

OnPreparePrinting:設置頁碼等

OnBeginPrinting:OnEndPrinting

132

一打印機編程

幾個函數(shù)之間的關系:

示例

133

第七章切分窗口及多視圖

切分窗口是框架子窗口,分幾片,每片容笳、對象

一個CSplitterWnd類的對象代表切分窗口

切分窗口對象完全擁有框架窗口(SDI主框架或MDI子框架)的

客戶區(qū),視圖擁有切分窗口每片的區(qū)域

切分窗口不參與命令分發(fā)

134

多視圖的幾種選擇

SDL切分窗口,單一視圖類

SDL切分窗口,多視圖類

SDL無切分窗口,多視圖類

MDL無切分窗口,單一視圖類

MDL無切分窗口,多視圖類

MDL切分子窗口

135

動態(tài)與靜態(tài)切分

動態(tài)切分

-允許用戶在任何時候切分或取消切分窗口、

-切分窗口創(chuàng)建時,左上角的片被初始化為特定的視力

靜態(tài)切分

-窗口創(chuàng)建時切分,不能改變

-可以多個視圖類

示例1,2,3,4

136

第三部分MFC程序設計的其他方面

137

第一章多線程程序設計

放棄控制權

?Windows是搶占式多任務系統(tǒng)

針對慢應用程序,可以修改消息彳春;在應用

程序運行中放棄控制權d

139

定時器和閑置處理

在多線程出現(xiàn)之前,人們采用定洞瞬和閑置處

理解決問題

?示例

140

多線程編程

?線程和進程

?用戶界面線程和工作者線程

編寫工作者線程

啟動工作者線程

141

主線程與工作者線程的通信

全局變量

線程同步事件

142

第二章數(shù)據(jù)庫程序設計

關系數(shù)據(jù)庫基本概念

-表、列、記錄、游標、事務

SQL語言:

-SELECT>INSERT>DELETE>UPDATE

MFC支持以下數(shù)據(jù)庫接口

-ODBC(OPENDATABASECONNECTIVITY)

-DAO(DATAACCESSOBJECT)

-OLEDB

-ADO(ACTIVEXDATAOBJECT)

143

2.1ODBC/MFC

ODBC是訪問不同數(shù)據(jù)庫渝海電按口,以

API函數(shù)的形式提供

MFCODBC是微軟對通用ODBCAPI以類

的形式進行了封裝u

提供CDatabase、CRecordSet>

CRecordView類

必須覆蓋的虛擬成員函數(shù):1

GetDefaultSQL()9GetDefaultConnect()

144

2.2DAO

?微軟提供的針對Microsoft'據(jù)庫引擎

的接口

提供CDaoWorkspace、CDaoDatabase>

CDaoRecordset、CDaoTableDef>

CDaoQueryDef等類

145

2.3OLEDB

數(shù)據(jù)存取技術從數(shù)據(jù)庫發(fā)展向?M曾數(shù)據(jù)源

軟件開發(fā)的發(fā)展要求:使用組件形學的可重用

軟件包

兩者結合導致UDA即統(tǒng)一數(shù)據(jù)存取(Universal

DataAccess)

UDA的重要組件:OLEDB

微軟還提供另一種獨立于語言的接口ADO,是

基于OLEDB的

146

OLEDB

?定義了以組接口,用于和。蜘數(shù)據(jù)源

交互,提供和消費數(shù)據(jù)

?基于COM的,

?在標準的C/S模式中,數(shù)據(jù)的源成,

Provider,數(shù)據(jù)的使用者稱consumer

我們介紹OLEDBconsumer程序的設計

147

OLEDBConsumer程序的設計

?在工程中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論