MFC界面程序

目錄 數據庫

1、MFC簡介... 4 編程

1.MFC的組織結構... 4 windows

(1)根類... 4 api

(2)應用程序體系結構類... 4 數組

(3)可視對象類... 6 緩存

(4)通用類... 7 安全

(5)OLE類... 8 網絡

(6)ODBC數據庫類... 8 session

2.全局變量和函數... 9 多線程

3應用程序嚮導Wizard. 9

2、windows標準控件... 9

1.按鈕... 9

(1)建立按鈕... 9

(2)和按鈕有關的消息... 10

(3)可能用到的成員函數... 11

2.滾動條... 11

(1)建立滾動條... 11

(2)和滾動條有關的消息... 12

(3)可能用到的方法... 12

3.靜態控件... 13

(1)建立方法... 13

(2)和該控件有關的消息... 13

(3)可能用到的函數... 13

4.列表框... 13

(1)建立列表框... 13

(2)和列表框有關的消息... 14

(3)可能用到的函數... 14

5.編輯框... 16

(1)Cedit的樣式... 17

(2)和編輯框有關的消息... 17

(3)可能用到的函數... 18

6.組合框... 19

(1)組合框的樣式... 20

(2)和組合框有關的消息... 20

7.對話框通用控件... 22

(1)Picture. 22

(2)Spin. 22

(3)Progress 23

(5)Date Time Picker 25

(6)List Control 25

(7)Tree Control 28

(8)Extended Combo Box. 33

3、資源... 35

1.菜單... 35

(1)程序主菜單... 35

(2)快捷菜單... 37

(3)工具欄菜單... 39

2.加速鍵... 42

3.字符串... 42

4.對話框... 43

(1)CDialog可能用到的函數... 44

(2)在資源視圖中插入新的Dialog,編輯須要的控件... 44

(3)爲這個對話框創建關聯的類... 44

(4)在對話框類中爲須要的控件添加須要的數據變量... 44

(5)在須要的源文件中使用這個對話框類... 44

5.圖標... 45

6.位圖... 45

4、單文檔SDI和多文檔MDI界面... 46

1.可能用到的概念... 46

2.消息映射... 47

3.核心類... 49

(1)CWinApp. 49

(2)CDocument 49

(3)CView.. 51

(4)CDocTemplate. 52

(5)CFrameWnd. 53

(6)5個核心類的相互訪問... 54

4.在程序嚮導上建立SDI和MDI程序... 54

(1)SDI 54

(2)MDI 54

5.MFC多線程... 58

5、數據庫... 58

1.有關數據庫的基礎知識... 58

(1)CRecordView.. 58

(2)CRecordSet 58

(3)CDatabase. 60

(4)RFX.. 61

(5)CDBException. 61

2.創建ODBC數據源... 61

3.顯示數據庫中的數據... 62

4.對記錄進行排序... 62

5.增添記錄... 63

6.刪除記錄... 64

7.查詢記錄... 66

8.修改記錄... 67

9.移動到指定的位置... 68

6、多媒體... 69

1.音頻播放... 69

(1)使用音頻函數的方式... 69

(2)使用MCI的方式... 70

2.視頻播放... 78

3.圖片顯示... 79

(1) 建立SDI工程... 79

(2) 在View類中添加數據成員:... 79

(3) 新數據成員的初始化和銷燬:... 79

(4) 經過菜單項打開文件:... 80

(5) 對圖片進行繪製:... 82

7、網絡編程... 84

1.利用WinInet抓取網頁... 84

8、附錄... 86

1.vs的快捷鍵... 86

正文

1、MFC簡介

MFC即Microsoft Foundation Class,封裝了不少windows api和windows控件,能夠明顯的縮短程序設計的週期(填充框架、添加功能便可)

1.MFC的組織結構

按照結構和功能上分類

(1)根類

CObject是MFC中大多數類的基類,這個類有序列化、查詢對象運行時信息等功能,序列化是指將對象的數據存儲下來;更詳細的資料須要查看MSDN文檔

Serialize()

 

IsSerializable()

 

IsKindof()

是不是某個類或者派生類

GetRuntimeClass()

包括它的類名、基類名等信息

(2)應用程序體系結構類

CWinApp和程序的結構框架有關,基於MFC的應用程序幾乎從它派生而來

①CCmdTarget

功能上是消息映射,當對象收到消息後決定應該調用哪個函數,其餘和CCmdTarget有關的類:窗口類CWnd、文檔模板類CDocTemplate、文檔類CDocument、視類CView、框架窗口類CFrameWnd

②CWinThread

建立和控制線程

CreateThread()

 

SetThreadPriority()

 

SuspendThread()

 

③CWinApp

即應用程序對象,繼承自CWinThread、CWinThread又繼承自CCmdTarget、CCmdTarget繼承自CObject,CWinApp的對象在每一個應用程序中都是惟一的

部分數據成員

m_pszAppName

應用程序的名稱

m_hInstance

當前應用程序的實例

m_lpCmdLine

指向命令行參數的指針

m_nCmdShow

窗口開始的顯示風格

m_bHelpMode

用戶按下shift+f1時是否作出幫助響應

m_pActiveWnd

指向應用程序主窗口的指針

m_pszExeName

應用程序可執行文件的名稱

m_pszHelpFilePath

幫助文檔的路徑

m_pszProfileName

.ini初始化文件名

m_pszRegistryKey

初始化文件存放的位置

部分函數成員

DoMessageBox()

彈出一個對話框

   
   

④文檔/視類

CDocument負責管理文檔的操做,文檔模板對象能夠建立不一樣文檔類型的文檔對象,而且每一個文檔對象都有一個指向其文檔模板對象的指針

CDocTemplate

文檔模板基類

CSingleDocTemplate

單文檔界面的文檔模板

CMultiDocTemplate

多文檔界面的文檔模板

CDocument

文檔操做

CView

文檔數據顯示的基類,繼承自CWnd

CView的派生類

CScrollView

有滾動條的視圖

CCtrlView

有樹、列表框等控件的視圖

CDaoRecordView

顯示數據庫記錄的視圖,多用於DAO的查詢結果

CEditView

多行文本編輯器的視圖

CFormView

表單模板的視圖

CListView

列表框控件的視圖

CRecordView

顯示數據庫記錄的視圖

CRichEditView

富文本編輯控件的視圖

CTreeView

樹控件的視圖

CPreviewView

支持打印預覽

(3)可視對象類

①CWnd

窗口類,它的派生類有:SDI應用程序框架窗口類CFrameWnd、MDI應用程序框架窗口類CMIDFrameWnd、MDI應用程序文檔框架窗口類CMDIChildWnd

②CMenu

對基礎api對象HMenu的封裝,負責和菜單有關的操做

③CDialog

對話框類,它的派生類有:文件標準對話框CFileDialog、顏色標準對話框CColorDialog、字體標準對話框CFontDialog、文件打印標準對話框CPrintDialog、查詢替換標準對話框CFindReplaceDialog、用戶自定義的對話框CDialog

④控件類

靜態控件

CStatic

 

按鈕

CButton

 

編輯框

CEdit

 

富文本編輯框

CRichEditCtrl

 

滾動條

CScrollBar

 

進度條

CProgressCtrl

 

遊標

CSliderCtrl

 

列表框

CListBox

 

組合框

CComboBox

 

位圖按鈕

CBitmapButton

 

數值調整框spin

CSpinButtonCtrl

 

動畫顯示控件

CAnimateCtrl

 

彈出式說明

CToolTipCtrl

 

熱鍵控件窗口

CHotKeyCtrl

用戶能夠建立「熱鍵」,使某個操做使用更方便

⑤控件條類CControlBar

一般充當工具條、狀態條等身份,它的基類有:窗口的基類CStatusBar、工具條上的按鈕命令CToolbgar、非模態對話框CDialogBar

⑥繪畫對象類CGdiObject

和繪畫有關,它的子類有:提供操做GDI位圖接口的CBitmap、GDI畫刷的CBrush、GDI字體的CFont、GDI調色板的CPalette、GDI畫筆的CPen、用於剪裁的GDI域CRgn

⑦設備描述表CDC

和繪畫有關,它的子類有:

CPaintDC

簡化了BeginPaint和EndPaint的過程,OnPaint、OnDraw對象的成員函數會用到

CClientDC

用戶窗口的設備描述表

CWindowDC

整個窗口的設備描述表,包括用戶區和框架區

CMetaFileDC

windows元文件的設備描述表,和圖形設備接口GDI有關

(4)通用類

①文件類

CFile

提供二進制磁盤文件的總接口,經過CArchive對象被間接訪問

CMemFile

提供訪問內存文件的總接口

CStdioFile

提供訪問緩存磁盤文件的總接口,一般是文本的方式

CArchive

與CFile對象一塊兒實現對象的持久化

②異常類CException

不能直接創建CException對象,一般使用它的派生類;產生異常的描述在異常對象的m_cause成員數據中

CNotSupportedException

不支持服務

CMemoryException

內存異常

CFileException

文件異常

CResourceException

資源異常

COleException

OLE異常

CArchiveException

檔案異常

CDaoException

DAO數據庫類異常

CDBException

數據庫存取異常

CUserException

用戶操做異常

③模板收集類

CArray、CMap、CList類使用的是全局幫助函數,可能須要編寫特定的幫助函數

CArray

元素存儲在數組中

CMap

將鍵映射到值

CList

元素存儲到鏈表中

CTypedPtrList

將對象指針存儲在鏈表中

CTypedPtrArray

將對象指針存儲在數組中

CTypedPtrMap

將鍵映射到值,鍵和值都是指針

(5)OLE

OLE指的是對象鏈接和嵌入,和複合文檔的處理有關(一般見到的word、excel),ActiveX在網絡編程方面對OLE作了進一步的擴展

普通類

COleDocument、COleItem、COleException

用戶類

COleClientDoc、COleClientItem

服務類

COleServer、COleTemplate、COleServerDoc、COleServerItem

可視編輯容器類

COleClientItem、COleLinkingDOC

數據傳輸類

COleDropSource、COleDropTarget、COleDataSource、COleDataObject

對話類

COleInsertDialog

其餘

CRectTracker爲複合文檔中的某項創建邊框,使之可移動和可調整大小

(6)ODBC數據庫類

CDatabase

面向ODBC驅動程序的一種標準界面

CRecordset

面向ODBC驅動程序的一種標準界面

CRecordView

CFormView的子類,將查詢集和顯示的字段關聯起來,便於直觀操做

CFieldExchange

提供上下文信息,支持記錄字段交換

CLongBinary

用於存儲二進制對象,好比位圖

CDBException

數據庫存取異常

2.全局變量和函數

通常以Afx開頭,函數中不包括數據庫類的函數和Dialog Data Exchange的內容

AfxMessageBox()

彈出一個對話框

AfxGetApp()

獲取一個指向CWinApp對象的指針

AfxGetInstanceHandle()

獲取當前實例的句柄

AfxGetResourceHandle()

獲取一個應用程序資源的句柄

AfxGetAppName()

獲取一個指向應用程序名稱的字符串指針

AfxAbort()

無條件終止一個應用程序

AfxBeginThread()

啓動一個新線程

AfxEndThread()

終止當前線程

AfxFormatString()

格式化字符串

AfxRegisterWndClass()

註冊windows窗口類

3應用程序嚮導Wizard

使用特定的框架或者添加一些內置的功能

2、windows標準控件

控件幾乎都繼承了CWnd類具備窗口的屬性,所以具備一些通用的方法,好比顯示或隱藏控件MoveWindow()、改變控件的位置SetWindowPos()、設置文本內容SetWindowText(),用代碼或者在資源視圖中拖拽均可以建立控件;在資源視圖中右擊控件能夠添加變量、根據控件的消息添加一些消息處理的代碼;格式->Tab鍵順序,依次點擊能夠獲得一個想要的tab鍵切換順序;項目上右鍵選擇「MFC類」能夠擴展出自定義的控件類

1.按鈕

(1)建立按鈕

BOOL Create(

//按鈕上的文本

LPCTSTR lpszCaption,

//按鈕的風格

DWORD dwStyle,

//位置和大小

const RECT& rect,

//父窗口的指針

CWnd* pParentWnd,

//按鈕的ID

UINT nID);

按鈕的風格

BS_AUTOCHECKBOX

同BS_CHECKBOX,只是單擊時按鈕會自動反轉

BS_AUTORADIOBUTTON

同BS_RADIOBUTTON,只是單擊時按鈕會自動反轉

BS_AUTO3STATE

同BS_3STATE,只是單擊按鈕時會改變狀態

BS_DEFPUSHBUTTON

默認的命令按鈕,回車能夠直接選中該按鈕

BS_GROUPBOX

組框

BS_LEFTTEXT

按鈕上的文本左對齊

BS_CHECKBOX

矩形的可選擇框

BS_RADIOBUTTON

圓形的可選擇按鈕

BS_3STATE

同BS_CHECKBOX,只是有三種選擇的狀態

BS_PUSHBUTTON

指定一個命令按鈕

BS_OWNERDRAW

指定一個自繪製按鈕

(2)和按鈕有關的消息

BN_CLICKED

單擊

BN_DOUBLECLICKED

雙擊

(3)可能用到的成員函數

CButton類的成員函數

GetCheck()

獲取check類型按鈕的選中狀態,未選擇0、選擇一、不肯定2

SetCheck()

設置check類型按鈕的選中狀態

GetBitmap()

獲取位圖

SetBitmap()

設置位圖

GetButtonStyle()

獲取按鈕的樣式

SetButtonStyle()

設置按鈕的樣式

GetCursor()

獲取光標

SetCursor()

設置按鈕上的光標

GetIcon()

獲取按鈕上的圖標

SetIcon()

設置按鈕上的圖標

GetState()

獲取按鈕的狀態,選中、選擇、聚焦

SetState()

設置按鈕的狀態

繼承自CButton類的CBitmapButton

LoadBitmaps()

載入位圖

SizeToContent()

改變位圖的大小以適應按鈕

CWnd類的成員函數

CheckDlgButton()

設置按鈕的選中狀態

CheckRadioButton()

選擇組中的一個按鈕

GetCheckedRadioButton()

選擇組中的一個已被選中的按鈕

IsDlgButtonChecked()

返回按鈕的選中狀態

GetWindowText()、GetWindowTextLength()、SetWindowText()

和按鈕上的文字有關

2.滾動條

(1)建立滾動條

BOOL Create(

DWORD dwStyle,

const RECT& rect,

CWnd* pParentWnd,

UINT nID);

(2)和滾動條有關的消息

SB_TOP

滾動到最頂部

SB_BOTTOM

滾動到最底部

SB_RIGHT

滾動到右邊

SB_LEFT

滾動到左邊

SB_PAGEUP

向上滾動一頁

SB_PAGEDOWN

向下滾動一頁

SB_PAGELEFT

向左滾動一頁

SB_PAGERIGHT

向右滾動一頁

SB_LINEDOWN

向下滾動一行

SB_LINEUP

向上滾動一行

SB_LINELEFT

向左滾動一行

SB_LINERIGHT

向右滾動一行

SB_THUMBPOSITION

滾動框移動到最新位置

SB_THUMBTRACK

滾動框被拖動

SB_ENDSCROLL

滾動到最終位置

(3)可能用到的方法

EnableScrollBar()

使滾動條的一個或兩個箭頭有效或無效

GetScrollInfo()

獲取滾動條的消息

GetScrollLimit()

獲取滾動條的範圍

GetScrollPos()

獲取滾動條的當前位置

GetScrollRange()

獲取滾動條的滾動範圍

SetScrollInfo()

設置滾動條的消息

SetScrollPos()

設置滾動滑塊的位置

SetScrollRange()

設置滾動條的滾動範圍

ShowScrollBar()

顯示或隱藏滾動條

3.靜態控件

通常用在不發送消息也不接收消息的文本或圖形上,可是也能想超文本連接那樣響應用戶的操做,這就要用到SS_NOTIFY樣式向父窗口發送WM_COMMAND消息(記事本查看Visual C++ 2008編寫的.rc文件能夠發現這個問題)

(1)建立方法

Win32的作法或者在資源視圖中經過拖拽添加

(2)和該控件有關的消息

STN_CLICKED

單擊靜態控件

STN_DBLCLK

雙擊靜態控件

STN_ENABLE

激活靜態控件

STN_DISABLE

禁用靜態控件

(3)可能用到的函數

ModifyStyle(0,SS_BITMAP);

控件是位圖風格

SetBitmap();

設置位圖

HBITMAP bBmp=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(位圖的ID));

位圖資源轉換成HBITMAP

GetObject(m_bmp.GetBitmap(),sizeof(BITMAP),&bmp);

位圖資源轉換成BITMAP

4.列表框

CListBox能夠展現像數組同樣的數據,容許單選和多選、自帶滾動條;

(1)建立列表框

BOOL Create(

DWORD dwStyle,

const Rect& rect,

CWnd* pParentWnd,

UINT nID);

(2)和列表框有關的消息

列表框嚮應用可能發送的消息

LBN_SELCHANGE

用戶的選擇發生了改變

LBN_DBCLK

雙擊

LBN_SELCANCLE

取消選擇

LBN_SETFOCUS

獲取輸入焦點

LBN_KILLFOCUS

失去輸入焦點

應用向列表框可能發送的消息

LB_ADDFILE

在文件列表中插入指定文件

LB_ADDSTRING

加入項

LB_DELETESTRING

刪除項

LB_DIR

在列表框中列出指定文件

LB_FINDSTRING

在列表框中查找指定項

LB_GETCOUNT

獲取多選列表框中項的數目

LB_GETCURSEL

獲取當前選中項的索引值

LB_GETSEL

獲取指定項的選中狀態

LB_GETSELCOUNT

獲取多選列表框中選中的項數

LB_GETTEXT

獲取指定項的文本

LB_GETTEXTLEN

獲取指定項的文本的長度

LB_GETTOPINDEX

獲取列表框中第一項的索引值

LB_INSERTSTRING

在指定位置加入項

LB_RESETCONTENT

清空全部項

LB_SETSEL

設置多選列表框中指定項的選中狀態

LB_SETCURSEL

設置單選列表框中指定項的選中狀態

LB_SETTOPINDEX

設置列表框中第一項的索引值

(3)可能用到的函數

獲取當前目錄中的全部條目

//tchBuffer是長度爲MAX_PAH的TCHAR類型數組

GetCurrentDirectory(MAX_PATH,tchBuffer);

//設置列表框的顯示內容

DlgDirList(tchBuffer,列表框的ID,用於顯示路徑的靜態控件ID,0);

通用方法

GetHorizontalExtent()

獲取水平滾動的寬度

SetHorizontalExtent()

設置水平滾動的寬度

GetItemData()

獲取與列表框項有關的32位數值

SetItemData()

設置與列表框項有關的32位數值

GetItemDataPtr()

獲取某一項的指針

SetItemDataPtr()

設置某一項的指針

GetItemHeight()

獲取某一項的高度

SetItemHeight()

設置某一項的高度

GetItemRect()

獲取列表框的矩形

GetLocale()

獲取列表框的位置局部標識LCID

SetLocale()

設置列表框的位置標識LCID

GetSel()

肯定某一項的選擇狀態

GetText()

獲取某一項的文本內容

GetTextLen()

返回列表框字符串的長度

GetTopIndex()

獲取第一個項的下標,不必定爲0

GetCount()

獲取項的數目

ItemFromPoint()

獲取和某點最近的某一項的下標

SetColumnWidth()

設置多列列表框的列寬度

SetTabStops()

設置列表框的製表位位置

SetTopIndex()

設置第一個可見項的下標

單項選擇

GetCurSel()

獲取當前選擇項的下標

SetCurSel()

設置當前選擇項的下標

多項選擇

GetAnchorIndex()

獲取當前定位項的下標

SetAnchorIndex()

擴充選擇設置開始項(定位項)

GetCaretIndex()

獲取具備光標矩形的項的下標

SetCaretIndex()

指定下標項設置光標矩形

GetSelCount()

獲取當前所選項的數目

GetSelItems()

獲取被選項的下標裝入數組

SelItemRange()

切換項範圍的選擇狀態

SetSel()

切換項的選擇狀態

操做字符串

AddString()

向列表框中加入一個字符串

DeleteString()

向列表框中刪除一個字符串

Dir()

從當前目錄加文件名裝入列表框

FindString()

搜索一字符串

FindStringExact()

搜索第一個符合的字符串

InsertString()

在指定下標處插入字符串

ResetContent()

清空全部項

SelectString()

在單選列表框中搜索並選擇一字符串

能夠自定義的虛方法

CharToItem()

自繪製列表框處理WM_CHAR

CompareItem()

自繪製列表框項的比較方法

DeleteItem()

自繪製列表框刪除一項

DrawItem()

自繪製列表框重繪時的方法

MeasureItem()

自繪製列表框建立時,MFC能夠獲取列表框的維數

VKeyToItem()

處理具備LBS_WANTKEYBOARDINPUT樣式的WM_KEYDOWN消息

5.編輯框

能夠是多行文本的矩形窗口,好比windows中的記事本;UpdateData()針對含有編輯框部分的代碼更新

(1)Cedit的樣式

資源視圖中根據屬性設置後,能夠在.rc文件中找到這些樣式

ES_AUTOHSCROLL

用戶在末尾輸入字符時,文本向右滾動

ES_AUTOVSCROLL

用戶在末尾輸入回車時,光標能夠向下移動

ES_CENTER

文本居中

ES_LEFT

文本左對齊

ES_LOWERCASE

編輯框中的字符所有小寫

ES_MULTILINE

指定是多行編輯框

ES_NOHIDESEL

失去輸入焦點後依然選中文本

ES_NUMBER

Windows95上的編輯框中只能輸入數字

ES_OEMCONVERT

字符類型轉換

ES_PASSWORD

密碼框的形式

ES_READONLY

只讀

ES_RIGHT

文本右對齊

ES_UPPERCASE

編輯框中的字符所有大寫

ES_WANTRETURN

多行編輯框能夠回車換行

(2)和編輯框有關的消息

低字節是控件的標識,高字節是通知碼

編輯框嚮應用程序發送通知碼

EN_SETFOCUS

獲取輸入焦點

EN_KILLFOCUS

失去輸入焦點

EN_CHANGE

內容發生改變

EN_UPDATE

內容被更新

EN_MAXTEXT

用戶輸入已達到最大限度

EN_HSCROLL

內容水平滾動

EN_VSCROLL

內容垂直滾動

應用程序向編輯框發送操做碼

EM_GETRECT

獲取矩形尺寸

EM_SETRECT

設置矩形尺寸

EM_LINESCROLL

設置滾動條的步長

EM_SETHANDLE

設置輸入內容緩衝區句柄

EM_GETHANDLE

獲取輸入內容緩衝區句柄

EM_LINELENGTH

獲取文本的長度

EM_GETFONT

獲取編輯框使用的字體

EM_GETLINECOUNT

獲取多行文本款的文本行數

EM_REPLACESEL

替換編輯框中選中的文本

EM_SETPASSWORDCHAR

設置密碼編輯框中的替代字符

EM_GETPASSWORDCHAR

獲取密碼編輯框中的替代字符

EM_SETREADONLY

編輯框只讀

EM_GETSEL

獲取選中的字體

EM_SETSEL

設置選中的字體

(3)可能用到的函數

通用方法

CanUndo()

編輯操做是否可撤銷

Clear()

刪除當前的選擇

Copy()

以CF_TEXT格式複製選擇到剪切板中

Cut()

以CF_TEXT格式剪切選擇到剪切板中

EmptyUndoBuffer()

消除一個編輯框控件的「撤銷」標誌

GetFirstVisibleLine()

肯定編輯框控件中的最上面的可視行

GetModify()

肯定一個編輯框控件的內容是否可修改

GetPasswordChar()

當用戶輸入文本時,編輯框控件中顯示的密碼字符

GetRect()

獲取編輯框的矩形

GetSel()

獲取當前選擇的開始和結束字符的位置

LimitText()

限定用戶文本輸入的長度

LineFromChar()

獲取包含指定字符下標的行的行號

LineLength()

獲取編輯框控件中一行的長度

LineScroll()

滾動多行編輯框控件的文本

Paste()

將剪切板中的數據粘貼到光標位置

ReplaceSel()

用指定文本替換選中的部分

SetModify()

設置或清除編輯框控件的修改標誌

SetPasswordChar()

當用戶輸入文本時設置或刪除一個顯示於編輯框控件中的密碼字符

SetReadOnly()

只讀

SetSel()

選擇字符的範圍

Undo()

取消最後一個編輯框控件的操做

UpdateData()

更新編輯框及其餘控件

多行編輯框支持的方法

FmtLines()

包含軟分行符

GetHandle()

獲取控件的句柄

GetLine()

獲取一行文本

GetLineCount()

獲取文本行的數目

LineIndex()

設置一行的字符下標

SetHandle()

設置多行文本框將要用到的句柄

SetRect()

設置多行文本框的矩形並更新控件

SetRectNP()

設置多行文本框的矩形,可是不重繪控件窗口

SetTabStops()

設置製表位tab

6.組合框

CComboBox是一種便可以輸入又能夠進行選擇的控件,看起來像是編輯框和列表框的組合;資源視圖上,一組單選按鈕的ID值必須連續、第一個按鈕選上Group,並且每一組只有第一個按鈕可以建立變量

(1)組合框的樣式

CBS_DROPDOWN

由列表框和編輯框組成,列表框平時不可見

CBS_DROPDOWNLIST

由列表框和靜態文本組成,列表框平時不可見

CBS_AUTOHSCROLL

編輯框自動水平滾動

CBS_SORT

列表框中各項按字母序排列

CBS_SIMPLE

列表框可見

(2)和組合框有關的消息

組合框嚮應用程序發送消息

CBN_SELCHANGE

列表框中的選中項發生改變

CBN_DBLCLK

雙擊

CBN_SETFOCUS

組合框得到焦點

CBN_KILLFOCUS

組合框失去焦點

CBN_EDITCHANGE

編輯框中的文本發生改變

CBN_EDITUPDATE

編輯框將顯示修改過的文本

CBN_DROPDOWN

列表框將下拉

CBN_CLOSEUP

列表框將隱藏

應用程序向組合框發送消息

CB_SHOWDROPDWON

顯示下拉列表框

CB_ADDSTRING

添加新項

CB_DELETESTRING

刪除一項

CB_INSERTSTRING

插入新項

CB_FINDSTRING

查詢列表項

CB_RESETCONTENT

清空列表框

CB_DIR

在列表框中顯示指定目錄及文件

CB_SETCURSEL

設置列表框中選中項的索引值,並在編輯框中顯示

CB_GETCURSEL

獲取列表框中選中項的索引值

CB_GETCOUNT

獲取列表框中項的數目

CB_GETLBTEXT

獲取列邊框中指定項的文本

CB_GETLBTEXTLEN

獲取列邊框中指定項的文本長度

CB_LIMITEXT

限制編輯框中的字符串長度

CB_GETEDITSEL

獲取編輯框中的選擇

CB_SETEDITSEL

設置編輯框中的選擇

(3)可能用到的函數

Clear()

刪除當前選項,清空編輯框中的內容

Copy()

以CF_TEXT格式將選中內容複製到粘貼板

Cut()

以CF_TEXT格式將選中內容剪切到粘貼板

GetComboBoxInfo()

返回CCombox對象的信息

GetCount()

獲取列表框項的數目

GetCurSel()

返回所選列表框條目的順序號

GetEditSel()

返回DWORD數據,低字節是編輯框中選中文字的開始位置,高字節是結束位置

GetItemHeight()

返回組合框中表示列表條目數

GetLBText()

返回組合框的列表中指定條目的字符串

GetLBTextLen()

返回組合框的列表中指定條目的字符串的長度

Paste()

將粘貼板的內容複製到編輯框

SetCurSel()

選中組合框的指定條目

SetMinVisibleItems()

設置下拉列表中可見條目數

SetTopIndex()

指定下拉列表的第一個可見條目

AddString()

在列表條目中添加一字符串

DeleteString()

從列表項中刪除一字符串條目

FindString()

查找第一個和指定字符串匹配的字符串序號

InsertString()

將一字符串插入到指定位置

ResetString()

清空組合空中的全部內容

SelectString()

從列表中查找指定字符串,若是找到將其放到編輯框中

用CTime類獲取本地時間

CTime tNow =CTime::GetCurrentTime();

CString sNow=tNow.Format("%y/%m/%d");

獲取對話框中的某個對象

GetDlgItem();

//使對象有效或無效,選擇TRUE、FALSE

EnableWindow();

//是對象顯示或隱藏,選擇SW_SHOW、SW_HIDE

ShowWindow();

_tcscpy()、_tcscat()、_tcslen()

單選按鈕組的狀態

//初始化按鈕組的狀態

CheckedRadioButton(開始的ID,結束的ID,選中的ID);

//獲取單選按鈕組的選擇狀態,獲得的值和各單選按鈕的ID進行比較便可

iAgeRadio=GetCheckedRadioButton(IDC_AGE1_RADIO, IDC_AGE3_RADIO);

7.對話框通用控件

(1)Picture

分隔線

Color屬性選擇Etched

圖片

Type選擇Icon或者Bitmap,設置Image屬性爲對應資源的ID時能夠顯示圖片

(2)Spin

須要和其餘控件組合使用,好比Edit控件;Spin適合在一個範圍內選擇精確值

設置Edit控件只讀,Spin控件的Allignment選擇Right Align、Auto buddy爲TRUE

初始化

CSpinButtonCtrl* pSpin=(CSpinButtonCtrl*)GetDlgItem(IDC_SPIN1);

pSpin->SetRange(0,100);

pSpin->SetPos(50);

pSpin->GetBuddy()->SetWindowTextW(L"5.0");

事件響應

//響應對話框的VM_VSCROLL消息

if(pScrollBar->GetDlgCtrlID()==IDC_SPIN1)

{

CString strValue;

//Spin上下移動變化只是1,除以10.0表示這個步長是0.1

strValue.Format(L"%3.1f",nPos/10.0);

((CSpinButtonCtrl*)pScrollBar)->GetBuddy()->SetWindowTextW(strValue);

}

(3)Progress

進度條

初始化

CProgressCtrl* pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);

pProg->SetRange(0,100);

pProg->SetPos(50);

啓動進度條

//好比某個按鈕按下

CProgressCtrl* pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);

pProg->SetPos(0);

SetTimer(2008,100,NULL);

事件響應

//響應對話框的VM_TIMER消息

if(nIDEvent==2008)

{

CProgressCtrl* pProg=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);

pProg->SetPos(pProg->GetPos()+1);

if(pProg->GetPos()>=100)

{

KillTimer(nIDEvent);

AfxMessageBox(L"進行完畢");

}

}

(4)Slider

滑塊比較方便在一個範圍內選擇大體的數值

初始化

CString strText1;

CSliderCtrl* pSlider1=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);

pSlider1->SetRange(0,100);

pSlider1->SetPos(50);

strText1.Format(L"%d",pSlider1->GetPos());

SetDlgItemText(IDC_STATIC_SLIDER,strText1);

事件響應

//響應對話框的WM_HSCROLL消息

if(pScrollBar->GetDlgCtrlID()==IDC_SLIDER1)

{

CSliderCtrl* pSlide=(CSliderCtrl*)pScrollBar;

CString strText;

strText.Format(L"%d",pSlide->GetPos());

SetDlgItemText(IDC_STATIC_SLIDER,strText);

}

(5)Date Time Picker

用戶對時間的輸入形式是多樣的,這就致使了時間很差解析的問題,這時候選擇Date Time Picker是頗有意義的

初始化

CDateTimeCtrl* pDT=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);

CString str=_T("'今天是:'yyyy'/'MM'/'dd");

pDT->SetFormat(str);

對日期時間的解析

CDateTimeCtrl* pDT=(CDateTimeCtrl*)GetDlgItem(IDC_DATETIMEPICKER1);

CTime t;

pDT->GetTime(t);

CString str=t.Format(L"%Y/%m/%d %A %H:%M:%S");

AfxMessageBox(str);

(6)List Control

相似文件管理器的文件列表;回調項可能會節省程序的存儲空間

CListCtrl可能用到的函數

Create()

建立列表控件

SetBkColor()

設置背景顏色

SetImageList()

設置圖像列表

SetItem()

設置列表項數據

GetItemRect()

獲取列表項的矩形

GetEditControl()

獲取正在編輯的列表項的Edit控件

SetTextColor()

設置文本顏色

SetTextBkColor()

設置文本背景顏色

SetItemText()

設置列表項的標籤文字

GetHotItem()

獲取鼠標指向的列表項

GetSelectionMark()

獲取當前選中的列表項

SubItemHitTest()

獲取指定點下的列表項

SetBkImage()

設置背景圖片

InsertItem()

插入列表項

EditLabel()

啓動顯示編輯標籤文字

CreateDragImage()

建立用於拖放的圖片

列表控件的風格

圖標:每項顯示32*32圖標,圖標下面顯示標籤,能夠拖動到視圖內任意位置;小圖標:每項顯示16*16圖標,圖標右邊顯示標籤,能夠拖動到視圖內任意位置;列表:每項顯示16*16圖標、按列排列,圖標右邊顯示標籤,不能任意拖動圖標;報表:每項佔一行,第一列顯示16*16的圖標,圖標右邊顯示標籤,再右邊的列顯示子項由具體程序決定

Windows控件風格

 

hover selection

鼠標在某一項上停留必定時間就自動選擇該項

虛擬列表視圖

可使用DWORD類型的項,是管理數據交給具體程序,控件只負責焦點和選擇功能

單擊和雙擊激活

容許熱點跟蹤、單擊和雙擊激活高亮選項

拖放列排序

在報表中容許經過拖放從新排序各項的順序

列表控件支持的四種圖片類型

大圖標

圖標風格的時候使用

小圖標

小圖標、列表、報表風格使用

應用程序狀態

用於在圖標旁邊顯示應用程序狀體的圖片

標題欄項

在報表風格中用於標題欄的顯示

設置Edit Labels爲TRUE,View的屬性爲Small Icon,在對話框類中添加變量CImageList m_imageList;

初始化

HICON hIcon[8];

int n;

m_imageList.Create(16,16,0,8,8);

hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON_WHITE);

hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON_BLACK);

hIcon[2]=AfxGetApp()->LoadIcon(IDI_ICON_RED);

hIcon[3]=AfxGetApp()->LoadIcon(IDI_ICON_BLUE);

hIcon[4]=AfxGetApp()->LoadIcon(IDI_ICON_YELLOW);

hIcon[5]=AfxGetApp()->LoadIcon(IDI_ICON_CYAN);

hIcon[6]=AfxGetApp()->LoadIcon(IDI_ICON_PURPLE);

hIcon[7]=AfxGetApp()->LoadIcon(IDI_ICON_GREEN);

for(n=0;n<8;++n)

m_imageList.Add(hIcon[n]);

//建立標籤資源

static TCHAR* color[]={L"white",L"black",L"red",L"blue",L"yellow",L"cyan",L"purple",L"green"};

//建立控件

CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST1);

pList->SetImageList(&m_imageList,LVSIL_SMALL);

for(n=0;n<8;++n)

pList->InsertItem(n,color[n],n);

pList->SetBkColor(RGB(0,255,255));

pList->SetTextBkColor(RGB(255,0,255));

在列表LVN_ITEMCHANGED消息中添加代碼,獲取選中的內容

CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST1);

int nSelected=pNMLV->iItem;

if(nSelected>=0)

{

CString strItem=pList->GetItemText(nSelected,0);

SetDlgItemText(IDC_STATIC_LIST,strItem);

}

在列表NM_RCLICK消息中添加代碼,編輯右鍵選中的內容

//LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<NMITEMACTIVATE>(pNMHDR);

// TODO: 在此添加控件通知處理程序代碼

NM_LISTVIEW* pNMListView=(NM_LISTVIEW*)pNMHDR;

CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST1);

int nSelected=pNMListView->iItem;

if(nSelected>=0)

pList->EditLabel(nSelected);

在列表LVN_ENDLABELEDIT消息中添加代碼,更新列表的編輯結果

LVITEM item=pDispInfo->item;

CString str=item.pszText;

str.TrimLeft();

str.TrimRight();

if(str.GetLength()>0)

{

CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST1);

pList->SetItemText(item.iItem,item.iSubItem,item.pszText);

}

(7)Tree Control

CTreeCtrl可能用到的函數

Create()

建立樹控件

GetCount()

獲取結點的數目

SetIndent()

設置每層縮進距離

SetIamgeList()

設置圖片列表

GetNextItem()

獲取指定結點指定方式下的下一個節點

InsertItem()

插入節點

GetChildItem()

獲取子節點

GetNextSiblingItem()

獲取下一個兄弟節點

GetPrevSiblingItem()

獲取上一個兄弟節點

GetParentItem()

獲取父節點

GetSelectedItem()

獲取選中的節點

GetDropHilightItem()

獲取當前釋放目標節點

GetRootItem()

獲取根節點

GetItem()

獲取指定結點的信息

GetEditControl()

獲取編輯框控件

SetBkColor()

設置背景顏色

ItemHasChildren()

判斷是否有子節點

DeleteItem()

刪除節點

DeleteAllItems()

刪除全部節點

Expand()

打開或摺疊節點

CreateDragImage()

建立用於拖放的圖片

SortChildren()

將某節點下的子節點排序

設置Has Buttons爲TRUE、這樣每一個展開項以前就有「+」「-」按鈕,設置Has Lines爲TRUE、這樣每一個展開項以前就有虛線鏈接,設置Lines At Root爲TRUE、這樣第一層節點之間也有虛線鏈接,設置Edit Labels爲TRUE、是標籤可編輯

VERIFY()是個相似assert()的東西

初始化

HICON hIcon[8];

int n;

m_imageList.Create(16,16,0,8,8);

//圖標icon資源須要提早製做

hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON_WHITE);

hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON_BLACK);

hIcon[2]=AfxGetApp()->LoadIcon(IDI_ICON_RED);

hIcon[3]=AfxGetApp()->LoadIcon(IDI_ICON_BLUE);

hIcon[4]=AfxGetApp()->LoadIcon(IDI_ICON_YELLOW);

hIcon[5]=AfxGetApp()->LoadIcon(IDI_ICON_CYAN);

hIcon[6]=AfxGetApp()->LoadIcon(IDI_ICON_PURPLE);

hIcon[7]=AfxGetApp()->LoadIcon(IDI_ICON_GREEN);

for(n=0;n<8;++n)

m_imageList.Add(hIcon[n]);

CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE1);

//包含有圖片的形式

pTree->SetImageList(&m_imageList,TVSIL_NORMAL);

//建樹的一種結構

TV_INSERTSTRUCT tvinsert;

//沒有父節點

tvinsert.hParent=NULL;

//插入到本層最後

tvinsert.hInsertAfter=TVI_LAST;

//掩碼:圖標、選中圖標、文字

tvinsert.item.mask=TVIF_IMAGE|TVIF_SELECTEDIMAGE|TVIF_TEXT;

tvinsert.item.hItem=NULL;

tvinsert.item.state=0;

tvinsert.item.stateMask=0;

//文字的最大長度,編譯器忽略該參數、可是寫程序的人能夠獲取到

tvinsert.item.cchTextMax=6;

//選中的時候是黑色

tvinsert.item.iSelectedImage=1;

tvinsert.item.cChildren=0;

tvinsert.item.lParam=0;

//建立第一層

tvinsert.item.iImage=1;

tvinsert.item.pszText=L"father";

HTREEITEM hDad=pTree->InsertItem(&tvinsert);

tvinsert.item.iImage=2;

tvinsert.item.pszText=L"mother";

//表示還有子節點

HTREEITEM hMom=pTree->InsertItem(&tvinsert);

//建立第二層

tvinsert.hParent=hDad;

tvinsert.item.iImage=3;

tvinsert.item.pszText=L"son";

//下面沒有子節點

pTree->InsertItem(&tvinsert);

tvinsert.item.pszText=L"daughter";

pTree->InsertItem(&tvinsert);

tvinsert.hParent=hMom;

tvinsert.item.iImage=4;

tvinsert.item.pszText=L"son";

pTree->InsertItem(&tvinsert);

tvinsert.item.pszText=L"daughter";

pTree->InsertItem(&tvinsert);

tvinsert.item.pszText=L"cartoon";

HTREEITEM hOther=pTree->InsertItem(&tvinsert);

//建立第三層

tvinsert.hParent=hOther;

tvinsert.item.iImage=7;

tvinsert.item.pszText=L"Tom";

pTree->InsertItem(&tvinsert);

tvinsert.item.pszText=L"Jerry";

pTree->InsertItem(&tvinsert);

在樹控件的TVN_SELCHANGED消息中添加代碼,實現獲取選中的內容

CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE1);

HTREEITEM hSelected=pNMTreeView->itemNew.hItem;

if(hSelected!=NULL)

{

//總長是9個字符,包括最後的'\0'

TCHAR text[9];

TV_ITEM item;

item.mask=TVIF_HANDLE|TVIF_TEXT;

item.hItem=hSelected;

item.pszText=text;

item.cchTextMax=8;

VERIFY(pTree->GetItem(&item));

SetDlgItemText(IDC_STATIC_TREE,item.pszText);

}

在樹控件的TVN_ENDLABELEDIT消息中添加代碼,三擊實現編輯選中的內容

TVITEM item=pTVDispInfo->item;

CString str=item.pszText;

//換成Trim()、中間輸入些空格到底行不行?

str.TrimLeft();

str.TrimRight();

if(str.GetLength()>0)

{

CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE1);

pTree->SetItemText(item.hItem,item.pszText);

}

(8)Extended Combo Box

擴展出來的組合框,實現列表項圖標和標籤的組合顯示

CComboBoxEx可能用到的函數

Create()

建立擴展組合框控件

DeleteItem()

刪除一項

GetItem()

獲取指定項信息

InsertItem()

插入一項

SetImageList()

設置圖片列表

GetEditCtrl()

獲取其中的Edit控件

GetComboBoxCtrl()

獲取其中的組合框控件

初始化

HICON hIcon[8];

int n;

//這是對話框添加的CImageList變量

m_imageList.Create(16,16,0,8,8);

//圖標icon資源須要提早製做

hIcon[0]=AfxGetApp()->LoadIcon(IDI_ICON_WHITE);

hIcon[1]=AfxGetApp()->LoadIcon(IDI_ICON_BLACK);

hIcon[2]=AfxGetApp()->LoadIcon(IDI_ICON_RED);

hIcon[3]=AfxGetApp()->LoadIcon(IDI_ICON_BLUE);

hIcon[4]=AfxGetApp()->LoadIcon(IDI_ICON_YELLOW);

hIcon[5]=AfxGetApp()->LoadIcon(IDI_ICON_CYAN);

hIcon[6]=AfxGetApp()->LoadIcon(IDI_ICON_PURPLE);

hIcon[7]=AfxGetApp()->LoadIcon(IDI_ICON_GREEN);

for(n=0;n<8;++n)

m_imageList.Add(hIcon[n]);

static TCHAR* color[]={L"white",L"black",L"red",L"blue",L"yellow",L"cyan",L"purple",L"green"};

CComboBoxEx* pComboEx=(CComboBoxEx*)GetDlgItem(IDC_COMBOBOXEX1);

pComboEx->SetImageList(&m_imageList);

COMBOBOXEXITEM comboItem;

//和下面的操做有關

comboItem.mask=CBEIF_IMAGE|CBEIF_INDENT|CBEIF_SELECTEDIMAGE|CBEIF_TEXT;

for(n=0;n<3;++n)

{

//該項的索引

comboItem.iItem=n;

//項的圖標

comboItem.iImage=n;

//選中時候的圖標

comboItem.iSelectedImage=n;

//縮進

comboItem.iIndent=n;

comboItem.pszText=color[n];

pComboEx->InsertItem(&comboItem);

}

3、資源

資源和代碼是獨立的,資源能夠是某個.dll、.exe等二進制文件;另存爲.res資源文件,在須要的時候能夠導入

1.菜單

(1)程序主菜單

出如今界面的最上方,不能夠拖動和刪除;在View的構造函數和OnDraw函數中填寫代碼

①菜單編輯器中的屬性

Seperator

分割線

Popup

彈出式窗口

Enabled

已激活

Checked

被選中

Grayed

被禁用

Prompt

提示信息

②COMMAND消息

用戶點擊菜單項的時候會產生該消息

③UPDATE_COMMAND_UI消息

窗口刷新菜單項的時候產生該消息,會用到CCmdUI對象

Enable()

禁止或啓動該菜單項

SetCheck()

菜單項或工具條前面是否有√

SetRadio()

菜單項或工具條前面是否有·

SetText()

設置菜單項的顯示文字

④ON_COMMAND_RANGE消息

也能夠用COMMAND消息一個一個的對菜單項添加代碼,可是若是菜單項的ID是連續的話,用ON_COMMAND_RANGE會方便不少;引導程序不支持該消息的自動映射、須要動手寫代碼完成

a.在View的頭文件中填寫代碼

afx_msg void OnOperColorChange(UINT nID);

b.在View的源文件中填寫代碼

BEGIN_MESSAGE_MAP(CMy0View, CView)

ON_COMMAND_RANGE(ID_OPER_RED,ID_OPER_BLUE,OnOperColorChange)

END_MESSAGE_MAP()

void CMy0View::OnOperColorChange(UINT nID)

{

m_nColorIndex=nID-ID_OPER_RED;

//強制刷新,會從新調用OnDraw函數

Invalidate();

}

⑤UPDATE_COMMAND_UI_RANGE消息

對ID連續的菜單項進行更新;引導程序不支持該消息的自動映射、也是須要動手寫代碼完成

a.在View的頭文件中填寫代碼

afx_msg void OnUpdateOperColorChange(CCmdUI* pCmdUI);

b.在View的源文件中填寫代碼

BEGIN_MESSAGE_MAP(CMy0View, CView)

ON_UPDATE_COMMAND_UI_RANGE(ID_OPER_RED,ID_OPER_BLUE,OnUpdateOperColorChange)

END_MESSAGE_MAP()

void CMy0View::OnUpdateOperColorChange(CCmdUI* pCmdUI)

{

//pCmdUI和以前聲明的起始ID、終止ID有關,事件觸發的時候將刷新菜單項

pCmdUI->SetRadio(m_nColorIndex==(pCmdUI->m_nID-ID_OPER_RED));

}

(2)快捷菜單

程序主菜單中已經有其中的菜單項,爲了方便右鍵時出現的一組菜單

①CMenu類可能會用到的方法

構造方法

Attach()

把一個菜單句柄附加到CMenu對象上

CreateMenu()

建立一個空菜單並附加到CMenu對象上

CreatePopupMenu()

建立一個彈出式菜單並附加到CMenu對象上

DeleteTempMap()

刪除由FromHandle()建立的任何臨時CMenu對象

DestroyMenu()

銷燬CMenu對象及其下面的菜單

Deatch()

從CMenu對象上拆出一個菜單句柄並返回

FromHandle()

給定菜單句柄時,返回CMenu對象的指針

GetSafeHmenu()

返回由CMenu對象封裝的菜單句柄成員

LoadMenu()

從可執行文件中加載菜單資源並附加到CMenu對象上

LoadMenuIndirect()

從內存中加載菜單資源並附加到CMenu對象上

操做菜單

DeleteMenu()

刪除某個特定菜單中的菜單項

TrackPopupMenu()

在一個POINT對象指定的地方顯示快捷菜單

操做菜單項

AppendMenu()

將新項加到指定的菜單項後面

CheckMenuItem()

彈出式菜單中,菜單項的校驗標記或取消下一項的校驗標記

CheckMenuRadioItem()

把一個單選按鈕放到菜單項旁邊或取消一個已存在的單選按鈕

EnableMenuItem()

激活/禁用一個菜單項

GetMenuItemCount()

獲取菜單項的數目

GetMenuItemID()

獲取指定位置的菜單項的標識符

GetMenuState()

獲取指定菜單項的狀態

GetMenuString()

獲取指定菜單項的標記

GetSubMenu()

獲取指向彈出式才當的指針

InsertMenu()

在指定位置插入新的菜單項

ModifyMenu()

修改指定位置的菜單項

RemoveMenu()

從指定菜單中刪除與彈出式菜單結合的菜單項

②在資源視圖中插入新菜單IDR_MENU_POPUP

③在View的頭文件中添加新變量

//快捷菜單

CMenu m_PopMenu;

//快捷菜單的子菜單

CMenu* m_pPop;

④在View的源文件中添加代碼

CMy0View::CMy0View()

{

//加載菜單資源

m_PopMenu.LoadMenu(IDR_MENU_POPUP);

}

CMy0View::~CMy0View()

{

//銷燬菜單資源

m_PopMenu.DestroyMenu();

}

⑤在View的類視圖、類的屬性面板中選擇WM_RBUTTON消息添加處理函數,填寫右鍵後要處理的代碼

void CMy0View::OnRButtonDown(UINT nFlags, CPoint point)

{

// TODO: 在此添加消息處理程序代碼和/或調用默認值

m_pPop=m_PopMenu.GetSubMenu(0);

UINT nCheck=m_bShow?MF_CHECKED:MF_UNCHECKED;

m_pPop->CheckMenuItem(ID_OPER_SHOW,MF_BYCOMMAND|nCheck);

m_pPop->CheckMenuRadioItem(ID_OPER_RED,ID_OPER_BLUE,ID_OPER_RED+m_nColorIndex,MF_BYCOMMAND);

ClientToScreen(&point);

m_pPop->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);

CView::OnRButtonDown(nFlags, point);

}

(3)工具欄菜單

程序主菜單中也有這些菜單項,一般出如今程序主菜單下方、由一組相似按鈕的圖標組成,能夠拖動和關閉

①CToolBar可能用到的方法

構造方法

Create()

建立工具條並附加到CToolBar對象上

CreateEx()

建立定義了邊界的工具條並附加到CToolBar對象上

SetSizes()

設置按鈕及位圖大小

SetHeight()

設置工具條的高度

LoadToolBar()

加載工具條資源

LoadBitmap()

加載包含工具條按鈕圖像的位圖

SetBitmap()

設置位圖圖像

SetButtons()

設置按鈕並使每一個按鈕與位圖圖像相關

操做工具條按鈕

CommandToIndex()

返回給定命令的工具條按鈕索引

GetItemID()

返回指定索引的按鈕或分隔符的ID

GetItemRect()

返回指定索引的按鈕矩形

GetButtonStyle()

獲取按鈕的風格

SetButtonStyle()

設置按鈕的風格

GetButtonInfo()

獲取按鈕的ID、風格、圖像號

SetButtonInfo()

設置按鈕的ID、風格、圖像號

GetButtonText()

獲取按鈕上的文本內容

SetButtonText()

設置按鈕上的文本內容

②CToolBarCtrl也用於操做工具條,CToolBarCtrl可能用到的方法

CToolBarCtrl()

構造函數

Create()

建立工具條,這裏與具體的工具條資源綁定

GetState()

獲取指定按鈕的信息,好比被按下、被禁止等

HitTest()

測試一點是否位於某按鈕內

AddButtons()

添加按鈕

InsertButton()

插入按鈕

AddStrings()

添加按鈕文字

③進入資源視圖插入Toolbar

④在CMainFrame的頭文件中添加工具條對象

protected:

//若是已經有這個對象,還想創建新工具條的話須要另外建立CToolBar對象

CToolBar m_wndToolBar;

⑤在CMainFrame的源文件中編寫代碼,完成對工具條的加載

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if(!m_wndToolBar.Create(this,WS_VISIBLE|CBRS_TOP)||!m_wndToolBar.LoadToolBar(IDR_TOOLBAR))

{

TRACE0("Fail to create toolbar.");

return -1;

}

` …

}

⑥能夠動態的改變工具條的風格

//使窗口能夠移動到用戶區的任意位置

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar);

//改變工具條的風格:Toolbar屬性面板中prompt的\n前面的內容顯示在狀態欄、後面的內容表示鼠標通過時提示的內容

m_wndToolBar.SetBarStyle(CBRS_TOOLTIPS| CBRS_FLYBY| CBRS_SIZE_DYNAMIC);

//使工具條顯示或隱藏

ShowControlBar(&m_wndToolBar,TRUE,FALSE);

⑦多列工具欄菜單

if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_FLOAT_MULTI|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))

{

TRACE0("Failed to create toolbar");

return -1; // fail to create

}

m_wndToolBar.SetWindowText(_T("標準工具欄"));

m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

EnableDocking(CBRS_ALIGN_ANY);

DockControlBar(&m_wndToolBar);

if(!m_wndExtendBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_FLOAT_MULTI|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_wndExtendBar.LoadToolBar(IDR_TOOLBAR))

{

TRACE0("Failed to create extend toolbar");

return -1;

}

m_wndExtendBar.SetWindowText(_T("擴展工具欄"));

m_wndExtendBar.EnableDocking(CBRS_ALIGN_ANY);

CRect rect;

m_wndExtendBar.GetWindowRect(&rect);

rect.OffsetRect(1,0);

this->RecalcLayout(); //關鍵的一步,從新排列

DockControlBar(&m_wndExtendBar, AFX_IDW_DOCKBAR_TOP, &rect);

⑧多行工具欄菜單

//默認工具欄已經加載

if(!m_wndToolBarNew.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||

!m_wndToolBarNew.LoadToolBar(IDR_TOOLBAR))

{

TRACE0("Fail to create toolbar.");

return -1;

}

2.加速鍵

進入資源視圖的文件,雙擊最後一行、設置與該加速鍵關聯的ID、在屬性面板中設置加速鍵,編譯執行

3.字符串

使用字符串資源並在須要的時候動態切換,能夠設計出跨語言的程序;進入資源視圖、打開String Table,雙擊最下面的空白一行、填寫表示該字符串的ID值、填寫字符串的內容,編譯執行;CTring類.LoadString(字符串的ID值);能夠加載須要的字符串資源,CString對象能夠直接轉換成LPCTSTR並且支持格式化.Format(L「」,…);

//獲取字符串的矩形

CSize sizeText=pDC->GetTextExtent(str);

//CString轉換爲string

CString str = _T("CSDN");

std::string s = (CT2A)str;

//字符串輸出

pDC->SetBkColor(RGB(255,0,0));

pDC->SetTextColor(RGB(0,255,0));

CFont a;

a.CreateFont(

//高度和寬度

30,0,

//文本的傾斜度

0,

0,FW_NORMAL,

//斜體、下劃線、刪除線

0,0,0,

GB2312_CHARSET,OUT_DEFAULT_PRECIS,

CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,

//字體名稱

L"華文行楷");

pDC->SelectObject(a);

HDC hdc=pDC->GetSafeHdc();

CString str=L"無邊落木蕭蕭下";

TextOut(hdc,0,80,str,_tcslen(str));

a.DeleteObject();

4.對話框

DDX:對話框數據交換,MFC將控件和數據創建一種綁定關係;重寫OnInitDialog()函數能夠初始化對話框中組件的狀態;改變對話框的位置csDlg->SetWindowPos(NULL,20,10,0,0,SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);;AfxGetMainWnd()->PostMessage(WM_QUIT,0,0);或者使用Dialog::OnOk();均可以退出一個對話窗口

(1)CDialog可能用到的函數

Create()

建立一個對話框,一般用於非模態對話框的建立

Domodal()

顯示模態對話框

EndDialog()

關閉模態對話框

GetDlgItem()

獲取對話框上的某個控件指針

OnInitDialog()

初始化對話框

OnOk()

OK按鈕被點擊,能夠重載這個函數

OnCancel()

Cancel按鈕被點擊,能夠重載這個函數

(2)在資源視圖中插入新的Dialog,編輯須要的控件
(3)爲這個對話框創建關聯的類
(4)在對話框類中爲須要的控件添加須要的數據變量
(5)在須要的源文件中使用這個對話框類

//一個ID爲ID_OPER_STRING的菜單項,它的COMMAND消息響應函數OnOperString調用了這個對話框類

//也就是點擊這個菜單項的時候會出現這個對話框

#include "InputDlg.h"

void CMy0View::OnOperString()

{

// TODO: 在此添加命令處理程序代碼

InputDlg dlgInput;

//這是模態對話框

if(dlgInput.DoModal()==IDOK)

{

m_strShow=dlgInput.m_strInput;

Invalidate();

}

//這是非模態對話框,如今只能用來顯示一些消息並不能進行交互

//InputDlg *dlg = new InputDlg;

//dlg->Create(IDD_DIALOG_NEW);

//dlg->ShowWindow(SW_SHOWNORMAL);

}

5.圖標

能夠在資源視圖Icon中能夠編輯圖標,一般使用的是32*3二、16*16的24位圖標;也能夠添加本身想要的圖標,若是把ID值替換成IDR_MAINFRAME,就能夠改變應用程序的圖標

6.位圖

(1)在資源視圖中導入.bmp視圖並命名ID

(2)在View的OnDraw()中載入位圖

//獲取窗口的絕對位置,GetClientRect()獲取相對位置

CRect rect;

GetWindowRect(&rect);

CDC dcMemory;

dcMemory.CreateCompatibleDC(pDC);

CBitmap bmp1;

bmp1.LoadBitmapW(IDB_BITMAP_24bi);

BITMAP bmpInfo1;

bmp1.GetBitmap(&bmpInfo1);

CBitmap* pOldBitmap=dcMemory.SelectObject(&bmp1);

//pDC->BitBlt(0,0,bmpInfo1.bmWidth,bmpInfo1.bmHeight,&dcMemory,0,0,SRCCOPY);

pDC->StretchBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,&dcMemory,0,0,bmpInfo1.bmWidth,bmpInfo1.bmHeight,SRCCOPY);

dcMemory.SelectObject(pOldBitmap);

4、單文檔SDI和多文檔MDI界面

SDI只能打開一個類型的一個文檔,MDI每次能打開多個類型的多個文檔、MDI至少擁有兩個主菜單

1.可能用到的概念

和CArchive有關的序列化處理,對象讀寫字節流的方式還方便了網絡、串口傳輸數據

m_pDocument

使用該檔案的文檔

Abort()

在不發送異常的狀況下關閉檔案

Close()

關閉檔案

Flush()

將緩衝中的數據強制寫入流

operator<<

將基本類型寫入流

operator>>

從流中讀出基本類型

Read()

讀取字節內容

Write()

寫入字節內容

ReadString()

讀取字符串

WriteClass()

寫入類信息

WriteString()

寫入字符串

GetFile()

獲取底層的CFile對象

GetObjectSchema()

讀取對象版本號

SetObjectSchema()

設置對象版本號

IsLoading()

是否處於讀取狀態

IsStoring()

是否處於保存狀態

ReadObject()

讀取序列化對象

WriteObject()

寫入序列化對象

ReadClass()

讀取類信息

和文件打開保存有關的虛函數,能夠重載實現對這個過程的具體控制

文檔類完整的工做是:顯示獲取文件名對話框,選擇匹配的文件模板,建立關聯的框架、文檔、視圖,打開文件,將文件和檔案綁定,調用Serialize

CWinApp::OnFileOpen()

能夠完成整個過程

CWinApp::OpenDocumentFile()

MFC幫你獲取文件名

CDocTemplate::OpenDocumentFile()

MFC幫你獲取文件名並選擇一個模板

CDocument::OnOpenDocument()

MFC獲取文件名,選擇好模板,建立好關聯的框架、文檔、視圖

CDocument::Serialize()

完成序列化便可

CDocument::OnFileSave()/OnFileSaveAs()

能夠完成整個過程

CDocument::OnSaveDocument()

MFC幫你獲取文件名

2.消息映射

本質是數組,數組中存儲了消息傳遞時的關鍵信息;某種類型的消息會按照某種順序從一個對象傳遞到另外一個對象,直到該消息被處理,消息被處理後就不會再傳遞到後面的對象;這個優先級順序通常是:文檔對象>文檔模板>框架窗口>應用程序對象;在BEGIN_MSG_MAP和END_MSG_MAP之間的用宏的方式進行聲明

宏/參數

描述

ON_COMMAND

ID

Func

處理WM_COMMAND消息

發出消息的控件的ID

void func();

ON_COMMAND_RANGE

IDFirst

IDLast

func

處理ID連續的WM_COMMAND消息

起始控件的ID

終止控件的ID

void func(WORD id);

ON_UPDATE_COMMAND_UI

ID

func

處理MFC請求更新界面狀態

控件ID

void func(CCmdUI* pCmdUI);

ON_UPDATE_COMMAND_UI_RANGE

IDFirst

IDLast

func

處理ID連續的界面更新

起始控件的ID

終止控件的ID

void func(CCmdUI* pCmdUI);

ON_NOTIFY

Code

ID

func

處理來自新風格控件的WM_NOTIFY消息

消息碼

控件ID

void func(NMHDR* pNotifyStruct,LRESULT* result);

ON_NOTIFY_RANGE

Code

IDFirst

IDLast

func

處理ID連續的WM_NOTIFY消息

消息碼

起始控件的ID

終止控件的ID

void func(UINT id,NMHDR* pNotifyStruct,LRESULT* result);

ON_CONTROL

Code

ID

func

處理WM_COMMAND中的EN_、BN_消息

消息碼

控件ID

void func();

ON_CONTROL_RANGE

Code

IDFirst

IDLast

func

要求控件ID連續,功能和上一個同樣

消息碼

起始控件的ID

終止控件的ID

void func(UINT id);

ON_MESSAGE

Msg

func

處理任意消息,包括用戶自定義消息

消息ID

LRESULT func(WPARAM wParam,LPARAM lParam);

ON_REGISTERD_MESSAGE

Msg

func

處理使用RegisterWindowMessage註冊的消息

消息ID

LRESULT func(WPARAM wParam,LPARAM lParam);

3.核心類

(1)CWinApp

表明主程序,負責維護進程的啓動終止、消息循環、命令行參數、資源管理

經常使用的成員;調用的方法是使用全局函數AfxGetApp()獲取到指針,而後訪問

m_pszAppName

應用程序名稱

m_lpCmdLine

命令行參數

m_pMainWnd

應用程序主窗口指針

m_pszExeName

可執行文件的名稱

m_pszProfileName

配置INI文件的名稱

m_pszRegistrKey

配置註冊表主鍵值

LoadCursor

加載光標

LoadIcon

加載圖標

GetProfileInt

從配置讀取整數

WriteProfileInt

從配置寫入整數

GetProfileString

從配置讀取字符串

WriteProfileString

從配置寫入字符串

AddDocTemplate

添加文檔模板

AddToRecentFileList

向「最近打開的文件」菜單項中添加一個文件

InitInstance

MFC程序的入口

Run

事件循環

OnIdle

空閒事件處理

ExitInstance

MFC程序出口

PreTranslateMessage

篩選消息

DoWaitCursor

出現「沙漏」光標

(2)CDocument

提供了文檔所須要的最基本功能:打開保存文檔、維護文檔相關的視圖列表、維護文檔修改標誌、經過電子郵件發送文檔,是數據的抽象

可能用到的方法

通常方法

GetTitle()

獲取文檔標題

SetTitle()

設置文檔標題

GetPathName()

獲取文檔的路徑

SetPathName()

設置文檔的路徑

GetDocTemplate()

獲取文檔模板的指針

AddView()

對與文檔相關的視圖列表中添加視圖

RemoveView()

從文檔視圖列表中移除視圖

UpdateAllViews()

文檔已修改,更新所有相關的視圖

DisconnectViews()

使文檔與視圖相分離

GetFile()

獲取指向CFile類型的指針

CDocumnet的虛方法

OnNewDocument()

由MFC調用來建立新文檔

OnOpenDocument()

由MFC調用來打開文檔

OnSaveDocument()

由MFC調用來保存文檔

OnCloseDocument()

由MFC調用來關閉文檔

CanCloseDocument()

觀察文檔的框架窗口是否被容許關閉

DeleteContents()

在未撤銷文檔對象時刪除文檔數據

ReleaseFile()

釋放文件以容許其餘應用程序使用

SaveModified()

查詢文檔的修改狀態並保存修改的文檔

IsModified ()

文檔是否被修改過

SetModifiedFlag()

設置文檔是否被修改過的標記

GetFirstViewPosition()

獲取視圖列表頭的位置

GetNextView()

獲取視圖列表的下一個視圖指針

逐個對視圖進行操做

POSITION pos=GetFirstViewPosition();

while(pos!=NULL)

{

CView* pView=GetNextView(pos);

}

(3)CView

繼承自CWnd能夠接收任何windows消息;OnDraw()除了負責繪製還處理了打印功能、Invalidate()、UpdateWindow()強制視圖重繪,都不能在OnDraw()中調用,不然程序會由於遞歸循環調用而失去響

可能用到的方法

通常方法

GetDocument()

獲取與視圖相關聯的文檔指針

DoPreparePrinting()

設置文檔標題

虛方法

IsSelected()

文檔是否被選中

OnScroll()

當用戶滾動時觸發

OnInitialUpdate()

類在第一次構造後由MFC調用

OnDraw()

由MFC調用發出文檔到設備描述表

OnUpdate()

由MFC調用對修改的文檔進行響應

OnPrepareDC()

調用OnDraw()前由MFC修改設備表述表

CView的子類

CEditView

簡單的文本編輯器

CListView

列表視圖

CTreeView

樹狀視圖

CRichEditView

富文檔編輯器

CScrollView

支持滾動條的視圖

CFormView

窗體視圖,支持在之上使用對話框控件

CRecordView

鏈接到ODBC數據庫的視圖

CDaoRecordView

鏈接到DAO數據庫的視圖

(4)CDocTemplate

文檔模板類將文檔、視圖和框架窗口對象聯繫在一塊兒,負責一種文檔類型的建立和管理;CSingleDocTemplate、CMultiDocTemplate

可能用到的方法

GetDocString()

獲取與文檔相關的字符串

LoadTemplate()

加載指定模板

AddDocument()

給文檔模板添加指定模板

RemoveDocument()

從文檔模板列表中刪除文檔

GetFirstDocPosition()

獲取與文檔模板相關的第一個文檔的位置

GetNextDoc()

獲取文檔即下一個文檔

CreateNewDocument()

創建文檔

CreateNewFrame()

創建包含文檔和視圖的框架窗口

OpenDocumentFile()

打開有路徑名指定的文檔

CloseAllDocument()

關閉全部文檔

SetDefaultTitle()

顯示文檔窗口的標題欄內容

SaveAllModified()

查詢文檔模板的修改狀態並存儲相關的全部文檔

InitialUpdateFrame

觸發關聯視圖的OnInitialUpdate()

CloseAllDocuments

關閉全部關聯的文檔

CDocTemplate文檔模板中的字符串,這些是枚舉類型中的數據,經過GetDocString()才能訪問到字符串

windowTitle

應用程序的標題欄文字

docName

默認的新文檔名

fileNewName

若是有多個模板,先選擇模板對話框中顯示

filterName

文件對話框中對擴展名的描述

filterExt

文檔擴展名

regFileTypeId

該文檔類型的註冊名

regFileTypeName

該文檔類型對應註冊表中用戶可見的名稱

(5)CFrameWnd

框架窗口,維護工具條、菜單、狀態欄、視圖的顯示和刷新等;MDI程序中使用的是它的子類CMDIFrameWnd和CMDIChildWnd

類的成員

m_bAutoMenuEnable

禁用沒有消息處理的菜單項

rectDefault

默認尺寸的矩形

Create()

建立窗口,能夠重載改變一些窗口屬性

LoadFrame()

從資源加載框架

SaveBarState()

保存工具條的狀態

LoadBarState()

恢復工具條的狀態

ShowControlBar()

顯示工具條

EnableDocking()

使一個控制條能夠停靠

DockControlBar()

停靠一個控制條

FloatControlBar()

浮動一個控制條

GetControlBar()

獲取一個控制條

RecalLayout()

基於當前視圖和控制條從新計算顯示區域

InitialUpdateFrame()

調用全部關聯視圖的OnInitialUpdate()

GetActiveFrame()

MDI中獲取活動框架

SetActiveView()

激活一個視圖

GetActiveView()

獲取當前激活的視圖

CreateView()

建立一個視圖

GetActiveDocument()

獲取當前激活的文檔

GetMessageString()

獲取帶有命令ID的消息

GetMessageText()

在狀態欄顯示一條消息

GetMessageBar()

獲取指向狀態欄的指針

(6)5個核心類的相互訪問

當前對象

要訪問的對象

訪問方法

文檔

視圖

GetFirstViewPosition()、GetNextView()

文檔

模板

GetDocTemplate()

視圖

文檔

GetDocment()

視圖

框架

GetParentFrame()

框架

視圖

GetActiveView()

框架

文檔

GetActiveDocument()

MDI主框架

MDI子框架

MDIGetActive()

MDI子框架

MDI主框架

GetParentFrame()

任何位置

應用程序

AfxGetApp()

任何位置

主框架

AfxGetMainWnd()

4.在程序嚮導上建立SDI和MDI程序

(1)SDI

View類中OnDraw()的填充;

文檔序列化

(2)MDI

在類視圖中添加類MFC,輸入類名和基類

用相似的方法添加視圖View類

建立資源

//這個ID要和上一個表示類型的ID數值上連續,若是還有多個類型、可能須要修改#define _APS_NEXT_RESOURCE_VALUE

#define IDR_MYMDITYPE2 135

//在MyMdi.rc文件中IDR_MYMIDTYPE 「\n…」後面添加相似的代碼

IDR_MYMDITYPE2 「\nMyMdi2\n…」

建立主菜單資源,在MyMdi的資源視圖中複製IDR_MYMIDTYPE、修改出ID爲IDR_MYMDITYPE2的菜單

建立文檔模板類

BOOL CMyMdiApp::InitInstance()

{

CMultiDocTemplate* pDocTemplate2;

pDocTemplate2=new CMulitDocTemplate(

IDR_MYMDITYP2,

RUNTIME_CLASS(CMyMdiDoc2);

RUNTIME_CLASS(CChildFrame);

RUNTIME_CLASS(CMyMdiView2);

AddDocTemplate(pDocTemplate2);

}

擴展CMyMdiDoc2類、菜單處理函數和文檔序列化

View視圖的輸出

void CMyMdiView2::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: 在此添加消息處理程序代碼和/或調用默認值

CMyMdiDoc2* pDoc=(CMyMdiDoc2*)GetDocument();

m_drawData=new DrawData;

m_drawData->begin=point;

CView::OnLButtonDown(nFlags, point);

}

void CMyMdiView2::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: 在此添加消息處理程序代碼和/或調用默認值

CMyMdiDoc2* pDoc=(CMyMdiDoc2*)GetDocument();

pDoc->SetModifiedFlag(TRUE);

m_drawData->end=point;

CClientDC dc(this);

CBrush* brush=CBrush::FromHandle((HBRUSH)GetStockObject(HOLLOW_BRUSH));

dc.SelectObject(brush);

CRect rect(m_drawData->begin,m_drawData->end);

switch(pDoc->m_drawType)

{

case 0:

dc.MoveTo(m_drawData->begin);

dc.LineTo(m_drawData->end);

break;

case 1:

dc.Ellipse(rect);

break;

case 2:

dc.Rectangle(rect);

break;

}

m_drawData->type=pDoc->m_drawType;

pDoc->m_data.Add(m_drawData);

brush->DeleteObject();

Invalidate();

CView::OnLButtonUp(nFlags, point);

}

void CMyMdiView2::OnDraw(CDC* pDC)

{

CMyMdiDoc2* pDoc=(CMyMdiDoc2*)GetDocument();

// TODO: 在此添加繪製代碼

CBrush* brush=CBrush::FromHandle((HBRUSH)GetStockObject(HOLLOW_BRUSH));

pDC->SelectObject(brush);

int i;

for(i=0;i<pDoc->m_data.GetCount();++i)

{

m_drawData=(DrawData*)(pDoc->m_data.GetAt(i));

CRect rect(m_drawData->begin,m_drawData->end);

switch(m_drawData->type)

{

case 0:

pDC->MoveTo(m_drawData->begin);

pDC->LineTo(m_drawData->end);

break;

case 1:

pDC->Ellipse(rect);

break;

case 2:

pDC->Rectangle(rect);

break;

}

}

brush->DeleteObject();

}

5.MFC多線程

DWORD ThreadID;

CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&ThreadID);

void ThreadFunc(){…}

5、數據庫

1.有關數據庫的基礎知識

(1)CRecordView

用於顯示和操做數據;可能會出現中文亂碼的狀況,解決的辦法是文件->高級保存選項中選擇utf8,資源視圖中的全部視圖的語言都選成簡體中文

①可能用到的函數

CRecordView()

構造函數

OnInitialUpdate()

將CRecordView子類中的變量和數據庫的數據關聯起來

IsOnFirstRecord()

當前記錄是不是數據庫中的第一個記錄

IsOnLastRecord()

當前記錄是不是數據庫中的最後一個記錄

OnGetRecordset()

返回一個CRecordset類型的指針

OnMove()

在數據庫中移動遊標並將記錄顯示在視圖控件中,有相似BOOL的返回值

②OnMove參數的取值

ID_RECORD_FIRST

移動到數據庫的第一個記錄

ID_RECORD_LAST

移動到數據庫的最後一個記錄

ID_RECORD_NEXT

向後移動一個記錄

ID_RECORD_PREV

向前移動一個記錄

(2)CRecordSet

表示的是數據集,有兩種典型的表:動態保持數據庫中的數據dynasets、靜態的數據庫snapshots

①成員

m_hstmt

調用Open()後包含有描述ODBC數據源的句柄

m_nFields

數據庫的屬性變量,它指示了從數據源讀取的記錄個數

m_nParams

用來指示CRecordset的派生類的參數個數,默認值是0

m_pDatabase

指向CDatabase的指針、指向當前數據庫打開的數據源

m_strFilter

構造CRecordset類後、調用Open函數前,使用這個變量填寫一個CString對象,就像SQL語句的WHERE條件部分

m_strSort

構造CRecordset類後、調用Open函數前,使用這個變量填寫一個CString對象,就像SQL語句的ORDER BY部分

②成員函數

Open()

打開一個數據源,返回相似BOOL的值

Close()

關閉一個數據集

CanAppend()

判斷打開的數據源是否容許加入新記錄

CanBookmark()

判斷數據源是否支持書籤的功能

CanRestart()

判斷數據源是否支持從新執行查詢語句

CanScroll()

判斷數據源是否支持翻閱的功能

CanTransact()

判斷數據源是否支持事務

CanUpdate()

判斷數據源是否可以更新

GetRecordCount()

獲取數據庫中記錄的數目

GetStatus()

獲取數據源的狀態,這是一個CRecordsetStatus類型的指針

GetTableName()

獲取一張表的名稱

GetSQL()

獲取一個SQL語句,這是CString類型的指針

IsOpen()

判斷數據源是否已經打開

IsBOF()

判斷數據庫是否爲空

IsEOF()

判斷是否到了最後一條記錄

IsDeleted()

判斷指向的記錄是不是一個被刪除的記錄

AddNew()

添加一個新紀錄,調用Update()後記錄才加入到數據源中去

CancelUpdate()

取消對數據源的修改,在AddNew()、Edit()以後,Update()以前纔會有效

Delete()

刪除當前指向的記錄,遊標移走後被刪除的記錄再沒法恢復

Move()

在數據庫中移動記錄指針,相似的函數有MoveNext()、MovePrev()、MoveFirst()、MoveLast()、SetBookmark()、SetAbsolutePosition()

GetDefaultConnect()

獲取一個默認鏈接的數據源

GetDefaultSQL()

獲取相應的默認的SQL語句

Requery()

刷新snapshots數據庫,調用前要使用Open()

③virtual BOOL Open(UINT nOpenType,LPCTSTR lpszSQL,DWORD dwOptions);的參數

nOpenType

默認方式AFX_DB_USE_DEFAULT_TYPE 、dynaset、snapshot、dynamic、只能向前翻閱forwardOnly

lpszSQL

表示SQL語句的字符串

dwOptions

選擇數據的風格,能夠填NULL

④dwOptions數據源的打開方式

openReadOnly

只讀

useCursorLib

加載ODBC Cursor Library DLL

noOdbcDialog

不出現ODBC鏈接對話框

forceOdbcDialog

總要出現ODBC鏈接對話框

⑤virtual void Move(long nRows,WORD wFetchType);的參數

nRows是要移動的行數、wFetchType是要進行的動做

SQL_FETCH_RELATIVE

默認值,移動到距離第一個記錄的指定行上

SQL_FETCH_NEXT

移到下一個記錄

SQL_FETCH_PRIOR

移到上一個記錄

SQL_FETCH_FIRST

移到第一個記錄

SQL_FETCH_LAST

移到最後一個記錄

SQL_FETCH_ABSOLUTE

nRows大於0、移到nRows行後,nRows小於0、移到倒數nRows行後,不然返回BOF

SQL_FETCH_BOOKMARK

在指定位置設置標籤

(3)CDatabase

用於鏈接一個數據源

①可能用到的成員函數

Open()

打開一個數據源,返回相似BOOL的值

Close()

關閉一個數據源

ExecuteSQL()

執行SQL語句

CanTransact()

判斷數據源是否支持事務處理

SetLoginTimeout()

設置鏈接超時的時間,單位是s

GetConnect()

返回當前對象的ODBC數據源的名稱

Rollback()

事務回滾

GetDatabaseName()

返回當前鏈接的數據源的名稱,這個名稱不必定是ODBC控制檯登記的名稱

IsOpen()

判斷當前對象是否鏈接着數據源

CanUpdate()

判斷數據源是否可修改

BeginTrans()

開始一個事務的操做

CommitTrans()

提交一個數據庫事務

②virtual BOOL Open(LPCTSTR lpszDSN,BOOL bExclusive,BOOL bReadOnly,LPCTSTR lpszConnect,BOOL bUseCursorLib);的參數

相似的函數是virtual BOOL OpenEX(LPCTSTR lpszConnectString,DWORD dwOptions);

lpszDSN

ODBC控制檯中註冊的數據源的名稱,若是lpszConnect已經有DSN值的話能夠取NULL

bExclusive

共享方式打開的數據源取FALSE

bReadOnly

只讀

lpszConnect

包含用戶和密碼的描述字符串

bUseCursorLib

加載ODBC的Cursor Library DLL

lpszConnectString

包含用戶和密碼的描述字符串

(4)RFX

和DDX相似,RFX用於視圖和數據源自動交換數據,有時候須要自定義的代碼:帶參數的查詢、數據庫中表之間的鏈接

(5)CDBException

拋出一個異常void AfxThrowDBException(RETCODE nRetCode,CDatabase* pdb,HSTMT hstmt);

2.創建ODBC數據源

進入Access建立一個空數據庫、創建字段、填充數據,這個數據庫默認用戶名是admin密碼爲空,若是想要設置用戶名和密碼能夠以獨佔讀取.mdb文件的方式、在工具->安全中設置新的用戶名和密碼;

控制面板->管理工具-> ODBC 數據源(32 位)->系統DSN->添加.mdb->命名數據源註冊的名稱、選擇數據庫文件

3.顯示數據庫中的數據

若是隻是和數據庫的記錄打交道,在項目嚮導中選擇「不支持文件的數據庫視圖」;

在資源視圖中設計表單的樣式、定義各控件的ID;

填充數據到視圖的映射代碼:

void CMy3View::DoDataExchange(CDataExchange* pDX)

{

CRecordView::DoDataExchange(pDX);

// 能夠在此處插入 DDX_Field* 函數以將控件「鏈接」到數據庫字段,例如

// DDX_FieldText(pDX, IDC_MYEDITBOX, m_pSet->m_szColumn1, m_pSet);

// DDX_FieldCheck(pDX, IDC_MYCHECKBOX, m_pSet->m_bColumn2, m_pSet);

// 有關更多信息,請參閱 MSDN 和 ODBC 示例

DDX_FieldText(pDX,IDC_EDIT1,m_pSet->m_Sno,m_pSet);

DDX_FieldText(pDX,IDC_EDIT2,m_pSet->m_Sname,m_pSet);

DDX_FieldText(pDX,IDC_EDIT3,m_pSet->m_Ssex,m_pSet);

DDX_FieldText(pDX,IDC_EDIT4,m_pSet->m_Sage,m_pSet);

DDX_FieldText(pDX,IDC_EDIT5,m_pSet->m_Sdept,m_pSet);

}

4.對記錄進行排序

能夠在工具欄或菜單項中設計按鈕、定義ID,爲這個控件的COMMAND消息設計觸發事件:

void CMy3View::OnSortPrice()

{

// TODO: 在此添加命令處理程序代碼

m_pSet->Close();

m_pSet->m_strSort=L"Sage";

//從新使用成員變量m_strSort

//m_pSet->Open(-1,L"SELECT * FROM Student WHERE Sdept='CS'",NULL);

m_pSet->Open();

//更新表單

UpdateData(FALSE);

}

5.增添記錄

清空當前表單,就能夠在表單中新添一些數據:

void CMy3View::OnClearRecord()

{

// TODO: ?????í???ü?????í???ò?ú??

m_pSet->SetFieldNull(NULL);

UpdateData(FALSE);

}

在工具欄或菜單項中設計按鈕、定義ID,爲這個控件的COMMAND消息設計觸發事件:

void CMy3View::OnRecordAdd()

{

// TODO: ?????í???ü?????í???ò?ú??

CRecordset* pSet=OnGetRecordset();

if(pSet->CanUpdate() && !pSet->IsDeleted())

{

pSet->Edit();

if(!UpdateData())

return;

pSet->Update();

}

m_pSet->AddNew();

m_pSet->Update();

m_pSet->Requery();

m_pSet->MoveLast();

UpdateData(FALSE);

}

6.刪除記錄

默認狀況下,用戶移動一個記錄就會對數據庫進行修改,因此須要重載View類的OnMove():

BOOL CMy3View::OnMove(UINT nIDMoveCommand)

{

// TODO: ?????í??ר???ú????/?ò?÷???ù?à

switch(nIDMoveCommand)

{

case ID_RECORD_PREV:

m_pSet->MovePrev();

if(!m_pSet->IsBOF())

break;

case ID_RECORD_FIRST:

m_pSet->MoveFirst();

break;

case ID_RECORD_NEXT:

m_pSet->MoveNext();

if(!m_pSet->IsEOF())

break;

if(!m_pSet->CanScroll())

{

m_pSet->SetFieldNull(NULL);

break;

}

case ID_RECORD_LAST:

m_pSet->MoveLast();

break;

default:

ASSERT(FALSE);

}

UpdateData(FALSE);

return TRUE;

//return CRecordView::OnMove(nIDMoveCommand);

}

在工具欄或菜單項中設計按鈕、定義ID,爲這個控件的COMMAND、UPDATE_COMMAND_UI消息設計觸發事件:

void CMy3View::OnDeleteRecord()

{

// TODO: ?????í???ü?????í???ò?ú??

CRecordsetStatus m_cStatus;

try

{

m_pSet->Delete();

}

catch(CDBException* m_pEx)

{

AfxMessageBox(m_pEx->m_strError);

m_pEx->Delete();

m_pSet->MoveFirst();

UpdateData(FALSE);

return;

}

m_pSet->GetStatus(m_cStatus);

if(m_cStatus.m_lCurrentRecord==0)

m_pSet->MoveFirst();

else

m_pSet->MoveNext();

UpdateData(FALSE);

}

void CMy3View::OnUpdateDeleteRecord(CCmdUI *pCmdUI)

{

// TODO: ?????í???ü???ü?????§???????í???ò?ú??

pCmdUI->Enable(!m_pSet->IsEOF());

}

7.查詢記錄

void CMy3View::OnSearch()

{

// TODO: 在此添加命令處理程序代碼

DoFilter(L"Sdept");

}

// 僅供內部重複使用的函數

void CMy3View::DoFilter(CString col)

{

CSearchDlg dlg;

if(dlg.DoModal()==IDOK)

{

CString str=col+L"='"+dlg.m_Edit_Search+L"'";

m_pSet->Close();

m_pSet->m_strFilter=str;

m_pSet->Open();

if(m_pSet->GetRecordCount()==0)

{

MessageBox(L"沒有匹配的記錄!");

m_pSet->Close();

m_pSet->m_strFilter=L"";

m_pSet->Open();

}

UpdateData(FALSE);

}

}

8.修改記錄

默認狀況下,用戶移動一個記錄就會對數據庫進行修改,因此須要重載View類的OnMove();

在工具欄或菜單項中設計按鈕、定義ID,爲這個控件的COMMAND、UPDATE_COMMAND_UI消息設計觸發事件:

void CMy3View::OnUpdateRecord()

{

// TODO: ?????í???ü?????í???ò?ú??

m_pSet->Edit();

UpdateData(TRUE);

if(m_pSet->CanUpdate())

{

m_pSet->Update();

}

}

void CMy3View::OnUpdateUpdateRecord(CCmdUI *pCmdUI)

{

// TODO: ?????í???ü???ü?????§???????í???ò?ú??

pCmdUI->Enable(!m_pSet->IsEOF());

}

9.移動到指定的位置

在資源視圖中創建對話框和相關的類、編輯框的變量m_RecordID;

在工具欄或菜單項中設計按鈕、定義ID,爲這個控件的COMMAND消息設計觸發事件:

void CMy3View::OnMovetorecord()

{

// TODO: ?????í???ü?????í???ò?ú??

CMoveToRecord dlgMoveTo;

if(dlgMoveTo.DoModal()==IDOK)

{

CRecordset* pSet=OnGetRecordset();

if(pSet->CanUpdate() && !pSet->IsDeleted())

{

pSet->Edit();

if(!UpdateData())

return;

pSet->Update();

}

pSet->SetAbsolutePosition(dlgMoveTo.m_RecordID);

UpdateData(FALSE);

}

}

6、多媒體

1.音頻播放

(1)使用音頻函數的方式

①BOOL MessageBeep(UINT nType);播放系統提示音

0xFFFFFFFF

系統默認的聲音

MB_ICONINFORMATION或MB_ICONASTERISK

出現信息消息框時的聲音

MB_ICONEXLAMATION或MB_ICONWARNING

出現警告消息框時的聲音

MB_ICONHAND或MB_ICONSTOP或MB_ICONERROR

出現錯誤提示框時的聲音

MB_ICONQUESTION

出現詢問對話框時的聲音

MB_OK

系統默認聲音

②BOOL sndPlaySound(LPCSTR lpszSound,UINT fuSound);播放指定文件名或是註冊表中已有的聲音

fuSound播放標識

SND_ASYNC

異步播放聲音,進入函數後當即返回,終止的辦法是sndPlaySound(…,NULL);

SND_LOOP

循環播放聲音,可是要和SND_ASYNC一同使用,終止辦法和上一個相同

SND_MEMORY

第一個參數是.wav在內存中的映像

SND_NODEFAULT

當沒法正常播放聲音時不播放系統默認聲音

SND_NOSTOP

若是有聲音正在播放,則返回FALSE、終止運行

SND_SYNC

同步方式播放聲音,只有聲音播放結束才返回結果

註冊表中已有的聲音

SystemAsterisk

出現信息消息框時的聲音

SystemExclamation

出現警告消息框時的聲音

SystemExit

系統退出時的提示音

SystemHand

出現錯誤提示框時的聲音

SystemQuestion

出現詢問對話框時的聲音

SystemStart

系統啓動提示音

③BOOL PlaySound(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);

fdwSound指定聲音的來源,若是沒有指定先到註冊表中找、再到文件中找;NULL表示中止當前.wav聲音,SND_PURGE表示中止其餘聲音;hmod是資源文件的句柄。

fdwSound的取值

SND_ALIAS

註冊條目

SND_RESOURCE

來自資源

SND_FILENAME

來自文件

SND_NOWAIT

若是設備正使用,當即返回再也不播放

SND_APPLICATION

用用應用程序制定的音頻

SND_PURGE

中止聲音播放

SND_ALIAS_ID

預先肯定的聲音標識

(2)使用MCI的方式

MCI指的是媒體控制接口類Media Control Interface,能夠支持更復雜的音頻操做:暫停、向前搜索、向後搜索、對音頻文件進行編輯等;對MCI設備進行控制的兩個方法,MCI命令串mciSendString()、MCI命令消息mciSendCommand(),可是發送命令消息要比發送命令字串要高效。

①可能用到的函數

MCIERROR mciSendCommand(

//接收命令消息的MCI設備ID,能夠經過MCI_OPEN()得到

// MCIERROR的低字節存儲錯誤值、高字節存儲設備標識,執行正確的返回結果MCIERROR爲0

MCIDEVICEID IDDevice,

//要發送的命令消息

UINT uMsg,

//命令消息的標誌集

DWORD fdwCommand,

//包含命令消息參數的結構體地址

DWORD_PTR dwParam);

要發送的命令消息uMsg

MCI_BREAK

爲MCI設備設置終止鍵,默認是ctrl+break

所有設備

MCI_STATUS

獲取一個MCI設備的信息

MCI_CLOSE

釋放出訪問設備的通道

MCI_SYSINFO

獲取MCI設備的信息

MCI_GETDEVCAPS

獲取一個設備的靜態信息

MCI_INFO

獲取一個設備的字串信息

MCI_OPEN

初始化一個設備

MCI_CAPTURE

獲取緩衝區中每一幀的內容並存入指定文件

數字視頻

MCI_CONFIGURE

顯示一個對話框用於設置操做

MCI_UNDO

撤銷最近一次操做

MCI_LOAD

加載一個文件

MCI_PUT

設置來源、目的和框架矩形

MCI_UPDATE

更新顯示矩形

MCI_COPY

拷貝數據到粘貼板

MCI_WHERE

獲取視頻設備的剪切板模型

MCI_WINDOW

指定窗口和窗口特性用於圖形設備

MCI_CUT

剪切數據到粘貼板

MCI_MONITOR

指定陳述的來源

MCI_PASTE

將粘貼板上的數據粘貼到文件中

MCI_QUALITY

指定多媒體的質量

MCI_RESERVE

爲下面的記錄分配一塊磁盤空間

MCI_RESTORE

將一幅位圖由文件拷貝到緩衝區中

MCI_SIGNAL

在工做區中設置一個指定位置

MCI_PAUSE

暫停當前播放的位置

CD音頻、數字視頻、MIDI序列、錄像機、影碟機、.wav文件

MCI_PLAY

設備開始輸出數據

MCI_SET

設置設備信息

MCI_STOP

中止全部的播放記錄並釋放緩存

MCI_CUE

提示一個設備、使設備以最小的延遲進行播放或重放

數字視頻、錄像機、.wav文件

MCI_RESUME

恢復被暫停的操做

MCI_FREEZE

凍結顯示中的畫面

數字視頻、錄像機

MCI_LIST

獲取可用於輸入設備關於數量和類型方面的信息

MCI_SETAUDIO

設置與音頻回放、捕捉相關的變量

MCI_SETVIDEO

設置與視頻回放相關的變量

MCI_UNFREEZE

恢復執行了MCI_FREEZE命令的設備

MCI_DELETE

刪除文件中的數據

數字視頻、.wav文件

MCI_ESCAPE

直接發送一個字串到指定設備

影碟機

MCI_SPIN

使設備開始轉動或中止

MCI_INDEX

將屏幕上的顯示置爲on或off

錄像機

MCI_SETTIMECODE

使用或禁用VCR設備錄音的時間代碼

MCI_SETTUNER

設置調製器的當前頻道

MCI_MARK

記錄或擦除以使MCI_SEEK命令得到更高的尋找速度

MCI_RECORD

從當前位置或指定的起始、終止位置開始記錄

錄像機、.wav文件

MCI_SAVE

保存當前文件

.wav文件

MCI_SEEK

以最快的速度改變當前內容的輸出位置

CD音頻、數字視頻、MIDI序列、錄像機、影碟機

MCI_STEP

跳過一幀或多幀

數字視頻、錄像機、CAV格式影碟機

檢測錯誤

BOOL mciGetErrorString(

//錯誤代碼

DWORD fdwError,

//用於描述錯誤內容的字符串

LPTSTR lpszErrorText,

//錯誤內容的緩衝區容量

UINT cchErrorText);

②環境配置:在stdafx.h中_AFX_NO_AFXCMN_SUPPORT下面添加#include <mmsystem.h>;

右擊工程->屬性->連接器->輸入,在附加依賴項中輸入winmm.lib

③對話框類中添加可能用到的數據:

// 判斷正在播放的標誌

BOOL m_PSign;

// 判斷正在暫停的標誌

BOOL m_ASign;

// 用來存儲錯誤代碼

DWORD dwError;

// 用來存儲打開設備的ID值

MCIDEVICEID m_MCIDeviceID;

// 用來存儲出錯的內容

char szErrorBuf[MAXERRORLENGTH];

④選擇要播放的音樂

void CMy0Dlg::OnOpenButton()

{

// TODO: 在此添加控件通知處理程序代碼

//文件名

CString fileName;

//文件擴展名

CString fileExt;

MCI_OPEN_PARMS mciOpenParms;

DWORD dwError;

static TCHAR szFilter[]=L"波形音頻文件(*.wav)|*.wav|MIDI序列(*.mid)|*.mid||";

CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);

if(dlg.DoModal()==IDOK)

{

//這個地方可能有問題?

fileName=dlg.GetFolderPath()+L"\\"+dlg.GetFileName();

fileExt=dlg.GetFileExt();

//AfxMessageBox(L"fileName: "+fileName+L"\nfileExt: "+fileExt);

//若是程序正在播放則關閉

if(m_PSign)

{

dwError=mciSendCommand(m_MCIDeviceID,MCI_CLOSE,0,NULL);

if(dwError)

{

if(mciGetErrorString(dwError,(LPTSTR)szErrorBuf,MAXERRORLENGTH))

MessageBox((LPCTSTR)szErrorBuf,L"MCI出錯0",MB_ICONWARNING);

else

MessageBox(L"不明錯誤標識",L"MCI出錯0",MB_ICONWARNING);

return;

}

}

if(!_tcscmp(L"wav",fileExt))

mciOpenParms.lpstrDeviceType=L"waveaudio";

else if(!_tcscmp(L"mid",fileExt))

mciOpenParms.lpstrDeviceType=L"sequencer";

mciOpenParms.lpstrElementName=fileName;

//將打開的文件名存入mciOpenParms結構體中

dwError=mciSendCommand(0,MCI_OPEN,MCI_OPEN_TYPE|MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);

if(dwError)

{

if(mciGetErrorString(dwError,(LPTSTR)szErrorBuf,MAXERRORLENGTH))

MessageBox((LPCTSTR)szErrorBuf,L"MCI出錯1",MB_ICONWARNING);

else

MessageBox(L"不明錯誤標識",L"MCI出錯1",MB_ICONWARNING);

return;

}

m_MCIDeviceID=mciOpenParms.wDeviceID;

m_PSign=FALSE;

m_ASign=FALSE;

}

}

⑤播放音樂

void CMy0Dlg::OnBnClickedPlayButton()

{

// TODO: 在此添加控件通知處理程序代碼

//存儲與播放有關的信息

MCI_PLAY_PARMS mciPlayParms;

//若是沒有正在播放的聲音

if(!m_PSign)

{

//爲MM_MCINOTIFY消息指定窗口句柄

mciPlayParms.dwCallback=(long)GetSafeHwnd();

//播放位置從頭開始

mciPlayParms.dwFrom=0;

dwError=mciSendCommand(m_MCIDeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms);

if(dwError)

{

if(mciGetErrorString(dwError,(LPTSTR)szErrorBuf,MAXERRORLENGTH))

MessageBox((LPCTSTR)szErrorBuf,L"MCI出錯",MB_ICONWARNING);

else

MessageBox(L"不明錯誤標識",L"MCI出錯",MB_ICONWARNING);

return;

}

m_PSign=TRUE;

}

}

⑥暫停/繼續

void CMy0Dlg::OnBnClickedPauseButton()

{

// TODO: 在此添加控件通知處理程序代碼

//有正在播放的聲音

if(m_PSign)

{

//不是暫停狀態

if(!m_ASign)

{

dwError=mciSendCommand(m_MCIDeviceID,MCI_PAUSE,0,NULL);

if(dwError)

{

if(mciGetErrorString(dwError,(LPTSTR)szErrorBuf,MAXERRORLENGTH))

MessageBox((LPCTSTR)szErrorBuf,L"MCI出錯",MB_ICONWARNING);

else

MessageBox(L"不明錯誤標識",L"MCI出錯",MB_ICONWARNING);

return;

}

m_ASign=TRUE;

}

else

{

dwError=mciSendCommand(m_MCIDeviceID,MCI_RESUME,0,NULL);

if(dwError)

{

if(mciGetErrorString(dwError,(LPTSTR)szErrorBuf,MAXERRORLENGTH))

MessageBox((LPCTSTR)szErrorBuf,L"MCI出錯",MB_ICONWARNING);

else

MessageBox(L"不明錯誤標識",L"MCI出錯",MB_ICONWARNING);

return;

}

m_ASign=FALSE;

}

}

}

⑦播放結束後須要響應MM_MCINOTIFY,對類中的標記作修改

對話框的頭文件中添加

afx_msg LRESULT MciNotify(WPARAM wParam,LPARAM lParam);

對話框的源文件中添加消息映射

ON_MESSAGE(MM_MCINOTIFY,MciNotify)

定義作出響應的函數

LRESULT CMy0Dlg::MciNotify(WPARAM wParam,LPARAM lParam)

{

if(wParam==MCI_NOTIFY_SUCCESSFUL)

{

AfxMessageBox(L"enter.");

m_PSign=FALSE;

m_ASign=FALSE;

return 0;

}

return -1;

}

2.視頻播放

資源視圖->右鍵->插入ActiveX控件->選擇Windows Media Player;

項目->添加類->ActiveX控件中的MFC類;

來源選擇「文件」,「位置」是C:\windows\system32\wmp.dll,「接口」選擇IWMPPlayer4;

對話框類的頭文件中加入#include 「CWMPPlayer4.h」;

再次進入資源視圖,爲這個ActiveX控件添加變量m_mediaPlay;

爲這個ActiveX控件添加觸發事件:

void CMy0Dlg::DoubleClickOcx1(short nButton, short nShiftState, long fX, long fY)

{

// TODO: 在此處添加消息處理程序代碼

CFileDialog dlg(TRUE,NULL,L"*.*",OFN_FILEMUSTEXIST,

L"ActiveStreamingFormat(*.asf)|*.asf|"

L"AudioVidesInterleaveFormat(*.avi)|*.avi|"

L"RealAudio/RealVideo(*.rm)|*.rm|"

L"WaveAudio(*wav)|*.wav|"

L"MIDIFile(*.mid)|*.mid|"

L"全部文件(*.*)|*.*||");

if(dlg.DoModal()==IDOK)

m_mediaPlay.put_URL(dlg.GetPathName());

}

3.圖片顯示

OleLoadPicture支持加載.png、.jpg、.gif等格式的圖片

(1) 建立SDI工程
(2) 在View類中添加數據成員:

// 用來裝載圖片的變量

LPPICTURE m_pPicture;

// 是否壓縮顯示

BOOL m_bScale;

(3) 新數據成員的初始化和銷燬:

CMy4View::CMy4View()

: m_bScale(FALSE)

{

// TODO: 在此處添加構造代碼

m_pPicture=NULL;

m_bScale=FALSE;

}

CMy4View::~CMy4View()

{

if(m_pPicture)

{

m_pPicture->Release();

}

}

(4) 經過菜單項打開文件:

void CMy4View::OnOperOpen()

{

// TODO: 在此添加命令處理程序代碼

//保存文件名的緩衝,有必要測試下這個對象!

TCHAR szFile[MAX_PATH];

//初始化該緩衝

ZeroMemory(szFile,MAX_PATH);

//用於打開文件的結構體

OPENFILENAME ofn;

//初始化該結構

ZeroMemory(&ofn,sizeof(OPENFILENAME));

//設置結構的大小

ofn.lStructSize=sizeof(OPENFILENAME);

ofn.Flags=OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY;

//文件框的父窗口

ofn.hwndOwner=m_hWnd;

ofn.lpstrFilter=

L"Supported Files Types(*.bmp;*.gif;*.jpg;*.ico;*.emf;*.wmf)\0*.bmp;*.gif;*.jpg;*.ico;*.emf;*.wmf\0"

L"Bitmaps(*.bmp)\0*.bmp\0"

L"GIF Files(*.gif)\0*.gif\0"

L"JPEG Files(*.jpg)\0*.jpg\0"

L"Icons(*.ico)\0*.ico\0"

L"Enhanced Metafiles(*.emf)\0*.emf\0"

L"Windows Metafiles(*.wmf)\0*.wmf\0\0";

//文件框的標題

ofn.lpstrTitle=L"選擇圖片";

//返回文件名的緩衝

ofn.lpstrFile=szFile;

//設置緩衝的長度

ofn.nMaxFile=MAX_PATH;

if(GetOpenFileName(&ofn)==IDOK)

loadPicture(szFile);

}

void CMy4View::loadPicture(CString strFile)

{

//打開文件

HANDLE hFile=CreateFile(strFile,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);

_ASSERTE(INVALID_HANDLE_VALUE!=hFile);

//獲取文件的大小

DWORD dwFileSize=GetFileSize(hFile,NULL);

_ASSERTE(dwFileSize!=-1);

LPVOID pvData=NULL;

//分配全局內存,獲取內存句柄

HGLOBAL hGlobal=GlobalAlloc(GMEM_MOVEABLE,dwFileSize);

_ASSERTE(hGlobal!=NULL);

//鎖定內存,獲取內存指針

pvData=GlobalLock(hGlobal);

_ASSERTE(pvData!=NULL);

DWORD dwBytesRead=0;

//讀取文件

BOOL hRead=ReadFile(hFile,pvData,dwFileSize,&dwBytesRead,NULL);

_ASSERTE(hRead!=FALSE);

GlobalUnlock(hGlobal);

CloseHandle(hFile);

LPSTREAM pstm=NULL;

//從內存數據建立IStream*

HRESULT hr=CreateStreamOnHGlobal(hGlobal,TRUE,&pstm);

_ASSERTE(pstm&&SUCCEEDED(hr));

if(m_pPicture)

m_pPicture->Release();

//賦值、全局做用域(Windows api),從IStream接口加載圖片到IPicture中

hr=::OleLoadPicture(pstm,dwFileSize,FALSE,IID_IPicture,(LPVOID*)&m_pPicture);

_ASSERTE(m_pPicture&&SUCCEEDED(hr));

pstm->Release();

Invalidate();

}

(5) 對圖片進行繪製:

void CMy4View::OnDraw(CDC* pDC)

{

CMy4Doc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if (!pDoc)

return;

// TODO: 在此處爲本機數據添加繪製代碼

if(m_pPicture)

{

long hmWidth;

long hmHeight;

m_pPicture->get_Width(&hmWidth);

m_pPicture->get_Height(&hmHeight);

int nWidth=MulDiv(hmWidth,GetDeviceCaps(pDC->GetSafeHdc(),LOGPIXELSX),HIMETRIC_INCH);

int nHeight=MulDiv(hmHeight,GetDeviceCaps(pDC->GetSafeHdc(),LOGPIXELSY),HIMETRIC_INCH);

CRect rc;

GetClientRect(&rc);

if(m_bScale)

{

//建立內存DC

CDC memdc;

memdc.CreateCompatibleDC(pDC);

//建立位圖

CBitmap bmp;

bmp.CreateCompatibleBitmap(pDC,nWidth,nHeight);

//將位圖選入內存DC

memdc.SelectObject(bmp);

//將圖片以原始尺寸繪製到內存DC中

m_pPicture->Render(memdc.GetSafeHdc(),0,0,nWidth,nHeight,0,hmHeight,hmWidth,-hmHeight,&rc);

//從內存DC縮放拷貝到顯示DC

pDC->StretchBlt(0,0,nWidth/2,nHeight/2,&memdc,0,0,nWidth,nHeight,SRCCOPY);

}

else

m_pPicture->Render(pDC->GetSafeHdc(),0,0,nWidth,nHeight,0,hmHeight,hmWidth,-hmHeight,&rc);

}

}

//經過菜單項控制是否縮放

void CMy4View::OnOperSize()

{

// TODO: 在此添加命令處理程序代碼

m_bScale=!m_bScale;

Invalidate();

}

void CMy4View::OnUpdateOperSize(CCmdUI *pCmdUI)

{

// TODO: 在此添加命令更新用戶界面處理程序代碼

pCmdUI->SetCheck(m_bScale);

}

7、網絡編程

1.利用WinInet抓取網頁

對基於對話框的MFC工程設置設置屬性:

工程->屬性->連接器->輸入WinInet.lib

爲CInternetSession m_session;封裝一個類;

從網頁獲取信息:

CString MyWinInetClass::ConnectHttp(const CString sUrl)

{

CString sResult;

CInternetFile* hHttpFile=NULL;

sResult=L"";

sResult=sResult+L"Trying to connect Http sites: "+sUrl+L"\r\n";

hHttpFile=(CInternetFile*)m_session.OpenURL(sUrl);

if(hHttpFile)

{

sResult=sResult+L"Connection established.\r\n";

CString sLine;

while(hHttpFile->ReadString(sLine))

sResult=sResult+sLine+L"\r\n";

hHttpFile->Close();

}

else

sResult=sResult+L"There are some errors in finding this Http sites";

return sResult;

}

更新界面UI:

void CMy5Dlg::OnBnClickedButtonHttp()

{

// TODO: 在此添加控件通知處理程序代碼

UpdateData(TRUE);

m_editResult=L"";

m_editResult=m_editResult+m_WinInetClass.ConnectHttp(m_url);

UpdateData(FALSE);

}

8、附錄

1.vs的快捷鍵

f9

設置斷點

f5

編譯

ctrl+f5

運行

ctrl+k+c

註釋一行

ctrl+k+u

反註釋一行

ctrl+h

快速替換

ctrl+]

括號匹配

ctrl+shift+]

選中括號匹配中的代碼

ctrl+c,ctrl+x

能夠是行操做,不用選中

ctrl+l

刪除一行

ctrl+tab

子窗口切換

alt+右箭頭

自動補全、方法提示

ctrl+k

添加書籤

shift+f2

到下一個書籤

f2

到上一個書籤

選中代碼中的內容,f1

在MSDN中查找對應的文檔

crl+a,ctrl+k+f

格式化代碼

選中代碼中的內容,f12

轉到定義

alt+鼠標向下拖動

編輯列

相關文章
相關標籤/搜索