目錄 數據庫
1、MFC簡介... 4 編程
1.MFC的組織結構... 4 windows
(1)根類... 4 api
(4)通用類... 7 安全
(5)OLE類... 8 網絡
(6)ODBC數據庫類... 8 session
2.全局變量和函數... 9 多線程
(2)在資源視圖中插入新的Dialog,編輯須要的控件... 44
(4)在對話框類中爲須要的控件添加須要的數據變量... 44
正文
MFC即Microsoft Foundation Class,封裝了不少windows api和windows控件,能夠明顯的縮短程序設計的週期(填充框架、添加功能便可)
按照結構和功能上分類
CObject是MFC中大多數類的基類,這個類有序列化、查詢對象運行時信息等功能,序列化是指將對象的數據存儲下來;更詳細的資料須要查看MSDN文檔
Serialize() |
|
IsSerializable() |
|
IsKindof() |
是不是某個類或者派生類 |
GetRuntimeClass() |
包括它的類名、基類名等信息 |
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 |
支持打印預覽 |
①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有關 |
①文件類
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 |
將鍵映射到值,鍵和值都是指針 |
OLE指的是對象鏈接和嵌入,和複合文檔的處理有關(一般見到的word、excel),ActiveX在網絡編程方面對OLE作了進一步的擴展
普通類 |
COleDocument、COleItem、COleException |
用戶類 |
COleClientDoc、COleClientItem |
服務類 |
COleServer、COleTemplate、COleServerDoc、COleServerItem |
可視編輯容器類 |
COleClientItem、COleLinkingDOC |
數據傳輸類 |
COleDropSource、COleDropTarget、COleDataSource、COleDataObject |
對話類 |
COleInsertDialog |
其餘 |
CRectTracker爲複合文檔中的某項創建邊框,使之可移動和可調整大小 |
CDatabase |
面向ODBC驅動程序的一種標準界面 |
CRecordset |
面向ODBC驅動程序的一種標準界面 |
CRecordView |
CFormView的子類,將查詢集和顯示的字段關聯起來,便於直觀操做 |
CFieldExchange |
提供上下文信息,支持記錄字段交換 |
CLongBinary |
用於存儲二進制對象,好比位圖 |
CDBException |
數據庫存取異常 |
通常以Afx開頭,函數中不包括數據庫類的函數和Dialog Data Exchange的內容
AfxMessageBox() |
彈出一個對話框 |
AfxGetApp() |
獲取一個指向CWinApp對象的指針 |
AfxGetInstanceHandle() |
獲取當前實例的句柄 |
AfxGetResourceHandle() |
獲取一個應用程序資源的句柄 |
AfxGetAppName() |
獲取一個指向應用程序名稱的字符串指針 |
AfxAbort() |
無條件終止一個應用程序 |
AfxBeginThread() |
啓動一個新線程 |
AfxEndThread() |
終止當前線程 |
AfxFormatString() |
格式化字符串 |
AfxRegisterWndClass() |
註冊windows窗口類 |
使用特定的框架或者添加一些內置的功能
控件幾乎都繼承了CWnd類具備窗口的屬性,所以具備一些通用的方法,好比顯示或隱藏控件MoveWindow()、改變控件的位置SetWindowPos()、設置文本內容SetWindowText(),用代碼或者在資源視圖中拖拽均可以建立控件;在資源視圖中右擊控件能夠添加變量、根據控件的消息添加一些消息處理的代碼;格式->Tab鍵順序,依次點擊能夠獲得一個想要的tab鍵切換順序;項目上右鍵選擇「MFC類」能夠擴展出自定義的控件類
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 |
指定一個自繪製按鈕 |
BN_CLICKED |
單擊 |
BN_DOUBLECLICKED |
雙擊 |
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() |
和按鈕上的文字有關 |
BOOL Create(
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID);
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 |
滾動到最終位置 |
EnableScrollBar() |
使滾動條的一個或兩個箭頭有效或無效 |
GetScrollInfo() |
獲取滾動條的消息 |
GetScrollLimit() |
獲取滾動條的範圍 |
GetScrollPos() |
獲取滾動條的當前位置 |
GetScrollRange() |
獲取滾動條的滾動範圍 |
SetScrollInfo() |
設置滾動條的消息 |
SetScrollPos() |
設置滾動滑塊的位置 |
SetScrollRange() |
設置滾動條的滾動範圍 |
ShowScrollBar() |
顯示或隱藏滾動條 |
通常用在不發送消息也不接收消息的文本或圖形上,可是也能想超文本連接那樣響應用戶的操做,這就要用到SS_NOTIFY樣式向父窗口發送WM_COMMAND消息(記事本查看Visual C++ 2008編寫的.rc文件能夠發現這個問題)
Win32的作法或者在資源視圖中經過拖拽添加
STN_CLICKED |
單擊靜態控件 |
STN_DBLCLK |
雙擊靜態控件 |
STN_ENABLE |
激活靜態控件 |
STN_DISABLE |
禁用靜態控件 |
ModifyStyle(0,SS_BITMAP); |
控件是位圖風格 |
SetBitmap(); |
設置位圖 |
HBITMAP bBmp=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(位圖的ID)); |
位圖資源轉換成HBITMAP |
GetObject(m_bmp.GetBitmap(),sizeof(BITMAP),&bmp); |
位圖資源轉換成BITMAP |
CListBox能夠展現像數組同樣的數據,容許單選和多選、自帶滾動條;
BOOL Create(
DWORD dwStyle,
const Rect& rect,
CWnd* pParentWnd,
UINT nID);
列表框嚮應用可能發送的消息 |
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 |
設置列表框中第一項的索引值 |
獲取當前目錄中的全部條目
//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消息 |
能夠是多行文本的矩形窗口,好比windows中的記事本;UpdateData()針對含有編輯框部分的代碼更新
資源視圖中根據屬性設置後,能夠在.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 |
多行編輯框能夠回車換行 |
低字節是控件的標識,高字節是通知碼
編輯框嚮應用程序發送通知碼 |
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 |
設置選中的字體 |
通用方法 |
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 |
CComboBox是一種便可以輸入又能夠進行選擇的控件,看起來像是編輯框和列表框的組合;資源視圖上,一組單選按鈕的ID值必須連續、第一個按鈕選上Group,並且每一組只有第一個按鈕可以建立變量
CBS_DROPDOWN |
由列表框和編輯框組成,列表框平時不可見 |
CBS_DROPDOWNLIST |
由列表框和靜態文本組成,列表框平時不可見 |
CBS_AUTOHSCROLL |
編輯框自動水平滾動 |
CBS_SORT |
列表框中各項按字母序排列 |
CBS_SIMPLE |
列表框可見 |
組合框嚮應用程序發送消息 |
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);
分隔線
Color屬性選擇Etched
圖片
Type選擇Icon或者Bitmap,設置Image屬性爲對應資源的ID時能夠顯示圖片
須要和其餘控件組合使用,好比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);
}
進度條
初始化
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"進行完畢");
}
}
滑塊比較方便在一個範圍內選擇大體的數值
初始化
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);
}
用戶對時間的輸入形式是多樣的,這就致使了時間很差解析的問題,這時候選擇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);
相似文件管理器的文件列表;回調項可能會節省程序的存儲空間
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);
}
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);
}
擴展出來的組合框,實現列表項圖標和標籤的組合顯示
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);
}
資源和代碼是獨立的,資源能夠是某個.dll、.exe等二進制文件;另存爲.res資源文件,在須要的時候能夠導入
出如今界面的最上方,不能夠拖動和刪除;在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));
}
程序主菜單中已經有其中的菜單項,爲了方便右鍵時出現的一組菜單
①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);
}
程序主菜單中也有這些菜單項,一般出如今程序主菜單下方、由一組相似按鈕的圖標組成,能夠拖動和關閉
①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;
}
進入資源視圖的文件,雙擊最後一行、設置與該加速鍵關聯的ID、在屬性面板中設置加速鍵,編譯執行
使用字符串資源並在須要的時候動態切換,能夠設計出跨語言的程序;進入資源視圖、打開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();
DDX:對話框數據交換,MFC將控件和數據創建一種綁定關係;重寫OnInitDialog()函數能夠初始化對話框中組件的狀態;改變對話框的位置csDlg->SetWindowPos(NULL,20,10,0,0,SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);;AfxGetMainWnd()->PostMessage(WM_QUIT,0,0);或者使用Dialog::OnOk();均可以退出一個對話窗口
Create() |
建立一個對話框,一般用於非模態對話框的建立 |
Domodal() |
顯示模態對話框 |
EndDialog() |
關閉模態對話框 |
GetDlgItem() |
獲取對話框上的某個控件指針 |
OnInitDialog() |
初始化對話框 |
OnOk() |
OK按鈕被點擊,能夠重載這個函數 |
OnCancel() |
Cancel按鈕被點擊,能夠重載這個函數 |
//一個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);
}
能夠在資源視圖Icon中能夠編輯圖標,一般使用的是32*3二、16*16的24位圖標;也能夠添加本身想要的圖標,若是把ID值替換成IDR_MAINFRAME,就能夠改變應用程序的圖標
(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);
SDI只能打開一個類型的一個文檔,MDI每次能打開多個類型的多個文檔、MDI至少擁有兩個主菜單
和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幫你獲取文件名 |
本質是數組,數組中存儲了消息傳遞時的關鍵信息;某種類型的消息會按照某種順序從一個對象傳遞到另外一個對象,直到該消息被處理,消息被處理後就不會再傳遞到後面的對象;這個優先級順序通常是:文檔對象>文檔模板>框架窗口>應用程序對象;在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); |
表明主程序,負責維護進程的啓動終止、消息循環、命令行參數、資源管理
經常使用的成員;調用的方法是使用全局函數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 |
出現「沙漏」光標 |
提供了文檔所須要的最基本功能:打開保存文檔、維護文檔相關的視圖列表、維護文檔修改標誌、經過電子郵件發送文檔,是數據的抽象
可能用到的方法
通常方法 |
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);
…
}
繼承自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數據庫的視圖 |
文檔模板類將文檔、視圖和框架窗口對象聯繫在一塊兒,負責一種文檔類型的建立和管理;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 |
該文檔類型對應註冊表中用戶可見的名稱 |
框架窗口,維護工具條、菜單、狀態欄、視圖的顯示和刷新等;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() |
獲取指向狀態欄的指針 |
當前對象 |
要訪問的對象 |
訪問方法 |
文檔 |
視圖 |
GetFirstViewPosition()、GetNextView() |
文檔 |
模板 |
GetDocTemplate() |
視圖 |
文檔 |
GetDocment() |
視圖 |
框架 |
GetParentFrame() |
框架 |
視圖 |
GetActiveView() |
框架 |
文檔 |
GetActiveDocument() |
MDI主框架 |
MDI子框架 |
MDIGetActive() |
MDI子框架 |
MDI主框架 |
GetParentFrame() |
任何位置 |
應用程序 |
AfxGetApp() |
任何位置 |
主框架 |
AfxGetMainWnd() |
View類中OnDraw()的填充;
文檔序列化
在類視圖中添加類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();
}
DWORD ThreadID;
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc,NULL,0,&ThreadID);
void ThreadFunc(){…}
用於顯示和操做數據;可能會出現中文亂碼的狀況,解決的辦法是文件->高級保存選項中選擇utf8,資源視圖中的全部視圖的語言都選成簡體中文
①可能用到的函數
CRecordView() |
構造函數 |
OnInitialUpdate() |
將CRecordView子類中的變量和數據庫的數據關聯起來 |
IsOnFirstRecord() |
當前記錄是不是數據庫中的第一個記錄 |
IsOnLastRecord() |
當前記錄是不是數據庫中的最後一個記錄 |
OnGetRecordset() |
返回一個CRecordset類型的指針 |
OnMove() |
在數據庫中移動遊標並將記錄顯示在視圖控件中,有相似BOOL的返回值 |
②OnMove參數的取值
ID_RECORD_FIRST |
移動到數據庫的第一個記錄 |
ID_RECORD_LAST |
移動到數據庫的最後一個記錄 |
ID_RECORD_NEXT |
向後移動一個記錄 |
ID_RECORD_PREV |
向前移動一個記錄 |
表示的是數據集,有兩種典型的表:動態保持數據庫中的數據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 |
在指定位置設置標籤 |
用於鏈接一個數據源
①可能用到的成員函數
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 |
包含用戶和密碼的描述字符串 |
和DDX相似,RFX用於視圖和數據源自動交換數據,有時候須要自定義的代碼:帶參數的查詢、數據庫中表之間的鏈接
拋出一個異常void AfxThrowDBException(RETCODE nRetCode,CDatabase* pdb,HSTMT hstmt);
進入Access建立一個空數據庫、創建字段、填充數據,這個數據庫默認用戶名是admin密碼爲空,若是想要設置用戶名和密碼能夠以獨佔讀取.mdb文件的方式、在工具->安全中設置新的用戶名和密碼;
控制面板->管理工具-> ODBC 數據源(32 位)->系統DSN->添加.mdb->命名數據源註冊的名稱、選擇數據庫文件
若是隻是和數據庫的記錄打交道,在項目嚮導中選擇「不支持文件的數據庫視圖」;
在資源視圖中設計表單的樣式、定義各控件的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);
}
能夠在工具欄或菜單項中設計按鈕、定義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);
}
清空當前表單,就能夠在表單中新添一些數據:
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);
}
默認狀況下,用戶移動一個記錄就會對數據庫進行修改,因此須要重載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());
}
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);
}
}
默認狀況下,用戶移動一個記錄就會對數據庫進行修改,因此須要重載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());
}
在資源視圖中創建對話框和相關的類、編輯框的變量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);
}
}
①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 |
預先肯定的聲音標識 |
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;
}
資源視圖->右鍵->插入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());
}
OleLoadPicture支持加載.png、.jpg、.gif等格式的圖片
// 用來裝載圖片的變量
LPPICTURE m_pPicture;
// 是否壓縮顯示
BOOL m_bScale;
CMy4View::CMy4View()
: m_bScale(FALSE)
{
// TODO: 在此處添加構造代碼
m_pPicture=NULL;
m_bScale=FALSE;
}
CMy4View::~CMy4View()
{
if(m_pPicture)
{
m_pPicture->Release();
}
}
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();
}
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);
}
對基於對話框的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);
}
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+鼠標向下拖動 |
編輯列 |