日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

VC++笔记

發(fā)布時間:2023/12/4 综合教程 42 生活家
生活随笔 收集整理的這篇文章主要介紹了 VC++笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

匈牙利表示法

?

關于構造函數(shù)

?

顯式調(diào)用基類的有參數(shù)的構造函數(shù):

?

類繼承當中的三種屬性:

?

引用和指針

?

重復命名錯誤及解決

?

。。。

?

?

Windows程序運行原理PPT

?

?

?

窗口的創(chuàng)建步驟

  1. 設計一個窗口類;

typedef struct _WNDCLASS {

?? UINT??? ? style;

?? WNDPROC lpfnWndProc;

?? int???? ??? cbClsExtra;

?? int???? ??? cbWndExtra;

?? HANDLE ?? hInstance;

?? HICON?? hIcon;

?? HCURSOR ???????? hCursor;

?? HBRUSH? ???????? hbrBackground;

?? LPCTSTR ?? lpszMenuName;

?? LPCTSTR ?? lpszClassName;?

} WNDCLASS;

?

  1. 注冊窗口類;
  2. 創(chuàng)建窗口;
  3. 顯示及更新窗口。

虛函數(shù)

它是C++語言多態(tài)性的體現(xiàn)之一;

多態(tài)性是指不同類型的對象接收相同的消息時產(chǎn)生不同的行為;

多態(tài)性分為編譯時的多態(tài)性和運行時的多態(tài)性;

編譯時的多態(tài)性是通過函數(shù)的重載或運算符的重載來實現(xiàn)的;

運行時的多態(tài)性是通過虛函數(shù)來實現(xiàn)的;

這兩種多態(tài)性的方式對應的是兩種編譯方式,靜態(tài)聯(lián)編(早期聯(lián)編)和動態(tài)聯(lián)編(晚期聯(lián)編)

虛函數(shù)特點如下:

1、? 虛函數(shù)在重新定義時參數(shù)的類型和個數(shù)必須和基類的虛函數(shù)完全匹配,這一特點與函數(shù)重載完全不同;

2、? 虛函數(shù)所具有的功能只有通過指針 才能得到,虛函數(shù)在用對象名和運算符以正常方式調(diào)用時,不能達到其功能;

3、? 虛函數(shù)必須是類的一個成員函數(shù),不能是友元函數(shù),也不能是靜態(tài)的成員函數(shù);

4、? 可以把析構函數(shù)定義為虛函數(shù),但是不能將構造函數(shù)定義為虛函數(shù);通常釋放基類中和其派生類中的動態(tài)申請的存儲空間時,也要把析構函數(shù)定義為虛函數(shù),以便實現(xiàn)撤銷對象時的多態(tài)性。

純虛函數(shù)是一種特殊的虛函數(shù)。

?

文件操作

1、創(chuàng)建文件實例:fstream file;

2、聲明文件操作類型:file.open(“file.txt”,ios::out|ios::app)

3、進行相應的文件讀寫操作:file.write(&ch,Num)

單文檔應用程序SDI

程序框架:

1)???????? 應 用 類:MyClass.h和MyClass.cpp,繼承類CWinApp, ,消息映射機制

2)??????? 文 檔 類:MyClassDoc.h和MyClass.cpp ,繼承類CDocument, ,消息映射機制

3)??????? 視 圖 類:MyClassView.h和MyCassView.cpp, 繼承類Cview,消息處理、文檔格式化 和文檔數(shù)據(jù)可視化處理,消息映射機制

4)??????? 主框架類:MainFrm.h和MainFrm.cpp ,繼承類CframeWnd,創(chuàng)建和控制選單、工具欄?????????????????????? 和狀態(tài)欄等界面元素,消息映射機制

5) “關于”對話框類:MyClass.cpp,繼承類Cdialog,數(shù)據(jù)映射機制

MFC三種消息的區(qū)別?

消息驅動機制的形象解釋?

接受-發(fā)送-處理

ClassWizard產(chǎn)生消息映射所完成的三個內(nèi)容安排 :

  1. 在頭文件***View.h中聲明消息處理函數(shù)

afx_msg void OnButtonDown(UNIT nFlags,Cpoint point);

DECLARE_MESSAGE_MAP();

  1. 在源文件***View.cpp的前面消息映射入口處添加相應的宏

BEGIN_MESSAGE_MAP(C***View,CView)

ON_WM_LBUTTONDOWN()

END_MESSAGE_MAP()

  1. 在***View.cpp文件中寫入空的消息處理函數(shù)的模板,以便用戶填入代碼

添加類C***

1、? 增加兩個文件:頭文件C***.h和源文件C***.cpp,這兩個文件只是單獨的兩個文件,與主程序可能沒有關聯(lián),關聯(lián)時可以在主程序中包含該類的頭文件即可。

2、 由于對話框的代碼是以類為木塊來設計的,那么在當文檔程序中調(diào)用對話框,只需要在單文檔程序Myclass.cpp源文件上面加上包含類C***的頭文件,然后在InitInstance()函數(shù)體中的return前面添加兩行代碼:C*** dlg;dlg.DoModal();即可。

3、具體創(chuàng)建類的方法略

刪除類C***步驟

1、在ClassWizard中刪除類

2、用delete鍵“軟件”刪除類C***對應的.h和.cpp兩個文件,取消關聯(lián)

3、關閉項目,在項目文件夾“硬件”刪除類C***對應的.h和.cpp兩個文件以及.clw文件

改變按鈕標題方法:

1、利用按鈕本身的屬性對話框修改標題:變量m_MyBtn->SetWindowText(“歡迎”);

2、調(diào)用函數(shù):GetDlgItem(IDC_BUTTON1)->SetWindowText(“歡迎”);

?

ClassWizard創(chuàng)建變量所完成的三個內(nèi)容安排:

1、在應用類頭文件(.h)中添加相關變量的聲明

2、在應用類源文件(.cpp)的應用類構造函數(shù)中添加變量的初始化代碼

3、在應用類源文件(.cpp)的DoDataExchange函數(shù)體內(nèi)添加DDX/DDV代碼.進行數(shù)據(jù)交換

常用控件

1、單選按鈕IDC_RADIO:

a)????? 設置默認選定按鈕:CheckRadioButton(IDC_RADIO1,IDC_RADIO4,IDC_RADIO1);

b)????? 獲得選定的單選按鈕的ID: int nID = GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO4);

c)?????? 讓控件不可用(即變成灰色):GetDlgItem(ID)->EnableWindow(BOOL);

2、? 復選框IDC_CHECK:

a)???????? 如果選定了一個框,則其相應的變量為1;

b)??????? ?

3、? 編輯框IDC_EDIT:

a)???????? 其變量的類型有很多:int、char、double…甚至可以是CString

b)??????? 變量類型是前三種的話,那么變量是什么,則編輯框內(nèi)顯示什么;

c)???????? 如果變量是Cstring類型:則顯示方法為:m_Edit.Format(“%6.2f”,m);或則m_Ave.LoadString(IDS_STRING);

d)??????? 消息:為編輯框添加EN_CHANGE消息映射

4、? 列表框IDC_LIST:

a)???????? 首先定義變量m_List,其類型是Cstring;

b)??????? 列表框顯示的是字符串,如果這個字符串代表很多數(shù)據(jù),則要將它和其他數(shù)據(jù)關聯(lián);

c)???????? 列表框的項往往用索引來確定,找到索引號,那么就可以找出項的內(nèi)容,所以要想對項進行操作,第一重要的就是找出它的索引號nIndex,然后就可以調(diào)用m_List(實際上是CString)的成員函數(shù)來獲得根據(jù)nIndex來查詢項數(shù)據(jù)、增加項、刪除項、查找項等操作;

d)??????? 找出索引號方法:int nIndex = m_List.GetCurSel(),它是整型數(shù)據(jù),列表框的第一項索引是從0開始的;

e)???????? 增加項:int nIndex = m_List.AddString(m_strName)

f)????????? 查找項,主要是為了防止重復增加項:m_List.FindString(-1,m_strName)(從頭查)

g)??????? 選擇項:m_List.SetCurSel(nIdnex);

h)??????? 根據(jù)索引號進行操作:

i,刪 除 項: m_List.DeleteString(nIdnex)

Ii,獲取數(shù)據(jù): m_List.GetText(nIndex, m_strName);

SCORE *data=(SCORE *)m_List.GetItemDataPtr(nIndex);

m_List.GetItemData (nIndex,DWORD data);

Iii,關聯(lián)數(shù)據(jù):數(shù)據(jù)比較多時候,可以預先建立一個數(shù)組或則結構體

Int m_List.SetItemDataPtr(nIndex,new SCORE(data));(結構體SCORE)

DOUBLE m_List.SetItemDataPtr(nIndex)

?

5、? 組合框IDC_COMBO

a)???????? 組合框是集編輯框和列表框于一體,所以既可以編輯輸入,也可以列表顯示;

b)??????? 有列表框的功能,也是根據(jù)索引號來增加項,刪除項,查找項,還可以用此索引號來關聯(lián)數(shù)據(jù)或則數(shù)據(jù)指針;

c)???????? 組合框的通知消息中最為常用的是:CBN_SELCHANGE (當組合框中的當前選擇項將要改變時發(fā)送此消息);注意這個消息是為控件本身添加的;

6、? 滾動條IDC_SCROLLBAR

a)???????? 基本操作:

設置滾動條范圍m_Scroll.SetScrollRange(0,255)

獲取滾動條范圍void GetScrollRange(lpMinpos, lpMaxpos)

設置滾動條的當前位置m_Scroll.SetScrollPos(m_RValue)

獲取滾動條的當前位置int GetScrollPos()

b)??????? 消息:

為對話框添加消息WM_HSCROLL或則WM_VSCROLL,因為滑動條(下面將提到)和滾動條都可以產(chǎn)生WM_HSCROLL或則WM_VSCROLL消息,因此當它們處在同一方向時,就需要添加代碼判斷是誰產(chǎn)生的消息;

點擊滾動條的相應位置就產(chǎn)生相應的消息,見下圖

?

?

SB_LINELEFT???????????????????????? SB_LINERIGHT

???????? SB_PAGELEFT???? SB_PAGERIGHT

?

?

?

?

?

7、? 滑動條IDC_SLIDER

  1. 基本操作:

設置滾動條范圍m_Slide.SetRange(0,255)

獲取滾動條范圍void GetRange(lpMinpos, lpMaxpos)

設置滾動條的當前位置m_ Slide.SetPos(int m_RValue)

獲取滾動條的當前位置int GetPos()

設置滑動條控件中的一個刻度線的位置:BOOL SetTic(int nTri)

設置刻度線的疏密程度:void SetTicFreq(int nFre)

刪除當前刻度線:void ClearTics(BOOL)

設置滑動條的開始和結束位置:void SetSelection(int nMin,int nMax)

  1. 消息:? 消息代碼都來自于WM_HSCROLL或WM_VSCROLL消息

8、? 旋轉按鈕IDC_SPIN

a)???????? 基本操作:

  1. 設置基數(shù)int SetBase( int nBase );
  2. 設置旋轉按鈕控件的當前位置和范圍int SetPos( int nPos );

void SetRange( int nLower, int nUpper );

  1. 設置和獲取旋轉按鈕控件的加速度BOOL SetAccel( int nAccel, UDACCEL* pAccel );

b)??????? 通知消息:

旋轉按鈕控件的通知消息只有一個:UDN_DELTAPOS,它是當控件的當前數(shù)值將要改變時向其父窗口發(fā)送的

9、? 標簽控件IDC_TAB

a)???????? 標簽控件的基本操作 :…

  1. ???????????????????????????????????????????????????? i.????????????? m_Tab.SetMinTabWidth(80);????????? // 設置標簽項的最小寬度
  2. ??????????????????????????????????????????????????? ii.????????????? m_Tab.SetPadding(CSize(12,3)); // 設置標簽項和圖標周圍的間隔
  3. ????????????????????????????????????????????????? iii.????????????? m_Tab.SetCurSel(0);//設置默認選定項
  4. ???????????????????????????????????????????????? iv.????????????? m_pTabDlg->Create(IDD_DIALOG3,&m_Tab);//指定IDD_DIALOG3的父窗口是m_Tab指向的窗口

b)??????? 標簽控件的通知消息:為控件映射TCN_SELCHANGE消息

c)???????? 為一個新建的Dialog創(chuàng)建一個類的時候,可以用一個指針來指向這個窗口

CTab1Dlg *m_pTab1Dlg;

d)??????? 注意創(chuàng)建的子窗口是無模式對話框m_pTab1Dlg->Create(IDD_DIALOG1,&m_Tab);

10、 消息對話框

a)???????? 最簡單的一類對話框,只是用來顯示信息的。MFC類庫中提供相應的函數(shù)實現(xiàn)這樣的功能,只要在程序任何地方調(diào)用它們。

b)??????? 函數(shù)原型:

int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );

int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );

11、 ?

菜單

  1. 菜單操作有兩種方法:一種是ResourceView標簽操作,但是只能進行簡單的增加和刪除,還有一種是通過編程進行菜單操作
  2. 菜單的編程控制

a)???????? 基本操作:Cmenu類

l????????? 創(chuàng)建菜單:BOOL CreateMenu( );??????????? // 產(chǎn)生一個空菜單?

BOOL CreatePopupMenu( );? // 產(chǎn)生一個空的彈出式子菜單

l????????? 裝入菜單:BOOL LoadMenu( LPCTSTR lpszResourceName );

BOOL LoadMenu( UINT nIDResource );

l????????? 添加菜單項:末尾處增加與指定位置添加

BOOL ?AppendMenu( UINT nFlags, UINT nIDNewItem = 0,LPCTSTR lpszNewItem = NULL );

BOOL ?AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );

BOOL InsertMenu( UINT nPosition, UINT nFlags,UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );

BOOL? InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );

l????????? 刪除菜單項:BOOL DeleteMenu( UINT nPosition, UINT nFlags );

一定要調(diào)用CWnd::DrawMenuBar使菜單更新

l????????? 獲取菜單項:下面的三個CMenu成員函數(shù)分別獲得菜單的項數(shù)、菜單項的ID號以及彈出式子菜單的句柄。

UINT GetMenuItemCount( ) const;該函數(shù)用來獲得菜單的菜單項數(shù),調(diào)用失敗后返回-1。

UINT GetMenuItemID( int nPos ) const;該函數(shù)用來獲得由nPos指定菜單項位置(以0為基數(shù))的菜單項的標識號,若nPos是SEPARATOR,則返回-1。

CMenu* GetSubMenu( int nPos ) const; 該函數(shù)獲得指定菜單的彈出式菜單的菜單句柄

  1. 舉例說明
  • CMenu* pSysMenu = GetMenu();?????????????? // 獲得主菜單句柄
  • CMenu* pSubMenu = pSysMenu->GetSubMenu(1);// 獲得第二個子菜單的句柄
  • CString StrMenuItem("新的菜單項");
  • pSubMenu->AppendMenu(MF_SEPARATOR);? // 增加一水平分隔線
  • pSubMenu->AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);

快捷菜單

用資源編輯器和MFC庫的CMenu::TrackPopupMenu函數(shù)創(chuàng)建這樣的菜單,CMenu::TrackPopupMenu函數(shù)原型如下:

BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );

???????? x和y表示菜單的水平坐標和菜單的頂端的垂直坐標。pWnd表示彈出菜單的窗口。lpRect是一個RECT結構或CRect對象指針,表示一個矩形區(qū)域,單擊這個區(qū)域時,彈出菜單不消失。當lpRect為NULL時,若擊在菜單外面,菜單立刻消失。

舉例:

在CMainFrame類加入WM_CONTEXTMENU消息處理函數(shù),代碼。

void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)

{???????

CMenu menu;

menu.LoadMenu(IDR_MYFLOATMENU);

menu.GetSubMenu(0)

???????? ->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);

}

工具欄

工具欄和菜單相結合的方法:將工具欄按鈕的ID號設置的和相應的菜單欄的ID號碼一樣就行了;

狀態(tài)欄

???? AppWizard創(chuàng)建的SDI或MDI應用程序框架中,有一個靜態(tài)的indicator數(shù)組,它是在MainFrm.cpp文件中定義的,被MFC用作狀態(tài)欄的定義。

?

1.在狀態(tài)欄上顯示文本

???????? 有三種辦法可以在狀態(tài)欄窗格顯示文本信息:

???????? (1)調(diào)用CWnd::SetWindowText更新信息行窗格(或窗格0)中的文本。由于狀態(tài)欄也是一種窗口,故在使用時可直接調(diào)用。若狀態(tài)欄變量為m_wndStatusBar,則m_wndStatusBar. SetWindowText(“消息”)語句將在信息行窗格(或窗格0)內(nèi)顯示“消息”字樣。

???????? (2)手動處理狀態(tài)欄的ON_UPDATE_COMMAND_UI更新消息,并在處理函數(shù)中調(diào)用CCmdUI::SetText函數(shù)。

???????? (3)調(diào)用CStatusBar::SetPaneText函數(shù)更新任何窗格(包括信息行窗格)中的文本。此函數(shù)原型描述如下:

???????? BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE );

2.交互對象的更新:

像菜單欄、工具欄這樣的就是交互對象,可能是因為它們有相同的ID,功能一樣,當一個起作用的時候,另一個的狀態(tài)要做相應的改變。

為能使交互對象動態(tài)更新,MFC通過ClassWizard直接映射交互對象的更新命令消息來實現(xiàn)。自動將用戶交互對象的ID號與ON_UPDATE_COMMAND_UI宏相連接并產(chǎn)生處理更新消息的相應函數(shù),此消息處理函數(shù)只有一個參數(shù),它是指向CCmdUI對象的指針。CCmdUI 類僅用于ON_UPDATE_COMMAND_UI處理函數(shù),它的成員函數(shù)將對菜單項、工具按鈕等用戶交互對象起作用。

為什么新建的選單不能添加子選單?

SetWindowLong(hWnd,GWL_STYLE,pNewStyle)?

實例:“在列表視圖中以四種方式顯示當前文件夾中的所有文件“

  1. 要? 求:

1)???????? 用四種不同方式顯示文件:“大圖標“小圖標”“列表視圖”“報表視圖”;

2)??????? 用快捷鍵ctrl+shift+X來切換顯示方式;

3)??????? 雙擊圖標時候彈出消息對話框,對話框顯示文件類型名;

  1. 關鍵點:

1)???????? 如何獲取當前文件夾中的所有文件;

2)??????? 如何獲取各個文件的圖標以便添加到與列表控件相關聯(lián)的圖像列表中去;

3)??????? 如何設置報表顯示方式中的標題頭;

  1. 解? 決:

1)???????? 通過MFC類CfileFind來查詢文件;

2)??????? 使用API函數(shù)SHGetFileInfo來獲取文件信息,包括文件圖標;

3)??????? 使用LVCOLUMN結構體來設置標題頭;

  1. 步? 驟:????????

1)???????? 建立列表控件風格切換函數(shù)(需要調(diào)用函數(shù)SetWindowLong(hWnd,GWL_STYLE,pNewStyle)),方便之后的函數(shù)調(diào)用;

2)??????? 將項目工作區(qū)窗口切換到ResourceView頁面,打開Accelerator節(jié)點下的IDR_MAINFRAME,為其添加一個鍵盤加速鍵Ctrl+Shift+X,其ID號為ID_VIEW_CHANGE。用ClassWizard為CEx_ListView類添加ID_VIEW_CHANGE的COMMAND消息映射函數(shù),并添加相應代碼(這里的代碼里面就要調(diào)用相應的風格切換函數(shù));

3)??????? 用ClassWizard為CEx_ListView類添加NM_DBLCLK消息映射函數(shù),并添加相應代碼(可根據(jù)用戶要求來寫,本例需要彈出消息對話框,那么需要調(diào)用Messagebox());

4)??????? 添加查找文件、關聯(lián)圖標等的代碼(在CEx_ListView::OnInitialUpdate中添加代碼)

a)???????? 創(chuàng)建圖像列表,用來保存文件圖標

b)??????? 創(chuàng)建字符串數(shù)組類,用來保存文件類型,它無需跟列表控件關聯(lián),因為它主要是用來添加不重復的圖標的

c)???????? 創(chuàng)建(獲取)列表控件“句柄”,用來顯示等操作

d)??????? 關聯(lián)圖像列表和列表控件,列表控件中顯示的圖標都是從圖標列表中調(diào)取的

e)???????? 查找當前目錄下的文件,根據(jù)目錄依次查找文件并獲取文件的信息

f)????????? 獲取文件的信息(圖標,文件完整名稱(含擴展名),文件大小,文件類型,文件最后修改時間)

g)??????? 往字符串數(shù)組類中添加文件類型信息

h)??????? (如果文件類型不重復就)往圖像列表中添加文件圖標信息

i)????????? 設置報表模式顯示的表頭格式以及列寬

j)????????? 設置文件大小的顯示格式

k)??????? 設置文件最后修改時間的顯示格式

l)????????? 設置默認顯示方式為報表顯示

5)??????? 根據(jù)報表效果的顯示方式來安排程序,報表顯示方式如下,可見程序有如下幾部分:

?

總結步驟:

1)????????? 加入List Control控件

2)???????? 為該控件聲明一個對象,CListCtrl m_list;使用類向導來做

3)???????? 設置CListCtrl的屬性

m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

?????????????????? m_list.SetBkColor(RGB(247,247,255));

?????????????????? m_list.SetTextColor(RGB(0,0,255));

m_list.SetTextBkColor(RGB(247,247,255));

4)???????? 設置列名

m_list.InsertColumn(0, "姓名", LVCFMT_LEFT, 80);

?????????????????? m_list.InsertColumn(1, "現(xiàn)居地", LVCFMT_LEFT, 100);

m_list.InsertColumn(2, "聯(lián)系電話", LVCFMT_LEFT, 110);

尤其要記得要將控件的類型修改為"Report"類型.

5)???????? 設置各列的內(nèi)容

m_list.InsertItem(0,"李");

????????????? m_list.SetItemText(0,1,"北京");

????????????? m_list.SetItemText(0,2,"13111111111");

???????

????????????? m_list.InsertItem(1,"張");

????????????? m_list.SetItemText(1,1,"上海");

????????????? m_list.SetItemText(1,2,"13222222222");

6)???????? 讀取數(shù)據(jù)

?????????????? m_list.GetItemText(行數(shù), 列數(shù));

7)???????? 每行前有復選框的列表

?????????????????? 初始化時使用LVS_EX_CHECKBOXES屬性

?????????????????? DWORD dwStyle;

??????????????????? dwStyle = m_list.GetStyle();

??????????????????? dwStyle |= LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES ;

?????????????????? m_list.SetExtendedStyle(dwStyle);

???????? ??????????設置選中:

?????????????????? m_list.SetItemState (行數(shù),0x2000, LVIS_STATEIMAGEMASK);//設為選中狀態(tài)

??????????????????? 判斷是否選中:

?????????????????? m_list.GetItemState(行數(shù),LVIS_STATEIMAGEMASK)==0x2000//選中

切分窗口

A CSplitterWnd is usually embedded in a parent CFrameWnd or CMDIChildWnd object by taking the following steps:

  1. Embed a CSplitterWnd member variable in the parent frame.
  2. Override the parent frame’s OnCreateClient member function.
  3. Call the CreateStatic member function from within the overridden CFrameWnd::OnCreateClient.

怎樣設置透明效果

1)???????? 用SetLayedWindowAttributes實現(xiàn)整個窗口的半透明效果

BOOL?? CDlgTop::OnInitDialog()??

{

CDialog::OnInitDialog();

//以下代碼是我從別人那里抄來的,主要是使CDlgTop對話框透明

//出處為www.vckbase.com,不用細看其內(nèi)容

// 添加透明擴展樣式

SetWindowLong(this-> GetSafeHwnd(),GWL_EXSTYLE,

GetWindowLong(this-> GetSafeHwnd(),GWL_EXSTYLE)^0x80000);

// 添加庫

HINSTANCE?? hInst?? =?? LoadLibrary( "User32.DLL ");??

// 讀取函數(shù)指針

if(hInst)??

{????????????????????????

typedef?? BOOL?? (WINAPI?? *MYFUNC)(HWND,COLORREF,BYTE,DWORD);????????????????????

MYFUNC?? fun?? =?? NULL;

//取得SetLayeredWindowAttributes函數(shù)指針??????????

fun=(MYFUNC)GetProcAddress(hInst,?? "SetLayeredWindowAttributes ");

if(fun)fun(this-> GetSafeHwnd(),0,128,2);??????????

FreeLibrary(hInst);??

}

return?? TRUE;

}

// 函數(shù)原型如下:

BOOL SetLayeredWindowAttributes(

 HWND hwnd, // 窗口

 COLORREF crKey, // 顏色鍵

 BYTE bAlpha, // alpha值

 DWORD dwFlags // 透明方法

);

2)??????? 怎樣實現(xiàn)窗口的半透明漸變效果

?

3)??????? Static控件背景透明大法

常用添加dialog的OnCtlColor方法。。。修改代碼如下

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if(nCtlColor==CTLCOLOR_STATIC)

{

?? pDC->SetBkMode(TRANSPARENT);

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

?? return?? (HBRUSH)::GetStockObject(NULL_BRUSH);??

}

怎樣制作電子時鐘

CWnd::OnCtlColor

This method is called by the framework when a child control is about to be drawn. Most controls send this message to their parent, usually a dialog box, to prepare the pDC for drawing the control using the correct colors.

用雙擊事件關閉窗口WM_LBUTTONDCLK

vc實現(xiàn)平滑地關閉窗口?

使窗口居中并且占整個屏幕的90%

BOOL CMainFrame::PreCreateWindow ( CREATESTRUCT& cs)

{

// center window at 90% of full screen

int xSize = ::GetSystemMetrics (SM_CXSCREEN);

int ySize = ::GetSystemMetrics (SM_CYSCREEN);

cs.cx = xSize*9/10;

cs.cy = ySize*9/10;

cs.x = (xSize-cs.cx)/2;

cs.y = (ySize-cs.cy)/2;

return CMainFrame::PreCreateWindow(cs);}

?

?

文件操作詳解

  1. 文件的創(chuàng)建
  2. 文件的讀寫
    1. 普通方法:直接使用CFile進行

// 對文件進行讀操作

???????? char sRead[2];

???????? CFile mFile(_T("user.txt"),CFile::modeRead);

???????? if(mFile.GetLength()<2)

?????????????????? return;

???????? mFile.Read(sRead,2);

???????? mFile.Close();

// 對文件進行寫操作

???????? CFile mFileW(_T("user.txt"),CFile::modeWrite|CFile::modeCreate);

???????? mFileW.Write(sRead,2);

???????? mFileW.Flush();

???????? mFileW.Close();

  1. 簡單方法:使用CArchive

首先使用CFile聲明一個對象,然后用這個對象的指針做參數(shù)聲明一個CArchive對象,我們就可以方便地存儲各種復雜的數(shù)據(jù)類型了。

???????? //對文件進行寫操作

???????? CString strTemp;

???????? CFile mfile;

???????? mfile.Open("E:\\201101-201102\\C++項目文件\\ComDlg\\user.txt",

?????????????????? CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite);

???????? CArchive ar(&mfile,CArchive::store);

???????? ar<<strTemp;

???????? ar.Close();

???????? mfile.Close();

???????? // 對文件進行讀操作

???????? CFile mfilew;

???????? if (mfilew.Open("E:\\201101-201102\\C++項目文件\\ComDlg\\user.txt",CFile::modeRead)==0)

?????????????????? return;

???????? CArchive ar1(&mfilew,CArchive::load);

???????? ar1>>strTemp;

???????? ar1.Close();

???????? mfilew.Close();

  1. CArchive的<<和>>操作符用于簡單數(shù)據(jù)類型的讀寫,對于CObject派生類的存??????????????? 取要使用ReadClass()和WriteClass()還可以進行類的讀寫,如:

// 存儲CAboutDlg類

???????? ar.WriteClass(RUNTIME_CLASS(CAboutDlg));

//讀取CAboutDlg類

???????? CRuntimeClass* mRunclass = ar.ReadClass();

//使用CAboutDlg類

???????? CObject* pObject = mRunclass->CreateObject();

???????? ((CDialog* )pObject)->DoModal();

在文檔區(qū)域繪圖

  1. 畫筆

創(chuàng)建畫筆-選擇畫筆-繪制圖形-恢復畫筆

void CMyView::OnDraw( CDC* pDC )

{

?????????????????? CPen newPen( PS_SOLID, 2, RGB(0,0,0) ) );

???????? ???????? CPen*? oldPen = pDC->SelectObject(&newPen);

?????????????????? pDC->SelectObject( &newPen );

???????????????? pDC->MoveTo(...);

?????????????????? pDC->LineTo(...);

?????????????????? //pDC->SelectStockObject( BLACK_PEN );??????? // newPen被分離出來

???????? ???????? pDC->SelectObject(oldPen);????????????????????????????????? // 恢復原來畫筆

???????? ???????? newPen.Detach();????????? // 將畫筆對象與其構造的內(nèi)容分離,以便能再次構造畫筆

}

  1. 字體

void CMyView::OnDraw( CDC* pDC )

{

???????? CFont font;

???????? LOGFONT lf;

???????? memset(&lf, 0, sizeof(LOGFONT));?????? // zero out structure

???????? lf.lfHeight = 12;????????????????????? // request a 12-pixel-height font

???????? strcpy(lf.lfFaceName, "Arial");??????? // request a face name "Arial"

???????? VERIFY(font.CreateFontIndirect(&lf));? // create the font

???????? // Do something with the font just created...

???????? CClientDC dc(this);

???????? CFont* def_font = dc.SelectObject(&font);

???????? dc.TextOut(5, 5, "Hello", 5);

???????? dc.SelectObject(def_font);

???????? // Done with the font. Delete the font object.

???????? font.DeleteObject();

}

在文檔區(qū)顯示位圖資源

  1. 圖標

由于位圖不能直接顯示在實際設備中,因此對于GDI位圖的顯示則必須遵循下列步驟:

?????????????????? (1)? 調(diào)用CBitmap類的CreateBitmap、CreateCompatibleBitmap以及 ?????????????????????????????? ???????? CreateBitmapIndirect函數(shù)創(chuàng)建一個適當?shù)奈粓D對象。

?????????????????? (2)? ???????? 調(diào)用CDC::CreateCompatibleDC函數(shù)創(chuàng)建一個內(nèi)存設備環(huán)境,以便位圖在內(nèi)??????????? ?????????????????? 存中保存下來,并與指定設備(窗口設備)環(huán)境相兼容;

?????????????????? (3)? ???????? 調(diào)用CDC::SelectObject函數(shù)將位圖對象選入內(nèi)存設備環(huán)境中;

?????????????????? (4)? ???????? 調(diào)用CDC::BitBlt或CDC::StretchBlt函數(shù)將位圖復制到實際設備環(huán)境中。

?????????????????? (5)? ???????? 使用之后,恢復原來的內(nèi)存設備環(huán)境。

?

void CSDITextView::OnDraw(CDC* pDC)

{

???????? CSDITextDoc* pDoc = GetDocument();

???????? ASSERT_VALID(pDoc);

???????? CBitmap m_bmp;//CObject的派生類

???????? m_bmp.LoadBitmap(IDB_BITMAP1);?????????????????? // 調(diào)入位圖資源

???????? BITMAP bm;

???????? m_bmp.GetObject(sizeof(BITMAP),&bm);

???????? CDC dcMem;???????????????????????????? // 定義并創(chuàng)建一個內(nèi)存設備環(huán)境

???????? dcMem.CreateCompatibleDC(pDC);

???????? CBitmap *pOldbmp = dcMem.SelectObject(&m_bmp); // 將位圖選入內(nèi)存設備環(huán)境中

???????? pDC->StretchBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,1024,768,SRCCOPY);

???????? // 將位圖復制到實際的設備環(huán)境中

//用BitBlt函數(shù)顯示速度比StretchBlt快? StretchBlt可以對圖像擴大或則縮小

???????? dcMem.SelectObject(pOldbmp);????????????????????????? // 恢復原來的內(nèi)存設備環(huán)境

}

  1. 光標

BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)

{

???????? // TODO: Add your message handler code here and/or call default

???????? BOOL bRes = CFrameWnd::OnSetCursor(pWnd, nHitTest, message);

???????? if (nHitTest == HTCLIENT|HTCAPTION|HTBOTTOMLEFT )

???????? {

?????????????????? HCURSOR hCursor;

?????????????????? hCursor = AfxGetApp()->LoadCursor(IDC_CURSOR1);

?????????????????? SetCursor(hCursor);

?????????????????? bRes = TRUE;

???????? }

???????? return bRes;

}

在窗口畫線的幾種方法

  1. 利用SDK全局函數(shù)實現(xiàn)畫線功能

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

{

???????? m_pOrign = point;

???????? CView::OnLButtonDown(nFlags, point);

}

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

{

???????? HDC hDC;

???????? hDC = ::GetDC(m_hWnd);

???????? MoveToEx(hDC,m_pOrign.x,m_pOrign.y,NULL);

???????? LineTo(hDC,point.x,point.y);

???????? ::ReleaseDC(m_hWnd,hDC);

???????? CView::OnLButtonUp(nFlags, point);

}

  1. 利用MFC的CDC類實現(xiàn)畫線功能

將上面藍色部分替換成以下代碼,實現(xiàn)功能是一樣的

???????? CDC* pDC = GetDC();

???????? pDC->MoveTo(m_pOrign);

???????? pDC->LineTo(point);

???????? ReleaseDC(pDC);

  1. 利用MFC的CClientDC類來實現(xiàn)畫圖功能

??

將上面藍色部分替換成以下代碼,實現(xiàn)功能是一樣的

CClientDC dc(this);//this指向客戶區(qū)//換成GetParent()就可以在框架上面畫線了

???????? dc.MoveTo(m_pOrign);

???????? dc.LineTo(point);

  1. 利用MFC的CWindowDC()畫線

這樣可以繪圖到工具欄/菜單欄區(qū)域(非客戶區(qū))CWindowDC dc(GetParent());

  1. 在桌面窗口上面畫線CWindowDC dc(GetDesktopWindow());

線條的屬性

要利用屬性,按以下步驟:

創(chuàng)建GDI對象(如畫筆工具),用SelectObject()將畫筆工具選入設備描述表,繪制完畢恢復畫筆

顏色??

?

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

{

???????? m_pOrign = point;

???????? CView::OnLButtonDown(nFlags, point);

}

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

{

???????? CPen pen(PS_SOLID,4,RGB(255,0,0));//創(chuàng)建GDI對象

???????? CWindowDC dc(GetDesktopWindow());//

???????? CPen* pOldPen = dc.SelectObject(&pen);//選入設備表

???????? dc.MoveTo(m_pOrign);

???????? dc.LineTo(point);

dc.SelectObject(pOldPen);

???????? CView::OnLButtonUp(nFlags, point);

}

?

繪制透明的矩形,使它不擋住下面的圖形

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

{???????

CClientDC dc(this);

???????? CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

???????? CBrush* pOleBrush = dc.SelectObject(pBrush);

???????? dc.Rectangle(CRect(m_pOrign,point));

???????? dc.SelectObject(pOleBrush);

???????? CView::OnLButtonUp(nFlags, point);

}

繪制連續(xù)的線條

m_bDraw用來判斷左鍵是否按下,按下就開始劃線,松開就結束這段線。

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

{

???????? m_bDraw = TRUE;

???????? m_pOrign = point;

???????? CView::OnLButtonDown(nFlags, point);

}

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

{

???????? m_bDraw = FALSE;

???????? CView::OnLButtonUp(nFlags, point);

}

void CDrawLineView::OnMouseMove(UINT nFlags, CPoint point)

{

???????? CClientDC dc(this);

???????? if(m_bDraw == TRUE)

???????? {

?????????????????? dc.MoveTo(m_pOrign);

?????????????????? dc.LineTo(point);

???????? ???????? m_pOrign = point;//修改起點

???????? }

???????? CView::OnMouseMove(nFlags, point);

}

繪制扇形? :只需將以上代碼的藍色部分去掉即可

通過畫刷填充在鼠標拖曳的矩形

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

{

???????? m_pOrign = point;

???????? CView::OnLButtonDown(nFlags, point);

}

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

{

???????? CBrush bru(RGB(255,1,1));

???????? CClientDC dc(this);

???????? dc.FillRect(CRect(m_pOrign,point),&bru);

???????? CView::OnLButtonUp(nFlags, point);

}

創(chuàng)建文本插入符

?

int CTextView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

???????? if (CView::OnCreate(lpCreateStruct) == -1)

?????????????????? return -1;

???????? CreateSolidCaret(20,100);//創(chuàng)建20*100大小的插入符

???????? ShowCaret();//顯示出來

???????? return 0;

}

添加字符串資源

BOOL LoadString(nID)

字符輸入

?

?

? ? ? ?

void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) //消息WM_CHAR

{

???????? CClientDC dc(this);

???????? TEXTMETRIC tm;

???????? dc.GetTextMetrics(&tm);

???????? if (0x0d == nChar)//回車

???????? {

?????????????????? m_strLine.Empty();

?????????????????? m_ptOrign.y += tm.tmHeight;

???????? }

???????? else if (0x08 == nChar)//退格運用視覺小技巧:刪除的文字顏色和背景顏色一樣就行了

???????? {

?????????????????? COLORREF clr = dc.SetTextColor(dc.GetBkColor());//返回文本先前的顏色

?????????????????? dc.TextOut(m_ptOrign.x,m_ptOrign.y,m_strLine);

?????????????????? m_strLine = m_strLine.Left(m_strLine.GetLength()-1);

?????????????????? dc.SetTextColor(clr);

???????? }

???????? else

???????? {

?????????????????? m_strLine += nChar;

???????? }

?

???????? CSize sz = dc.GetTextExtent(m_strLine);//使插入符也跟著移動

???????? CPoint pt;

???????? pt.x = m_ptOrign.x+sz.cx;

???????? pt.y = m_ptOrign.y;

???????? SetCaretPos(pt);//當然插入符的初始位置及大小在OnDraw中已經(jīng)設置好

?

???????? dc.TextOut(m_ptOrign.x,m_ptOrign.y,m_strLine);

?

???????? CView::OnChar(nChar, nRepCnt, nFlags);

}

?

void CTextView::OnLButtonDown(UINT nFlags, CPoint point) //消息WM_LBUTTONDOWN

{

???????? SetCaretPos(point);

???????? m_strLine.Empty();//新位置清空字符串

???????? m_ptOrign = point;//保存點

?

???????? CView::OnLButtonDown(nFlags, point);

}

字體設置

?

?

?

卡拉OK字幕變色效果

void CTextView::OnTimer(UINT nIDEvent)

{

???????? // TODO: Add your message handler code here and/or call default

???????? m_nWidth += 5;

???????? CClientDC dc(this);

???????? TEXTMETRIC tm;

???????? dc.GetTextMetrics(&tm);//獲得當前字體的字體信息

?

???????? CString str;

???????? str.LoadString(IDS_STRINGVC);

???????? dc.SetTextColor(RGB(0,255,0));

???????? dc.TextOut(0,200,str);//運行時就輸出一行字幕

?

???????? CRect rect;

???????? rect.left = 0;

???????? rect.top = 200;

???????? rect.right = m_nWidth;

???????? rect.bottom = rect.top + tm.tmHeight;//設置矩形框的大小

????????

???????? dc.SetTextColor(RGB(255,0,0));

???????? dc.DrawText(str,rect,DT_LEFT);//開始從左往右用紅色覆蓋綠色字幕

?

???????? rect.top = 150;

???????? rect.bottom = rect.top + tm.tmHeight;

???????? dc.DrawText(str,rect,DT_RIGHT);//字幕從左往右滾動顯示

?

???????? CSize sz = dc.GetTextExtent(str);//獲得字符串的寬度和長度

???????? if (m_nWidth > sz.cx)//nWidth大于字符串長度時候

???????? {

?????????????????? m_nWidth = 0;

?????????????????? dc.SetTextColor(RGB(0,255,0));

?????????????????? dc.TextOut(0,200,str);

???????? }

????????

???????? CView::OnTimer(nIDEvent);

}

圖形標記菜單

在框架類的OnCreate函數(shù)中的return 0;句之前插入一下語句:

???????? m_bitmap.LoadBitmap(IDB_BITMAP1);

???????? GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(5,MF_BYPOSITION,&m_bitmap,&m_bitmap);

注意此IDB_BITMAP1的尺寸一定要合適,可以用一下方法獲得系菜單標記圖形的大小:

???????? CString str;

???????? str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),

?????????????????? GetSystemMetrics(SM_CYMENUCHECK));

???????? MessageBox(str);

禁用菜單項

?

移除和裝載菜單

???????? SetMenu(NULL);//禁用菜單項

?

???????? CMenu menu;//裝載菜單資源

???????? menu.LoadMenu(IDR_MAINFRAME);

???????? SetMenu(&menu);

? ?

MFC菜單命令更新機制

? ? ?

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

???????? ……

?

???????? // TODO: Delete these three lines if you don't want the toolbar to

???????? //? be dockable

???????? m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

???????? EnableDocking(CBRS_ALIGN_ANY);

???????? DockControlBar(&m_wndToolBar);

?

???????? GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);

??????? GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_OPEN,MF_BYCOMMAND|MF_CHECKED);

???????? GetMenu()->GetSubMenu(0)->SetDefaultItem(2,TRUE);//粗體顯示默認菜單項

???????? GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_SAVE_AS,FALSE);//粗體顯示默認菜單項

???????? GetMenu()->GetSubMenu(0)->EnableMenuItem(6,MF_BYPOSITION|MF_DISABLED|MF_GRAYED);//禁用菜單項

?

?

// ??? CString str;

// ??? str.Format("x=%d,y=%d",GetSystemMetrics(SM_CXMENUCHECK),

// ???????????? GetSystemMetrics(SM_CYMENUCHECK));

// ??? MessageBox(str);

?

???????? m_bitmap.LoadBitmap(IDB_BITMAP1);

???????? GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(5,MF_BYPOSITION,&m_bitmap,&m_bitmap);

?

// ??? SetMenu(NULL);//禁用菜單項

//

// ??? CMenu menu;//裝載菜單資源

// ??? menu.LoadMenu(IDR_MAINFRAME);

// ??? SetMenu(&menu);

//? menu.Detach();//將菜單句柄和菜單對象分離,因為menu是個局部對象,程序不能自動析構它

?

???????? return 0;

}

?void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI)

{

???????? // TODO: Add your command update UI handler code here

???????? if (ID_EDIT_CUT == pCmdUI->m_nID)//用標識符才能夠保證菜單項和工具欄一致

???????? {

?????????????????? pCmdUI->Enable(TRUE);

???????? }

}

?

快捷菜單

?

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

{

???????? // TODO: Add your message handler code here and/or call default

???????? CMenu menu;

???????? VERIFY(menu.LoadMenu(IDR_MENU1));

????????

???????? CMenu* pPopup = menu.GetSubMenu(0);

???????? ClientToScreen(&point);

???????? pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,

??????????????????????????? this);

???????? CView::OnRButtonDown(nFlags, point);

}

?

?

?

?

?

動態(tài)菜單操作

???? 添加

????? 插入

????? 刪除

舉例:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

????????????? ……

????????????? // TODO: Delete these three lines if you don't want the toolbar to

????????????? //? be dockable

????????????? m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);

????????????? EnableDocking(CBRS_ALIGN_ANY);

????????????? DockControlBar(&m_wndToolBar);

???????? CMenu menu;

????????????? menu.CreateMenu();

????????????? GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"Test");//添加菜單項目

????????????? GetMenu()->InsertMenu(1,MF_POPUP|MF_BYPOSITION,(UINT)menu.m_hMenu,"test1");//插入菜單項目

????????????? menu.AppendMenu(MF_STRING,IDM_HELLO,"Hello");//在剛插入的彈出式菜單下面添加菜單項111

????????????? menu.AppendMenu(MF_STRING,112,"ByeBye");//在剛插入的彈出式菜單下面添加菜單項112

????????????? menu.AppendMenu(MF_STRING,113,"MyTest");//在剛插入的彈出式菜單下面添加菜單項113

????????????? GetMenu()->GetSubMenu(0)->AppendMenu(MF_STRING,114,"Append");//在子菜單下面添加菜單項目114

????????????? GetMenu()->GetSubMenu(0)->InsertMenu(ID_FILE_OPEN,MF_BYCOMMAND|MF_STRING,115,"Insert");????

//在文件子菜單下面添加菜單項目115

// ??????? GetMenu()->GetSubMenu(0)->DeleteMenu(115,MF_BYCOMMAND);//刪除文件子菜單下面的115菜單項目

????????????? menu.Detach();//防止出現(xiàn)問題

????????????? return 0;

}

添加虛函數(shù)實現(xiàn)消息的截獲,了解消息路由機制

BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)

{

???????? // TODO: Add your specialized code here and/or call the base class

???????? int MenuCmdID = LOWORD(wParam);//wParam的低兩位字節(jié)是消息對象的ID號

???????? CMenu4View* pView = (CMenu4View* )GetActiveView();//在框架類獲得視圖類的對象

???????? if (MenuCmdID >= IDM_PHONE1 && MenuCmdID < IDM_PHONE1+pView->m_strArray.GetSize())

???????? {

?????????????????? MessageBox("框架截獲消息");//通過此消息可以知道消息的路由過程

?????????????????? CClientDC dc(pView);

?????????????????? dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdID-IDM_PHONE1));

???????? }

???????? return CFrameWnd::OnCommand(wParam, lParam);

//????? return TRUE; 消息將不會傳送給視圖類

}

電話薄

void CMenu4View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

???????? // TODO: Add your message handler code here and/or call default

???????? CClientDC dc(this);

???????? if (0x0d == nChar)

???????? {

?????????????????? if (0 == ++m_nIndex)

?????????????????? {

??????????????????????????? m_Menu.CreatePopupMenu();

??????????????????????????? GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)m_Menu.m_hMenu,"PhoneBook");

??????????????????????????? GetParent()->DrawMenuBar();

?????????????????? }

?????????????????? m_Menu.AppendMenu(MF_STRING,IDM_PHONE1+m_nIndex,m_strLine.Left(m_strLine.Find(' ')));

?????????????????? m_strArray.Add(m_strLine);

?????????????????? m_strLine.Empty();

?????????????????? Invalidate(TRUE);

???????? }

???????? else

???????? {

?????????????????? m_strLine += nChar;?????????????????

?????????????????? dc.TextOut(0,0,m_strLine);

???????? }

// ??? Invalidate();

????????

???????? CView::OnChar(nChar, nRepCnt, nFlags);

}

?

void CMenu4View::OnPhone1()

{

???????? // TODO: Add your command handler code here

???????? CClientDC dc(this);

???????? dc.TextOut(0,0,m_strArray.GetAt(0));

}

?

void CMenu4View::OnPhone2()

{

???????? // TODO: Add your command handler code here

???????? CClientDC dc(this);

???????? dc.TextOut(0,0,m_strArray.GetAt(1));

}

?

void CMenu4View::OnPhone3()

{

???????? // TODO: Add your command handler code here

???????? CClientDC dc(this);

???????? dc.TextOut(0,0,m_strArray.GetAt(2));

}

?

void CMenu4View::OnPhone4()

{

???????? // TODO: Add your command handler code here

???????? CClientDC dc(this);

???????? dc.TextOut(0,0,m_strArray.GetAt(3));

}

錯誤解決

?

此類錯誤是頭文件除了問題,導致某某類沒有被定義就被調(diào)用了,只要在該文件之前加上調(diào)用相應頭文件即可。

非模式對話框的創(chuàng)建

?

動態(tài)創(chuàng)建按鈕

?

?

靜態(tài)文本默認是不發(fā)送消息的

?

每一個控件都有指向其窗口的句柄和和hWnd

GetDlgItem(nID)->hWnd

m_Edit1.hWnd

訪問控件的七種方法

?

對話空的伸縮與擴展功能

?

?

void CMyDlg::OnButton2()

{

????????????? CString str;

????????????? static CRect rectLarge;

????????????? static CRect rectSmall;

????????????? if(rectLarge.IsRectNull())

????????????? {

??????????????????????????? CRect rectSepertor;

??????????????????????????? GetWindowRect(&rectLarge);

??????????????????????????? GetDlgItem(IDC_SEPERATOR)->GetWindowRect(&rectSepertor);

?

??????????????????????????? rectSmall.left = rectLarge.left;

??????????????????????????? rectSmall.top = rectLarge.top;

??????????????????????????? rectSmall.right = rectLarge.right;

??????????????????????????? rectSmall.bottom = rectSepertor.bottom;

????????????? }

????????????? if (GetDlgItemText(IDC_BUTTON2,str),str == "收縮<<")

????????????? {

??????????????????????????? SetDlgItemText(IDC_BUTTON2,"擴展>>");??????????????????????????????????????????????????????? ????????????? SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(),SWP_NOMOVE|SWP_NOZORDER);

????????????? }

????????????? else

????????????? {

??????????????????????????? SetDlgItemText(IDC_BUTTON2,"收縮<<");

??????????????????????????? SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(),SWP_NOMOVE|SWP_NOZORDER);

????????????? }

}

輸入焦點的轉換(按回車鍵實現(xiàn)在編輯框之間轉換)

?

“逃跑”按鈕的實現(xiàn)

?

創(chuàng)建屬性頁

一個屬性表單有多個屬性頁組成

創(chuàng)建屬性表

屬性表不是派生于CDialog,它和對話框類相似,也可以用DOModal()來調(diào)用

?

向導的創(chuàng)建

?

?

?

修改應用程序外觀

在程序創(chuàng)建之前修改:在CMainFrame的ProCreateWindow函數(shù)中添加代碼

?

HWND CreateWindowEx(DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);

typedef struct tagCREATESTRUCT

{LPVOID? lpCreateParams; HINSTANCE hInstance; HMENU hMenu; HWND????? hwndParent; int?? cy; int cx; int y; int x; LONG style; LPCTSTR lpszName;LPCTSTR lpszClass; DWORD???? dwExStyle; } CREATESTRUCT, *LPCREATESTRUCT;

?

lpCreateParams

Contains additional data which may be used to create the window. If the window is being created as a result of a call to the CreateWindow or CreateWindowEx function, this member contains the value of the lpParam parameter specified in the function call.

If the window being created is an MDI window, this member contains a pointer to an MDICREATESTRUCT structure.

Windows NT/2000/XP: If the window is being created from a dialog template, this member is the address of a SHORT value that specifies the size, in bytes, of the window creation data. The value is immediately followed by the creation data. For more information, see the following Remarks section.

hInstance

Handle to the module that owns the new window.

hMenu

Handle to the menu to be used by the new window.

hwndParent

Handle to the parent window, if the window is a child window. If the window is owned, this member identifies the owner window. If the window is not a child or owned window, this member is NULL.

cy

Specifies the height of the new window, in pixels.

cx

Specifies the width of the new window, in pixels.

y

Specifies the y-coordinate of the upper left corner of the new window. If the new window is a child window, coordinates are relative to the parent window. Otherwise, the coordinates are relative to the screen origin.

x

Specifies the x-coordinate of the upper left corner of the new window. If the new window is a child window, coordinates are relative to the parent window. Otherwise, the coordinates are relative to the screen origin.

style

Specifies the style for the new window.

WS_BORDER Creates a window that has a thin-line border.

WS_CAPTION Creates a window that has a title bar (includes the WS_BORDER style).

WS_CHILD Creates a child window. This style cannot be used with the WS_POPUP style.

WS_CHILDWINDOW Same as the WS_CHILD style.

WS_CLIPCHILDREN Excludes the area occupied by child windows when drawing occurs within the parent window. This style is used when creating the parent window.

WS_CLIPSIBLINGS Clips child windows relative to each other; that is, when a particular child window receives a WM_PAINT message, the WS_CLIPSIBLINGS style clips all other overlapping child windows out of the region of the child window to be updated. If WS_CLIPSIBLINGS is not specified and child windows overlap, it is possible, when drawing within the client area of a child window, to draw within the client area of a neighboring child window.

WS_DISABLED Creates a window that is initially disabled. A disabled window cannot receive input from the user.

WS_DLGFRAME Creates a window that has a border of a style typically used with dialog boxes. A window with this style cannot have a title bar.

WS_GROUP Specifies the first control of a group of controls. The group consists of this first control and all? controls defined after it, up to the next control with the WS_GROUP style. The first control in each group usually has the WS_TABSTOP style so that the user can move from group to group. The user can subsequently change the keyboard focus from one control in the group to the next control in the group by using the direction keys.

WS_HSCROLL Creates a window that has a horizontal scroll bar.

WS_ICONIC Creates a window that is initially minimized. Same as the WS_MINIMIZE style.

WS_MAXIMIZE Creates a window that is initially maximized.

WS_MAXIMIZEBOX Creates a window that has a Maximize button. Cannot be combined with the WS_EX_CONTEXTHELP style.?

WS_MINIMIZE Creates a window that is initially minimized. Same as the WS_ICONIC style.

WS_MINIMIZEBOX Creates a window that has a Minimize button. Cannot be combined with the WS_EX_CONTEXTHELP style.?

WS_OVERLAPPED Creates an overlapped window. An overlapped window has a title bar and a border. Same as the WS_TILED style.

WS_OVERLAPPEDWINDOW Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles. Same as the WS_TILEDWINDOW style.?

WS_POPUP Creates a pop-up window. This style cannot be used with the WS_CHILD style.

WS_POPUPWINDOW Creates a pop-up window with WS_BORDER, WS_POPUP, and WS_SYSMENU styles. The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible.

WS_SIZEBOX Creates a window that has a sizing border. Same as the WS_THICKFRAME style.

WS_SYSMENU Creates a window that has a Close (X) button in the non-client area.

WS_TABSTOP Specifies a control that can receive the keyboard focus when the user presses the TAB key. Pressing the TAB key changes the keyboard focus to the next control with the WS_TABSTOP style.

WS_THICKFRAME Creates a window that has a sizing border. Same as the WS_SIZEBOX style.

WS_TILED Creates an overlapped window. An overlapped window has a title bar and a border. Same as the WS_OVERLAPPED style.?

WS_TILEDWINDOW Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOX styles. Same as the WS_OVERLAPPEDWINDOW style.?

WS_VISIBLE Creates a window that is initially visible.

WS_VSCROLL Creates a window that has a vertical scroll bar.

lpszName

Pointer to a null-terminated string that specifies the name of the new window.

lpszClass

Pointer to a null-terminated string that specifies the class name of the new window.

dwExStyle

Specifies the extended window style for the new window.

WS_EX_ACCEPTFILES ?Specifies that a window created with this style accepts drag-drop files.

WS_EX_APPWINDOW ?Forces a top-level window onto the taskbar when the window is visible.?

WS_EX_CLIENTEDGE ?Specifies that a window has a border with a sunken edge.

WS_EX_DLGMODALFRAME Creates a window that has a double border; the window can, optionally, be created with a title bar by specifying the WS_CAPTION style in the dwStyle parameter.

WS_EX_LEFT ?Creates a window that has generic “l(fā)eft-aligned” properties. This is the default.

WS_EX_LEFTSCROLLBAR ?If the shell language is Hebrew, Arabic, or another language that supports reading order alignment, the vertical scroll bar (if present) is to the left of the client area. For other languages, the style is ignored.

WS_EX_LTRREADING ?The window text is displayed using left-to-right reading-order properties. This is the default.

WS_EX_MDICHILD ?Creates an MDI child window.

WS_EX_NOACTIVATE ?A top-level window created with this style cannot be activated. If a child window has this style, tapping it does not cause its top-level parent to be activated. A window that has this style receives stylus events, but neither it nor its child windows can get the focus. Supported in Windows CE versions 2.0 and later.

WS_EX_NOANIMATION ?A window created with this style does not show animated exploding and imploding rectangles, and does not have a button on the taskbar. Supported in Windows CE versions 2.0 and later.

WS_EX_NOPARENTNOTIFY Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.

WS_EX_OVERLAPPEDWINDOW Combines the WS_EX_CLIENTEDGE and WS_EX_WINDOWEDGE styles.

WS_EX_PALETTEWINDOW Combines the WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW, and WS_EX_TOPMOST styles.

WS_EX_RIGHT The window has generic “right-aligned” properties. This depends on the window class. This style has an effect only if the shell language is Hebrew, Arabic, or another language that supports reading-order alignment; otherwise, the style is ignored.

WS_EX_RIGHTSCROLLBAR Vertical scroll bar (if present) is to the right of the client area. This is the default.

WS_EX_RTLREADING If the shell language is Hebrew, Arabic, or another language that supports reading-order alignment, the window text is displayed using right-to-left reading-order properties. For other languages, the style is ignored.

WS_EX_STATICEDGE Creates a window with a three-dimensional border style intended to be used for items that do not accept user input.

WS_EX_TOOLWINDOW Creates a tool window; that is, a window intended to be used as a floating toolbar. A tool window has a title bar that is shorter than a normal title bar, and the window title is drawn using a smaller font. A tool window does not appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. If a tool window has a system menu, its icon is not displayed on the title bar. However, you can display the system menu by right-clicking or by typing ALT+SPACE.?

WS_EX_TOPMOST Specifies that a window created with this style should be placed above all non-topmost windows and should stay above them, even when the window is deactivated. To add or remove this style, use the SetWindowPos function.

WS_EX_TRANSPARENT Specifies that a window created with this style should not be painted until siblings beneath the window (that were created by the same thread) have been painted. The window appears transparent because the bits of underlying sibling windows have already been painted.

To achieve transparency without these restrictions, use the SetWindowRgn function.

WS_EX_WINDOWEDGE Specifies that a window has a border with a raised edge.

窗口創(chuàng)建之后修改:在OnCreate()函數(shù)當中添加SetWindowLong()代碼

???????????????????????????????????? ?? GetWindowLong(HWND hWnd,int nIndex)可以獲得當前窗口的風格

?

修改窗口光標,圖標,背景

?

? ?

?

?

?

通過SetClassLong() 重置窗口所屬窗口類的WNDCLASSEX(WNDCLASS結構的擴展),改變光標和背景的代碼放在視圖類的OnCreate函數(shù)中,改變圖標則放在框架類的OnCreate中

SetClassLong(m_hWnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(BLACK_BRUSH));

SetClassLong(m_hWnd,GCL_HCURSOR,(LONG)LoadCursor(NULL,IDC_CROSS));

?

注冊窗口類兩種方法:

一:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

???????? if( !CFrameWnd::PreCreateWindow(cs) )

?????????????????? return FALSE;

???????? // TODO: Modify the Window class or styles here by modifying

???????? //? the CREATESTRUCT cs

???????? cs.cx = 300;//應用程序寬度

???????? cs.cy = 300;//應用程序長度

???????? cs.style &= ~FWS_ADDTOTITLE;//修改應用程序標題必須去掉此風格??????

???????? cs.lpszName = "Chen Sifan";

?

???????? WNDCLASS wndcls;

???????? wndcls.cbClsExtra = 0;

???????? wndcls.cbWndExtra = 0;

???????? wndcls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);

???????? wndcls.hCursor = LoadCursor(NULL,IDC_HELP);

???????? wndcls.hIcon = LoadIcon(NULL,IDI_ERROR);

???????? wndcls.hInstance = AfxGetInstanceHandle();

???????? wndcls.lpfnWndProc = ::DefWindowProc;

???????? wndcls.lpszClassName = "sifan.org";

???????? wndcls.lpszMenuName = NULL;

???????? wndcls.style = CS_HREDRAW|CS_VREDRAW;

?

???????? RegisterClass(&wndcls);

???????? cs.lpszClass = "sifan.org";//只是改變圖標

???????? return TRUE;

}

?

BOOL CStyleView::PreCreateWindow(CREATESTRUCT& cs)

{

???????? // TODO: Modify the Window class or styles here by modifying

???????? //? the CREATESTRUCT cs

??????? cs.lpszClass = "sifan.org";//主要是改變光標和背景

???????? return CView::PreCreateWindow(cs);

}

二:

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)

{

???????? if( !CFrameWnd::PreCreateWindow(cs) )

?????????????????? return FALSE;

???????? // TODO: Modify the Window class or styles here by modifying

???????? //? the CREATESTRUCT cs

???????? cs.lpszClass = AfxRegisterWndClass(CS_VREDRAW|CS_HREDRAW,0,0,LoadIcon(NULL,IDI_WARNING));

???????? return TRUE;

}

BOOL CStyleView::PreCreateWindow(CREATESTRUCT& cs)

{

???????? // TODO: Modify the Window class or styles here by modifying

???????? //? the CREATESTRUCT cs

???????? cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,LoadCursor(NULL,IDC_CROSS)

?????????????????? ,(HBRUSH)GetStockObject(BLACK_BRUSH),0);

???????? return CView::PreCreateWindow(cs);

}

?

動態(tài)改變應用程序圖標

???????? extern CStyleApp theApp;

???????? //LoadIcon的第一個參數(shù)要是一個應用程序句柄,第二個是把一個圖標ID轉換成一個字符串資源

???????? m_hIcon[0] =LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

???????? m_hIcon[1] =LoadIcon(theApp.m_hInstance,MAKEINTRESOURCE(IDI_ICON2));//全局變量的應用必須先聲明

???????? m_hIcon[2] =LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));//全局函數(shù)

?

???????? SetTimer(1,1000,NULL);

void CMainFrame::OnTimer(UINT nIDEvent)

{

???????? // TODO: Add your message handler code here and/or call default

???????? static int nIndex = 0;

???????? SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcon[nIndex]);

???????? nIndex = ++nIndex%3; //很巧

???????? CFrameWnd::OnTimer(nIDEvent);

}

?

工具欄

?

?

第二個是框架類的EnableDocking,是為了讓主框架窗口可以被停靠;

? ?

代碼如下:

void CMainFrame::OnViewNewToolbar()

{

???????? // TODO: Add your command handler code here

// ??? if (m_newToolBar.IsWindowVisible())

// ??? {

// ???????????? m_newToolBar.ShowWindow(SW_HIDE);

// ??? }

// ??? else

// ??? {

// ???????????? m_newToolBar.ShowWindow(SW_SHOW);

// ??? }

// ??? RecalcLayout(TRUE);//重新調(diào)整控制條的位置,默認是真

// ??? DockControlBar(&m_newToolBar);//重新讓工具條停靠在框架窗口的邊緣

?

//用一個函數(shù)可以替換以上全部代碼,還可以讓工具欄在消失的位置顯示出來

???????? ShowControlBar(&m_newToolBar,!m_newToolBar.IsVisible(),FALSE);

}

為菜單欄添加復選標記

?

???????? pCmdUI->SetCheck(m_newToolBar.IsWindowVisible());

時間

?

?

狀態(tài)欄編程

?

進度欄編程

?

?

?

void CMainFrame::OnPaint()

{

???????? CPaintDC dc(this); // device context for painting

????????

???????? // TODO: Add your message handler code here

???????? CRect rect;

???????? m_wndStatusBar.GetItemRect(2,&rect);

???????? if (!m_progress.m_hWnd)

???????? {

???????? m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rect,&m_wndStatusBar,1111);

???????? }

???????? else

???????? {

?????????????????? m_progress.MoveWindow(rect);

???????? }

???????? m_progress.SetPos(50);

???????? // Do not call CFrameWnd::OnPaint() for painting messages

}

四種方法在狀態(tài)欄第一個窗口顯示鼠標的當前位置

首先確定是為視圖類添加WM_MOUSEMOVE消息

其次捕獲鼠標的坐標并且格式化

第三獲取父窗口即框架類窗口的句柄,GetParent()獲取的是CWnd指針,故要將其強制轉換為CMainFrame

void CStyleView::OnMouseMove(UINT nFlags, CPoint point)

{

???????? // TODO: Add your message handler code here and/or call default

???????? CString strMouse;

???????? strMouse.Format("X=%d,Y=%d",point.x,point.y);

???????? //調(diào)用CStatusBar的成員函數(shù)將文本放在第一個窗口

???????? ((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(strMouse);

???????? //調(diào)用CFrameWnd的成員函數(shù)將文本放在第一個窗口

???????? ((CMainFrame*)GetParent())->SetMessageText(strMouse);

???????? //通過CMainFrame ::GetMessageBar來獲取狀態(tài)欄的指針來調(diào)用SetWindowText將文本放在第一個窗口

???????? ((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(strMouse);

???????? //通過CWnd::GetDescendantWindow來獲取狀態(tài)欄的指針來調(diào)用SetWindowText將文本放在第一個窗口

???????? GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(strMouse);

???????? CView::OnMouseMove(nFlags, point);

}

?

為應用程序添加啟動畫面

?

設置顏色對話框默認顏色

?

?

?

常見錯誤2

?

設置字體

常見錯誤3

?

示例區(qū)域

void CSetting::OnPaint()

{

???????? CPaintDC dc(this); // device context for painting

????????

???????? // TODO: Add your message handler code here

???????? CPen pen(m_nLineWidth,m_nLineStyle,m_clr);

???????? dc.SelectObject(&pen);

???????? CRect rect;

???????? GetDlgItem(IDC_SAMPLE)->GetWindowRect(&rect);//IDC_SAMPLE為組框的ID,通過她來獲得示例區(qū)域

???????? ScreenToClient(&rect);

???????? dc.MoveTo(rect.left+20,rect.top+rect.Height()/2);

???????? dc.LineTo(rect.right-20,rect.top+rect.Height()/2);

???????? UpdateData();

???????? // Do not call CDialog::OnPaint() for painting messages

}

改變對話框控件的背景及字體顏色

?

HBRUSH CSetting::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

???????? HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

???????? return m_brush;// m_brush.CreateSolidBrush(RGB(0,255,0));

}

僅僅改變個別控件和字體顏色

HBRUSH CSetting::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

???????? HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

????????

???????? // TODO: Change any attributes of the DC here

???????? if (pWnd->GetDlgCtrlID() == IDC_LINE_STYLE)

???????? {

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

?????????????????? pDC->SetBkMode(TRANSPARENT);

?????????????????? //控件上面有字,字體有陰影,此句就是將字體背景設置為透明,這樣就可以看見控件顏色了

?????????????????? return m_brush;

???????? }

???????? if (pWnd->GetDlgCtrlID() == IDC_LINE_WIDTH_EDIT)

???????? {

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

???????????????? pDC->SetBkMode(TRANSPARENT);

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

?????????????????? return m_brush;

???????? }

???????? return hbr;

???????? // TODO: Return a different brush if the default is not desired

}

改變控件上面的字體

???????? if (pWnd->GetDlgCtrlID() == IDC_TEXT)

???????? {

?????????????????? pDC->SelectObject(&m_font);

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

???????? }

改變按鈕控件的背景和文本顏色

?

?

位圖的顯示

?

?

?

?

?

?

窗口的繪制過程:清除背景BOOL CGraphicView::OnEraseBkgnd(CDC* pDC),重繪制窗口(也會調(diào)用OnDraw函數(shù),因此也可以將代碼放到OnDraw函數(shù)中去);

只是在OnDraw當中編寫的話,每當窗口尺寸變化的時候,就會先清除窗口,因此此種方法的效果是閃爍性比較明顯。

BOOL CGraphicView::OnEraseBkgnd(CDC* pDC)

{

???????? // TODO: Add your message handler code here and/or call default

???????? CBitmap bitMap;

???????? bitMap.LoadBitmap(IDB_BITMAP1);

?

???????? BITMAP bmp;

???????? bitMap.GetBitmap(&bmp);

?

???????? CDC pCompatiableDC;

???????? pCompatiableDC.CreateCompatibleDC(pDC);//兼容DC

???????? pCompatiableDC.SelectObject(&bitMap);

?

???????? CRect rect;

???????? GetClientRect(&rect);

// ??? pDC->BitBlt(0,0,rect.Width(),rect.Height(),&pCompatiableDC,0,0,SRCCOPY);//1:1復制

???????? pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&pCompatiableDC,0,0

?????????????????? ,bmp.bmWidth,bmp.bmHeight,SRCCOPY);//壓縮源圖片顯示

???????? return TRUE;//為TRUE表示不再清楚窗口背景

}

?

一、圖形的保存和重繪(huì)

?

?

?

?

?

1,為視圖類新建一個私有的CPtrArray數(shù)據(jù)類型,用來保存繪圖的三要素:起點,終點,類型

2,重繪窗口的時候會調(diào)用OnDraw函數(shù)

void CGraphicView::OnDraw(CDC* pDC)

{

???????? CGraphicDoc* pDoc = GetDocument();

???????? ASSERT_VALID(pDoc);

???????? // TODO: add draw code for native data here

???????? CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

???????? pDC->SelectObject(&pBrush);

?

???????? for (int i=0;i<m_ptrArray.GetSize();i++)

???????? {

?????????????????? switch(((CGraph*)m_ptrArray.GetAt(i))->m_nDrawType)

?????????????????? {

?????????????????? case 1:

??????????????????????????? pDC->SetPixel(((CGraph*)m_ptrArray.GetAt(i))->m_nEndPoint,RGB(0,0,0));

??????????????????????????? break;

?????????????????? case 2:

??????????????????????????? pDC->MoveTo(((CGraph*)m_ptrArray.GetAt(i))->m_nOriginPoint);

??????????????????????????? pDC->LineTo(((CGraph*)m_ptrArray.GetAt(i))->m_nEndPoint);

??????????????????????????? break;

?????????????????? case 3:

?????????????????? ???????? pDC->Rectangle(CRect(

???????????????????????????????????? ((CGraph*)m_ptrArray.GetAt(i))->m_nOriginPoint,

???????????????????????????????????? ((CGraph*)m_ptrArray.GetAt(i))->m_nEndPoint));

??????????????????????????? break;

?????????????????? case 4:

??????????????????????????? pDC->Ellipse(CRect(

???????????????????????????????????? ((CGraph*)m_ptrArray.GetAt(i))->m_nOriginPoint,

???????????????????????????????????? ((CGraph*)m_ptrArray.GetAt(i))->m_nEndPoint)

???????????????????????????????????? );

??????????????????????????? break;

?????????????????? }

???????? }

}

3,在OnButtonUp函數(shù)里面加入以下代碼,將每一個圖形添加到CPtrArray當中去

???????? CGraph* pGraph =new CGraph(m_nDrawType,m_nOriginPoint,point);//new均是在堆中定義的

???????? m_ptrArray.Add(pGraph);

OnDraw和OnPaint函數(shù)

?

?

窗口滾動功能的實現(xiàn)

讓視圖基類為CScrollView,兩種方式:1,在應用程序創(chuàng)建的第六步修改基類

2,若程序已經(jīng)創(chuàng)建了,那么只需要將應用程序視圖類的頭文件和源文件中的

CView改成CScrollView類

錯誤4

?

圖形錯位現(xiàn)象

在OnDraw函數(shù)中添加一下代碼:

OnPrepareDC(&dc);

???????? dc.DPtoLP(&m_nOriginPoint);

???????? dc.DPtoLP(&point);

二、用元文件保存圖形

?

元文件用來保存圖形,代碼如下:

void CGraphicView::OnDraw(CDC* pDC)

{

???????? CGraphicDoc* pDoc = GetDocument();

???????? ASSERT_VALID(pDoc);

???????? // TODO: add draw code for native data here

?

???????? HMETAFILE hMetaFile;

???????? hMetaFile = m_dcMetaFile.Close();//沒想到close()函數(shù)也能夠用來獲取句柄

???????? pDC->PlayMetaFile(hMetaFile);

???????? m_dcMetaFile.Create();//在內(nèi)存中創(chuàng)建,用來播放之前繪制的圖像

???????? m_dcMetaFile.PlayMetaFile(hMetaFile);//顯示前面繪制的圖像

???????? DeleteMetaFile(hMetaFile);

}

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

{

???????? // TODO: Add your message handler code here and/or call default

???????? CClientDC dc(this);

?

???????? CPen pen(m_nLineStyle,m_nLineWidth,m_clr);

// ??? dc.SelectObject(&pen);

??????? m_dcMetaFile.SelectObject(&pen);

????????

???????? CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

// ??? dc.SelectObject(&pBrush);

???????? m_dcMetaFile.SelectObject(&pen);

?

???????? switch (m_nDrawType)

???????? {

???????? case 1:

// ???????????? dc.SetPixel(point,m_clr);

???????? ???????? m_dcMetaFile.SetPixel(point,m_clr);

?????????????????? break;

???????? case 2:

// ???????????? dc.MoveTo(m_nOriginPoint);

?????????????????? m_dcMetaFile.MoveTo(m_nOriginPoint);

// ???????????? dc.LineTo(point);

?????????????????? m_dcMetaFile.LineTo(point);

?????????????????? break;

???????? case 3:

// ???????????? dc.Rectangle(CRect(m_nOriginPoint,point));

?????????????????? m_dcMetaFile.Rectangle(CRect(m_nOriginPoint,point));

?????????????????? break;

???????? case 4:

// ???????????? dc.Ellipse(CRect(m_nOriginPoint,point));

?????????????????? m_dcMetaFile.Ellipse(CRect(m_nOriginPoint,point));

?????????????????? break;

???????? }

????????

//? OnPrepareDC(&dc);

//? dc.DPtoLP(&m_nOriginPoint);

//? dc.DPtoLP(&point);

?

// ??? CGraph* pGraph =new CGraph(m_nDrawType,m_nOriginPoint,point);//new均是在堆中定義的

// ??? m_ptrArray.Add(pGraph);

?

???????? CScrollView::OnLButtonUp(nFlags, point);

}

將元文件保存到磁盤,用[文件]子菜單下的[打開]打開它,用[保存]保存它

?

保存

void CGraphicView::OnFileSave()

{

???????? // TODO: Add your command handler code here

???????? HMETAFILE hMetaFile;//定義一個句柄變量

???????? hMetaFile = m_dcMetaFile.Close();//獲取句柄

???????? CopyMetaFile(hMetaFile,"meta.wmf");//對元文件來說,通常用wmf格式保存它到磁盤文件WindowsMetaFile

???????? m_dcMetaFile.Create();//創(chuàng)建一個元文件,以供下一次繪圖使用

???????? DeleteMetaFile(hMetaFile);//釋放句柄

}

打開

void CGraphicView::OnFileOpen()

{

???????? // TODO: Add your command handler code here

???????? HMETAFILE hMetaFile;//定義一個句柄變量

???????? hMetaFile = GetMetaFile("meta.wmf");//獲取句柄

???????? m_dcMetaFile.PlayMetaFile(hMetaFile);

???????? DeleteMetaFile(hMetaFile);//釋放句柄

???????? Invalidate();//窗口重繪,調(diào)用OnDraw函數(shù)

}

三、兼容DC(設備描述表)保存圖形和重繪

?

?

?

void CGraphicView::OnDraw(CDC* pDC)

{

???????? CGraphicDoc* pDoc = GetDocument();

???????? ASSERT_VALID(pDoc);

???????? // TODO: add draw code for native data here

//用兼容DC保存圖像

???????? CRect rect;

???????? GetClientRect(&rect);

???????? pDC->BitBlt(0,0,rect.Width(),rect.Height(),&m_dcCompatibale,0,0,SRCCOPY);

}

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

{

???????? // TODO: Add your message handler code here and/or call default

???????? CClientDC dc(this);

???????? CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));

???????? if (!m_dcCompatibale.m_hDC)

???????? {

?????????????????? m_dcCompatibale.CreateCompatibleDC(&dc);

?????????????????? CRect rect;

?????????????????? GetClientRect(rect);

?????????????????? CBitmap bitmap;

?????????????????? bitmap.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());

?????????????????? m_dcCompatibale.SelectObject(&bitmap);

?????????????????? m_dcCompatibale.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);

?????????????????? m_dcCompatibale.SelectObject(pBrush);

???????? }

???????? switch (m_nDrawType)

???????? {

???????? case 1:

?????????????????? m_dcCompatibale.SetPixel(point,m_clr);

?????????????????? break;

???????? case 2:

?????????????????? m_dcCompatibale.MoveTo(m_nOriginPoint);

?????????????????? m_dcCompatibale.LineTo(point);

?????????????????? break;

???????? case 3:

?????????????????? m_dcCompatibale.Rectangle(CRect(m_nOriginPoint,point));

?????????????????? break;

???????? case 4:

?????????????????? m_dcCompatibale.Ellipse(CRect(m_nOriginPoint,point));

?????????????????? break;

???????? }

???????? CScrollView::OnLButtonUp(nFlags, point);

}

文件操作

寫入

void CFileView::OnFileWrite()

{

???????? // TODO: Add your command handler code here

???????? FILE* pFile = fopen("1.txt","w");

???????? CString str = "http:\\\\www.sunxin.org";

// ??? CString str1 = "weclome";

???????? fwrite(str,1,strlen(str),pFile);//將字符串寫入文件緩沖區(qū)

???????? fseek(pFile,0,SEEK_SET);//在文件開始出插入,替換Http

???????? fwrite(" ftp",1,strlen(" ftp"),pFile);

// ??? fwrite(str1,1,strlen(str1),pFile);//將字符串寫入文件緩沖區(qū)

// ??? fclose(pFile);//關閉文件,將緩沖區(qū)的內(nèi)容寫到文件當中

?????????????????????????????????????????????? //如果沒有這句話,將會導致內(nèi)容不能立即寫入文件中

???????? fflush(pFile);//實現(xiàn)在不關閉文件的情況下將緩沖區(qū)的內(nèi)容寫如文件,提高效率(刷新緩沖區(qū)內(nèi)容哦個)

}

讀取

void CFileView::OnFileRead()

{

???????? // TODO: Add your command handler code here

???????? FILE *pFile = fopen("1.txt","r");

???????? char ch[100];

???????? fread(ch,1,100,pFile);

???????? fclose(pFile);

???????? MessageBox(ch);

}

錯誤5

?

?

向字符串末尾添加“\0”

1 利用數(shù)組給最后一個元素賦值為‘\0’

void CFileView::OnFileWrite()

{

????????

???????? FILE* pFile = fopen("1.txt","w");

???????? char buf[22] = "http:\\\\www.sunxin.org";

???????? buf[21] = '\0';

???????? fwrite(buf,1,22,pFile);

???????? fclose(pFile);

}

2 讀的時候用memset函數(shù)先將數(shù)組初始化為全0

?

void CFileView::OnFileRead()

{

???????? // TODO: Add your command handler code here

???????? FILE *pFile = fopen("1.txt","r");

???????? char ch[100];

???????? memset(ch,0,100);?

???????? fread(ch,1,100,pFile);

???????? fclose(pFile);

???????? MessageBox(ch);

}

3 用ftell來獲取文件長度,獲取之后用rewind來將指針移動到文件開頭

void CFileView::OnFileRead()

{

???????? // TODO: Add your command handler code here

???????? FILE *pFile = fopen("1.txt","r");

???????? char* pBuf;

???????? fseek(pFile,0,SEEK_END);

???????? int len = ftell(pFile);//獲得長度

???????? pBuf = new char[len+1];

???????? rewind(pFile);//將文件指針移動到文件開頭

???????? fread(pBuf,1,len,pFile);

???????? pBuf[len] = 0;

???????? fclose(pFile);

???????? MessageBox(pBuf);

}

文本文件和二進制文件差異

?

itoa函數(shù):把一個整型數(shù)據(jù)轉換成字符形式

Win32 文件操作

void CFileView::OnFileWrite()

{

//win32 文件操作

???????? //定義一個句柄變量

???????? HANDLE hFile;

???????? hFile = CreateFile("2.txt",GENERIC_WRITE,0,NULL,CREATE_NEW,

?????????????????? FILE_ATTRIBUTE_NORMAL,NULL);//創(chuàng)建文件

???????? DWORD dwWrites;//接收實際接受的字節(jié)數(shù)

???????? WriteFile(hFile,"win32 file operator",strlen("win32 file operator"),

?????????????????? &dwWrites,NULL);//寫入數(shù)據(jù)

???????? CloseHandle(hFile);//關閉句柄

}

void CFileView::OnFileRead()

{

//win32文件操作

???????? HANDLE hFile;//創(chuàng)建句柄對象

???????? hFile = CreateFile("2.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

???????? char ch[100];

???????? DWORD dwReads;//接受讀取的字節(jié)數(shù)

???????? ReadFile(hFile,ch,100,&dwReads,NULL);//讀取文件

???????? ch[dwReads] = 0;//設置結束標志

???????? CloseHandle(hFile);//關閉句柄

???????? MessageBox(ch);

}

往注冊表中寫入東西(win32 API函數(shù)和CWinApp函數(shù)WriteProfileString區(qū)別)

//? ::WriteProfileString("http:\\\\www.sunxin.org","admin","zhangshan");Win32 函數(shù) 寫到win.ini當中去

??????? WriteProfileString("http:www.sunxin.org","admin","zhangshan");//CWinApp函數(shù)寫到注冊表

???????? CString str;

// ??? ::GetProfileString("http:\\\\www.sunxin.org","admin","lisi",str.GetBuffer(100),100);

???????? str = GetProfileString("http:\\\\www.sunxin.org","admin");//獲取注冊表中的信息

???????? AfxMessageBox(str);

注冊表API操作

創(chuàng)建鍵

?

打開鍵

?

寫入注冊表

?

?

讀取注冊表

? ?

注冊表示例:

?

?

?

void CFileView::OnRegWrite()

{

???????? // TODO: Add your command handler code here

???????? HKEY hKey;

???????? RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",&hKey);

???????? RegSetValue(hKey,NULL,REG_SZ,"zhangshan",strlen("zhangshan"));

???????? DWORD dwage = 30;

???????? //寫入一個非REG_SZ類型的數(shù)據(jù),需要調(diào)用以下函數(shù),第五個參數(shù)是數(shù)據(jù)的值,需要強制轉換

???????? RegSetValueEx(hKey,"Age",0,REG_DWORD,(const byte*)&dwage,4);

???????? RegCloseKey(hKey);

}

?

void CFileView::OnRegRead()

{

// ??? // TODO: Add your command handler code here

// ??? LONG lValue;

// ??? //第一次調(diào)用得到要讀取的字符串的長度

// ??? RegQueryValue(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",NULL,&lValue);

// ??? char* pBuf = new char[lValue];

// ??? //第二次調(diào)用根據(jù)長度獲取數(shù)據(jù)

// ??? RegQueryValue(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",pBuf,&lValue);

// ??? MessageBox(pBuf);

?

???????? HKEY hKey;

???????? //打開指定的注冊表項

???????? RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",&hKey);

???????? DWORD dwType;

???????? DWORD dwValue;

???????? DWORD dwAge;

???????? //讀取其它類型的數(shù)據(jù)

???????? RegQueryValueEx(hKey,"Age",0,&dwType,(LPBYTE)&dwAge,&dwValue);

???????? CString str;

???????? str.Format("Age = %d",dwValue);

???????? MessageBox(str);

}

文檔與串行化

?

代碼:

void CGraphicView::OnFileRead()//對象的讀取順序和寫入順序必須一致

{

???????? // TODO: Add your command handler code here

???????? // 構造CFile對象

???????? CFile file("ar.txt",CFile::modeRead);

???????? //構造存檔對象

???????? CArchive ar(&file,CArchive::load);//打開操作

???????? int i;

???????? char ch;

???????? float f;

???????? CString str;

???????? CString strResult;

???????? ar>>i>>ch>>f>>str;//讀取數(shù)據(jù)

???????? strResult.Format("%d,%c,%f,%s",i,ch,f,str);//數(shù)據(jù)格式化

???????? MessageBox(strResult);

}

?

void CGraphicView::OnFileWrite()

{

???????? // TODO: Add your command handler code here

???????? // 構造CFile對象

???????? CFile file("ar.txt",CFile::modeCreate|CFile::modeWrite);

???????? //構造CArchive存檔對象

???????? CArchive ar(&file,CArchive::store);//保存操作

???????? int i = 4;

???????? char ch = 'a';

???????? float f =1.3f;

???????? CString str("www.sunxin.org");

???????? //保存數(shù)據(jù)

???????? ar<<i<<ch<<f<<str;

}

查看文檔模版的字符串:

?

?

文檔

? ?

?

實現(xiàn)類對串行化的支持

?

?

void CGraph::Serialize(CArchive& ar)

{

???????? if (ar.IsStoring())

???????? {

?????????????????? ar<<m_nDrawType<<m_nOriginPoint<<m_nEndPoint;

???????? }

???????? else

???????? {

?????????????????? ar>>m_nDrawType>>m_nOriginPoint>>m_nEndPoint;

???????? }

}

?

void CGraph::Draw(CDC *pDC)

{

???????? CBrush* pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//穿件透明畫刷

???????? CBrush* pOldbrush = pDC->SelectObject(pBrush);

?

???????? switch(m_nDrawType)

???????? {

???????? case 1:

?????????????????? pDC->SetPixel(m_nEndPoint,RGB(0,0,0));

?????????????????? break;

???????? case 2:

?????????????????? pDC->MoveTo(m_nOriginPoint);

?????????????????? pDC->LineTo(m_nEndPoint);

?????????????????? break;

???????? case 3:

?????????????????? pDC->Rectangle(CRect(m_nOriginPoint,m_nEndPoint));

?????????????????? break;

???????? case 4:

?????????????????? pDC->Ellipse(CRect(m_nOriginPoint,m_nEndPoint));

?????????????????? break;

???????? }

???????? pDC->SelectObject(pOldbrush);

}

錯誤6

?

要求在設計可串行化的類時,在其內(nèi)部確定需要串行化的數(shù)據(jù)。

CObject本書就是串行化類,因此可以直接用CObject類來實現(xiàn)數(shù)據(jù)的設計和顯示

1、在void CGraphicDoc::Serialize(CArchive& ar)當中添加一下代碼 ????????

pView->m_obArray.Serialize(ar);//直接利用CObject類本身就是可串行化類的特點,直接用一句話實現(xiàn)串行化數(shù)據(jù)

2、在void CGraphicView::OnDraw(CDC* pDC)中添加一下代碼

???????? int nCount = m_obArray.GetSize();

???????? for (int i=0;i<nCount;i++)

???????? {

?????????????????? ((CGraph*)m_obArray.GetAt(i))->Draw(pDC);

???????? }

知識點

?

?

文檔的銷毀

?

*******RemoveAt錯誤7

void CGraphicDoc::DeleteContents()

{

???????? // TODO: Add your specialized code here and/or call the base class

???????? POSITION pos = GetFirstViewPosition();

???????? CGraphicView* pView = (CGraphicView*)GetNextView(pos);

???????? int nCount = pView->m_obArray.GetSize();

???????? for (int i=0;i<nCount;i++)//注意不要用GetSize函數(shù)作為條件,因為刪除指針數(shù)據(jù)時的內(nèi)存大小時刻在變

???????? {

?????????????????? delete pView->m_obArray.GetAt(i);//delete釋放指針指向的堆內(nèi)存,而CObArray中保存的是指針

?????????????????? // pView->m_obArray.RemoveAt(i);//刪除m_obArray當中保存的指針數(shù)據(jù)//出現(xiàn)內(nèi)存泄露

???????? }

???????? pView->m_obArray.RemoveAll();//等指針指向的堆內(nèi)存全部刪除之后再刪除全部的指針數(shù)據(jù)

???????? CDocument::DeleteContents();

}

?

網(wǎng)絡編程

計算機通信

條件:對方IP,通信協(xié)議,端口號;

一臺電腦會有很多個網(wǎng)絡程序在運行,要實現(xiàn)與其中一個應用程序通信必須指定該網(wǎng)絡應用程序的地址;那么IP相當于總機地址,端口號相當于分機地址;

?

Windows socket是網(wǎng)絡編程的一種簡單的方法

它是應用程序和網(wǎng)絡驅動程序之間的橋梁;

應用程序把數(shù)據(jù)傳給Socket,Socket再把數(shù)據(jù)交給驅動程序,驅動程序再把數(shù)據(jù)發(fā)送出去;

計算機從網(wǎng)絡上收到與該Socket綁定的IP地址和端口號相關的數(shù)據(jù)后,由驅動程序交給Socket,應用程序便可從Scoket提取接收到的數(shù)據(jù)了;

ISO/OSI七層參考模型

(Open System Interconnection)

?

?

TCP/IP模型

?

協(xié)議端口(Protocol port)

端口用一個整數(shù)型標識符來表示,即端口號;

端口號與協(xié)議相關;

端口號使用一個16位的數(shù)字來表示,范圍是0~65535;

1024以下的端口號留給預定義服務,我們編寫網(wǎng)絡應用程序的時候,為程序指定1024以上的端口號;

套接字(Socket)

?

套接字類型

?

網(wǎng)絡字節(jié)順序

?

客戶機/主機服務模式

?

基于TCp(面向連接)的Socket編程

?

基于UDP(面向無連接)的Socket編程

?

套接字編程需要額一些函數(shù)

WSAStart 函數(shù)? :加載套接字庫和確定Socket版本

?

Socket函數(shù)

?

Bind函數(shù)

?

Liten函數(shù)

?

Accept函數(shù)

?

Send函數(shù)

?

Recv函數(shù)

?

Connect函數(shù)

?

Rectfrom函數(shù)

?

Sendto函數(shù)

?

Htons和htonl函數(shù)

?

TCP建立工程方法

服務器程序

#include <Winsock2.h>

#include <Stdio.h>

?

void main()

{

//加載套接字庫

???????? WORD wVisionRequested;//保存WinSock庫的版本

???????? WSADATA wsaData;

???????? int err;

?

???????? wVisionRequested = MAKEWORD(1,1);//請求版本號的WORD值

?

???????? err = WSAStartup(wVisionRequested,&wsaData);//加載套接字庫

?

???????? if (err != 0)//如果返回值不為0 ,則直接退出

???????? {

?????????????????? return;

???????? }

?

???????? if (LOBYTE(wsaData.wVersion) != 1||HIBYTE(wsaData.wVersion != 1))//驗證版本號

???????? {

?????????????????? WSACleanup();

?????????????????? return;

???????? }

//創(chuàng)建套接字

???????? SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建的是流式套接字,自動選擇協(xié)議

//將套接字綁定到本機地址和端口上

???????? SOCKADDR_IN addrSrv;//定義一個SOCKADDR_IN變量,作為套接字的本地地址信息

???????? //完成對SOCKADDR_IN的賦值

???????? addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//將主機地址信息32位u_Long轉換為網(wǎng)絡地址信息

???????? addrSrv.sin_family = AF_INET;//地址家族

???????? addrSrv.sin_port = htons(6000);//端口號為6000,并將兩個字節(jié)16位的信息u_short轉換成網(wǎng)絡地址信息

?

???????? bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//將套接字設置為監(jiān)聽模式,準備接收用戶請求

???????? listen(sockSrv,5);//第一個是套接字,第二個是等待連接隊列的最大長度

?

???????? SOCKADDR_IN add_Client;//定義一個地址及誒夠提,用來接收用戶地址信息

???????? int len = sizeof(SOCKADDR);

?

???????? while (1)

???????? {

// 等待用戶請求到來,當請求到來后,接收連接請求,返回一個新的對應于此次連接的套接字

?????????????????? SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&add_Client,&len);//sockConn用來保存新的套接字,而先前的套接字任繼續(xù)監(jiān)聽連接請求

?????????????????? char sendBuf[100];//定義一個數(shù)組,用于保存要發(fā)送的數(shù)據(jù)

?????????????????? //ntol函數(shù)將一個in_addr的結構類型轉換為點分十進制格式的IP地址字符串

?????????????????? sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",inet_ntoa(add_Client.sin_addr));

//發(fā)送數(shù)據(jù)??????????????

?????????????????? send(sockConn,sendBuf,100,0);

?????????????????? char recvBuf[100];

//接收數(shù)據(jù)??????????????

?????????????????? recv(sockConn,recvBuf,100,0);

// 打印數(shù)據(jù)????????????

?????????????????? printf("%s\n",recvBuf);

//關閉套接字??????????

?????????????????? closesocket(sockConn);

???????? }

}

?

客戶端程序

?

#include <Winsock2.h>

#include <Stdio.h>

?

void main()

{

//加載套接字庫

???????? WORD wVisionRequested;//保存WinSock庫的版本

???????? WSADATA wsaData;

???????? int err;

????????

???????? wVisionRequested = MAKEWORD(1,1);//請求版本號的WORD值

????????

???????? err = WSAStartup(wVisionRequested,&wsaData);//加載套接字庫

?

???????? wVisionRequested = MAKEWORD(1,1);//請求版本號的WORD值

????????

???????? err = WSAStartup(wVisionRequested,&wsaData);//加載套接字庫

????????

???????? if (err != 0)//如果返回值不為0 ,則直接退出

???????? {

?????????????????? return;

???????? }

????????

???????? if (LOBYTE(wsaData.wVersion) != 1||HIBYTE(wsaData.wVersion != 1))//驗證版本號

???????? {

?????????????????? WSACleanup();

?????????????????? return;

???????? }

//創(chuàng)建套接字

???????? SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建的是流式套接字,自動選擇協(xié)議

?

???????? SOCKADDR_IN addrSrv;//定義一個SOCKADDR_IN變量,作為套接字的本地地址信息

//完成對SOCKADDR_IN的賦值

???????? //設定服務器端的地址,127.0.0.1是本地回路地址,不管機器有無網(wǎng)卡都可以使用這個IP地址

???????? //往往用這個IP地址在本地機器上面測試

???????? addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//將其轉換為u_Long類型

???????? addrSrv.sin_family = AF_INET;//地址家族

???????? addrSrv.sin_port = htons(6000);//端口號為服務器等待請求信號的那個端口

//向服務器發(fā)出請求,第二個是設定連接服務器的地址信息,第三個是指定服務器端地址長度

//對于客戶端來說,它不需要綁定,可以直接連接服務器

???????? connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//接收數(shù)據(jù)

???????? char recvBuf[100];

???????? recv(sockClient,recvBuf,100,0);

???????? printf("%s\n",recvBuf);

//發(fā)送數(shù)據(jù)

???????? //+1是為了在最后加上一個‘\0’,表示字符串結束

???????? send(sockClient,"This is Client message.",strlen("This is Client message.")+1,0);

//關閉套接字

???????? closesocket(sockClient);

???????? WSACleanup();

}

運行結果如下:

?

UDP建立工程

//UdpSrc.cpp

#include <Winsock2.h>

#include <Stdio.h>

?

void main()

{

//加載套接字庫

???????? WORD wVisionRequested;//保存WinSock庫的版本

???????? WSADATA wsaData;

???????? int err;

????????

???????? wVisionRequested = MAKEWORD(1,1);//請求版本號的WORD值

????????

???????? err = WSAStartup(wVisionRequested,&wsaData);//加載套接字庫

????????

???????? if (err != 0)//如果返回值不為0 ,則直接退出

???????? {

?????????????????? return;

???????? }

????????

???????? if (LOBYTE(wsaData.wVersion) != 1||HIBYTE(wsaData.wVersion != 1))//驗證版本號

???????? {

?????????????????? WSACleanup();

?????????????????? return;

???????? }

//創(chuàng)建套接字

???????? SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);//創(chuàng)建的是數(shù)據(jù)報式套接字,自動選擇協(xié)議

???????? //將套接字綁定到本機地址和端口上

???????? SOCKADDR_IN addrSrv;//定義一個SOCKADDR_IN變量,作為套接字的本地地址信息

???????? //完成對SOCKADDR_IN的賦值

???????? addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//將主機地址信息32位u_Long轉換為網(wǎng)絡地址信息

???????? addrSrv.sin_family = AF_INET;//地址家族

???????? addrSrv.sin_port = htons(6000);//端口號為6000,并將兩個字節(jié)16位的信息u_short轉換成網(wǎng)絡地址信息

// 綁定套接字???????

???????? bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

//等待并接收數(shù)據(jù)

???????? SOCKADDR_IN add_Client;//定義一個地址,用來接收用戶地址信息

???????? int len = sizeof(SOCKADDR);

???????? char recvBuf[100];//定義一個數(shù)組,用于保存要接收的數(shù)據(jù)

???????? recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&add_Client,&len);

???????? printf("%s\n",recvBuf);

//關閉套接字

???????? closesocket(sockSrv);

???????? WSACleanup();

}

//UdpClient.cpp

#include <Winsock2.h>

#include <Stdio.h>

?

void main()

{

//加載套接字庫

???????? WORD wVisionRequested;//保存WinSock庫的版本

???????? WSADATA wsaData;

???????? int err;

????????

???????? wVisionRequested = MAKEWORD(1,1);//請求版本號的WORD值

????????

???????? err = WSAStartup(wVisionRequested,&wsaData);//加載套接字庫

????????

???????? if (err != 0)//如果返回值不為0 ,則直接退出

???????? {

?????????????????? return;

???????? }

????????

???????? if (LOBYTE(wsaData.wVersion) != 1||HIBYTE(wsaData.wVersion != 1))//驗證版本號

???????? {

?????????????????? WSACleanup();

?????????????????? return;

???????? }

//創(chuàng)建套接字

???????? SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);//創(chuàng)建的是流式套接字,自動選擇協(xié)議

???????? SOCKADDR_IN addrSrv;//定義一個SOCKADDR_IN變量,作為套接字的本地地址信息

???????? addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

???????? addrSrv.sin_family = AF_INET;//地址家族

???????? addrSrv.sin_port = htons(6000);//端口號為6000,并將兩個字節(jié)16位的信息u_short轉換成網(wǎng)絡地址信息

//發(fā)送數(shù)據(jù)

???????? sendto(sockSrv,"This is a client message.",strlen("This is a client message.")+1

?????????????????? ,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//addrSrv為目標套接字地址

//關閉套接字

???????? closesocket(sockSrv);

???????? WSACleanup();

}

?

基于UDP的簡單聊天程序

//NetSrv.cpp

#include <Winsock2.h>

#include <Stdio.h>

?

void main()

{

???????? //加載套接字庫

???????? WORD wVisionRequested;//保存WinSock庫的版本

???????? WSADATA wsaData;

???????? int err;

????????

???????? wVisionRequested = MAKEWORD(1,1);//請求版本號的WORD值

????????

???????? err = WSAStartup(wVisionRequested,&wsaData);//加載套接字庫

????????

???????? if (err != 0)//如果返回值不為0 ,則直接退出

???????? {

?????????????????? return;

???????? }

????????

???????? if (LOBYTE(wsaData.wVersion) != 1||HIBYTE(wsaData.wVersion != 1))//驗證版本號

???????? {

?????????????????? WSACleanup();

?????????????????? return;

???????? }

????????

???????? //創(chuàng)建套接字,并且將套接字綁定到本機地址和端口上

???????? SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);

???????? SOCKADDR_IN addrSrv;

???????? addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

???????? addrSrv.sin_family = AF_INET;

???????? addrSrv.sin_port = htons(6000);

????????

???????? // 綁定套接字???????

???????? bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

????????

???????? char recvBuf[100];

???????? char sendBuf[100];

???????? char tempBuf[200];

????????

???????? SOCKADDR_IN addrClient;

???????? int len = sizeof(SOCKADDR);

????????

???????? while (1)

???????? {

?????????????????? //等待并且接收數(shù)據(jù)

?????????????????? recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);

?????????????????? if ('q' == recvBuf[0])

?????????????????? {

??????????????????????????? sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);

??????????????????????????? printf("Chat end!\n");

??????????????????????????? break;

?????????????????? }

?????????????????? sprintf(tempBuf,"%s say : %s",inet_ntoa(addrClient.sin_addr),recvBuf);

?????????????????? printf("%s\n",tempBuf);

?????????????????? //發(fā)送數(shù)據(jù)

?????????????????? printf("Please input data : \n");

?????????????????? gets(sendBuf);

?????????????????? sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);

???????? }

???????? closesocket(sockSrv);

???????? WSACleanup();

}

//NetClient.cpp

#include <Winsock2.h>

#include <Stdio.h>

?

void main()

{

???????? //加載套接字庫

???????? WORD wVisionRequested;//保存WinSock庫的版本

???????? WSADATA wsaData;

???????? int err;

????????

???????? wVisionRequested = MAKEWORD(1,1);//請求版本號的WORD值

????????

???????? err = WSAStartup(wVisionRequested,&wsaData);//加載套接字庫

????????

???????? if (err != 0)//如果返回值不為0 ,則直接退出

???????? {

?????????????????? return;

???????? }

????????

???????? if (LOBYTE(wsaData.wVersion) != 1||HIBYTE(wsaData.wVersion != 1))//驗證版本號

???????? {

?????????????????? WSACleanup();

?????????????????? return;

???????? }

????????

//創(chuàng)建套接字,并且將套接字綁定到本機地址和端口上

???????? SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);

???????? SOCKADDR_IN addrSrv;

???????? addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

???????? addrSrv.sin_family = AF_INET;

???????? addrSrv.sin_port = htons(6000);

????????

???????? // 綁定套接字???????

???????? bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

????????

???????? char recvBuf[100];

???????? char sendBuf[100];

???????? char tempBuf[200];

?

???????? int len = sizeof(SOCKADDR);

????????

???????? while (1)

???????? {

//發(fā)送數(shù)據(jù)

?????????????????? printf("Please Input Data : \n");

?????????????????? gets(sendBuf);

?????????????????? sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);

?

//等待并且接收數(shù)據(jù)

?????????????????? recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len);

?????????????????? if ('q' == recvBuf[0])

?????????????????? {

??????????????????????????? sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrSrv,len);

??????????????????????????? printf("Chat end!\n");

??????????????????????????? break;

?????????????????? }

?????????????????? sprintf(tempBuf,"%s say : %s",inet_ntoa(addrSrv.sin_addr),recvBuf);

?????????????????? printf("%s\n",tempBuf);

???????? }

???????? closesocket(sockSrv);

???????? WSACleanup();

}

運行結果:

?

多線程

程序、進程、線程

程序:計算機指令的集合,是一文件的形式存儲在磁盤上面的;

進程:一個正在運行的程序的實例,是一個程序在其自身地址空間的一次執(zhí)行活動;

線程:真正完成代碼的執(zhí)行;線程只有一個內(nèi)核對象和一個線程棧,占用內(nèi)存少;

所以說一個程序對應多個進程;進程是線程的容器;進程是線程的執(zhí)行環(huán)境;

?

線程創(chuàng)建函數(shù)Create? Thread

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes,

DWORD dwStackSize,

LPTHREAD_START_ROUTINE lpStartAddress,

LPVOID lpParameter,

DWORD dwCreationFlags,

LPDWORD lpThreadId);

?

舉例

舉例1:簡單

#include <WINDOWS.H>//需要訪問windows API 函數(shù),因此許加入此頭文件

#include <IOSTREAM.H>

?

DWORD WINAPI Fun1Pro(LPVOID lpParameter);

?

void main()//主線程

{

???????? HANDLE hThread1;

???????? hThread1 = CreateThread(NULL,0,Fun1Pro,NULL,0,NULL);

???????? CloseHandle(hThread1);//這里并不是終止新創(chuàng)建的線程,而是不再需要線程句柄

???????? cout<<"Main thread is running..."<<endl;

}

?

DWORD WINAPI Fun1Pro(LPVOID lpParameter)

{

???????? cout<<"Thread1 is running..."<<endl;

???????? return 0;

}

錯誤8

?

代碼

//MultiThread.cpp

#include <WINDOWS.H>//需要訪問windows API 函數(shù),因此許加入此頭文件

#include <IOSTREAM.H>

?

DWORD WINAPI Fun1Pro(LPVOID lpParameter);

int nIndex = 0;

void main()//主線程

{

???????? HANDLE hThread1;

???????? hThread1 = CreateThread(NULL,0,Fun1Pro,NULL,0,NULL);

???????? CloseHandle(hThread1);//這里并不是終止新創(chuàng)建的線程,而是不再需要線程句柄

?//?? ????? Sleep(10);???????? //讓主線程睡眠10ms,睡眠期間好讓線程1執(zhí)行

???????? while (nIndex++<1000)

???????? cout<<"Main thread is running..."<<endl;

}

?

DWORD WINAPI Fun1Pro(LPVOID lpParameter)

{

???????? while (nIndex++<1000) //驗證線程是交替運行的,運用的是時間片技術

???????? cout<<"Thread1 is running..."<<endl;

// ??? int i = 0;

// ??? while (++i)//計算計算機的運行效率

// ??? {

// ???????????? cout<<i<<".Thread1 is running..."<<endl;???????

// ??? }

???????? return 0;

}

舉例2:火車票

代碼:

#include <WINDOWS.H>//需要訪問windows API 函數(shù),因此許加入此頭文件

#include <IOSTREAM.H>

?

DWORD WINAPI Fun1Pro(LPVOID lpParameter);

DWORD WINAPI Fun2Pro(LPVOID lpParameter);

?

int nIndex = 0;

int nTickets = 100;

?

void main()//主線程

{

???????? HANDLE hThread1;

???????? HANDLE hThread2;

???????? hThread1 = CreateThread(NULL,0,Fun1Pro,NULL,0,NULL);

???????? hThread2 = CreateThread(NULL,0,Fun2Pro,NULL,0,NULL);

???????? CloseHandle(hThread1);

???????? CloseHandle(hThread2);

???????? Sleep(4000);

}

?

DWORD WINAPI Fun1Pro(LPVOID lpParameter)

{

???????? while (TRUE)

???????? {

?????????????????? if (nTickets>0)

??????????????????????????? cout<<"Thread1 sells tickets : "<<nTickets--<<endl;

?????????????????? else

??????????????????????????? break;

???????? }

???????? return 0;

}

?

DWORD WINAPI Fun2Pro(LPVOID lpParameter)

{

???????? while (TRUE)

???????? {

?????????????????? if (nTickets>0)

??????????????????????????? cout<<"Thread2 sells tickets : "<<nTickets--<<endl;

?????????????????? else

??????????????????????????? break;

???????? }

???????? return 0;

}

錯誤9

?

利用互斥對象實現(xiàn)線程同步(采用匿名互斥對象的方法)

1、? 首先定義全局互斥對象,我叫公共房間的鑰匙

2、? 創(chuàng)建互斥對象 將鑰匙放在房間門上

3、? 在子線程當中添加主動請求信號函數(shù),拿到鑰匙進入房間

4、? 在子線程當中釋放互斥對象,走出房間,將鑰匙歸位

5、? 值得注意的是,對于互斥對象:誰擁有誰釋放

1、? HANDLE hMutex;

2、? hMutex = CreateMutex(NULL,FALSE,NULL);//創(chuàng)建匿名互斥對象

3、? WaitForSingleObject(hMutex,INFINITE);

4、? ReleaseMutex(hMutex);

CreateMutex

?

ReleaseMutex

此函數(shù)在調(diào)用之前會先判斷該線程ID與當前擁有互斥對象的線程ID是否一致,一致就釋放。

?

WaitForSingleObject

? ?

保證應用程序只有一個實例運行(采用命名互斥對象的方法)

hMutex = CreateMutex(NULL,TRUE,"tickets");

???????? if (hMutex)

???????? {

?????????????????? if (ERROR_ALREADY_EXISTS == GetLastError())

?????????????????? {

??????????????????????????? cout<<"Only one thread can run..."<<endl;

??????????????????????????? return;

?????????????????? }

???????? }

???????? WaitForSingleObject(hMutex,INFINITE);

??????? ReleaseMutex(hMutex);

???????? ReleaseMutex(hMutex);

網(wǎng)絡聊天室程序

MFC加載套接字庫AfxSocketInit()

所有與窗口有關的類都有一個數(shù)據(jù)成員m_hWnd

完全面向對象采用靜態(tài)成員函數(shù)和靜態(tài)成員變量

?

?

線程同步的另外兩種方法

事件對象

?

CreateEvent()創(chuàng)建事件對象

?

SetEvent()設置對象狀態(tài)

?

ResetEvent()重置對象

?

錯誤9

?

關鍵代碼段

?

?

1、InitiaLizeCriticalSection()創(chuàng)建關鍵代碼段

?

?

2、Enter CriticalSection()

3、Leave CriticalSection()

4、Delete CriticalSection()

互斥對象、事件對象、關鍵代碼段的比較

?

?

基于消息的異步套接字

Windows套接字在兩種模式上面執(zhí)行I/O操作:阻塞模式和非阻塞模式

阻塞模式和非阻塞模式的區(qū)別

?

Windows Sock相關函數(shù)

WSAAsyncselect()

?

?

WSAEnumProtocols()

?

WSAStartup()

?

?

WSACleanup()

?

WSASocket()

?

WSARecvFrom()

? ? ? ? ?

WSASendTo()

?

?

進程間通信

剪切板

OpenClipboard打開剪切板

EmptyClipboard清空

SetClipboradData放置數(shù)據(jù)

GlobalAlloc

?

GetClipboardData

?

匿名管道

?

CreatePipe

?

CreatProcess

?

創(chuàng)建子進程的注意事項

?

?

?

命名管道

不僅可以在本機上的實現(xiàn)兩個進程之間的通信,還可以跨網(wǎng)絡實現(xiàn)兩個進程之間的通信;

創(chuàng)建命名管道時可以指定使用權限的用戶;

命名管道是圍繞Windows文件系統(tǒng)設計的一種機制,采用“命名管道文件系統(tǒng)(NPFS)”接口;

它實際上建立了一個客戶機/服務器通信系統(tǒng);

它只能在Windows NT或Windows 2000上創(chuàng)建;

他提供了兩種基本通信模式:字節(jié)模式和消息模式;

CreateNamedPipe

?

Connect

ConnectNamedPipe()

?

CreateFile()

?

WaitNamedPipe()

?

油槽

她是基于廣播通信體系設計出來的,它采用無連接的不可靠的數(shù)據(jù)傳輸;

一對多的單項通信;可以基于此制作一個網(wǎng)絡會議通知系統(tǒng);

油槽實現(xiàn)代碼非常簡單,而采用SOCKET編程則相比之下太復雜;??????

它是一種單項通信機制,創(chuàng)建油槽的服務器進程讀取數(shù)據(jù),打開油槽的客戶機進程寫入數(shù)據(jù);

CreateMailslot()

?

四種方式比較

?

AcitiveX控件

它相當于一個服務器應用程序,它依賴某個容器應用程序;

?

ActiveX控件四種屬性

?

發(fā)行版本

?

總結

?

動態(tài)鏈接庫

?

動態(tài)庫和靜態(tài)庫

?

兩種加載動態(tài)鏈接庫的方式

隱式鏈接

動態(tài)加載

?

Dumpbin命令查看Dll文件

?

讓Dll導出函數(shù)

?

錯誤10

?

?

搜索動態(tài)鏈接庫的目錄順序

?

Depends工具? 查看動態(tài)鏈接庫和可執(zhí)行程序,主要是查看他依賴哪些動態(tài)鏈接庫

?

動態(tài)庫的創(chuàng)建并且導出函數(shù)

//dlll.h

_declspec(dllexport) int add(int a,int b)

{

???????? return a+b;

}

?

_declspec(dllexport) int subtract(int a,int b)

{

???????? return a-b;

}

//Dlll.h

_declspec(dllimport) int add(int a,int b);

_declspec(dllimport) int subtract(int a,int b);

#include "..\Dlll\Dlll.h"//使用動態(tài)庫

動態(tài)庫的改造,使其能夠被客戶端和自己本省都能夠使用

#ifdef DLLL_API

#else

#define DLLL_API _declspec(dllimport)

#endif

DLLL_API int add(int a,int b);

DLLL_API int subtract(int a,int b);

?

#define DLLL_API _declspec(dllexport)

#include "Dlll.h"

int add(int a,int b)

{

???????? return a+b;

}

int subtract(int a,int b)

{

???????? return a-b;

}

?

從Dll中導出C++類

動態(tài)庫函數(shù)名字改編問題

?

名字沒有改編

動態(tài)加載動態(tài)庫LoadLibrary()

?

void CDllTestDlg::OnBtnAdd()

{

???????? // TODO: Add your control notification handler code here

???????? HINSTANCE hInst;//定義一個實例句柄對象

???????? hInst = LoadLibrary("Dlll.dll");//動態(tài)加載動態(tài)庫

???????? typedef int (*ADDPROC)(int a,int b);//定義函數(shù)指針類型

???????? ADDPROC Add = (ADDPROC)GetProcAddress(hInst,"add");//獲取dll的函數(shù)地址

???????? if (!Add)

???????? {

?????????????????? MessageBox("獲取函數(shù)地址失敗");

?????????????????? return;

???????? }

?

???????? CString str;

???????? str.Format("5+3=%d",Add(5,3));

???????? MessageBox(str);

}

?

void CDllTestDlg::OnBtnSub()

{

???????? // TODO: Add your control notification handler code here

???????? HINSTANCE hInst;//定義一個實例句柄對象

???????? hInst = LoadLibrary("Dlll.dll");//動態(tài)加載動態(tài)庫

???????? typedef int (*ADDPROC)(int a,int b);//定義函數(shù)指針類型

???????? ADDPROC Sub = (ADDPROC)GetProcAddress(hInst,"subtract");//獲取dll的函數(shù)地址

???????? if (!Sub)

???????? {

?????????????????? MessageBox("獲取函數(shù)地址失敗");

?????????????????? return;

???????? }

?

???????? CString str;

???????? str.Format("5-3=%d",Sub(5,3));

???????? MessageBox(str);

}

?

?

/************************************************************************/

/*? 該dll文件自己是不能夠運行的,必須要有某個客戶程序加載這個dll,然后調(diào)用

SetHook函數(shù),調(diào)用SetWindowsHookEx函數(shù),安裝鉤子,這樣就可以加載全局鉤子了*/

/************************************************************************/

?

#include <WINDOWS.H>

?

/*_declspec(dllexport) void SetHook();*/

?

HHOOK g_hMouse = NULL;

//鼠標鉤子過程

LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)

{

???????? return 1;//返回非0值表示鼠標消息已經(jīng)處理了

}

//鼠標鉤子安裝

void SetHook()

{

???????? g_hMouse = SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("HOOK"),0);

???????? //第四個參數(shù)為0,表示與運行在同一桌面所有進程相關

???????? //第三個參數(shù)指定安裝鉤子過程所在的Dll模塊句柄,返回給HOOk.dll

}

?

?

轉載于:https://www.cnblogs.com/chensifan/archive/2012/08/28/2659766.html

總結

以上是生活随笔為你收集整理的VC++笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

精品国产一区二区在线 | 韩国av三级 | 久久精品美女视频 | 亚洲黄色一级视频 | 91成人久久 | 一区二区三区精品久久久 | 麻豆成人小视频 | 中文字幕亚洲综合久久五月天色无吗'' | 国产精品精品久久久久久 | 国产精品一区二区三区在线 | 国产成人一区二区三区久久精品 | 美女福利视频在线 | 亚洲无吗av | 国产午夜一级毛片 | 免费韩国av | 九色自拍视频 | 天天曰| 成人国产精品av | 日日干干夜夜 | 超碰在线日韩 | 中文字幕在线国产 | 伊人首页| 午夜视频免费播放 | 国精产品999国精产品视频 | 午夜精品视频一区 | 一区二区三区视频 | 精品国产一区二区三区日日嗨 | 欧美一级片 | 天天色宗合 | 久久99热这里只有精品 | 久久久久五月天 | 国产精品亚洲片在线播放 | 国产成人一二片 | 久久久一本精品99久久精品66 | 国产免费观看高清完整版 | 久操久| 欧美精品久久久久久久 | 天天爽夜夜爽人人爽一区二区 | 天天操夜夜操国产精品 | 人人看人人草 | 欧美精品久久久久久久 | 一区二区免费不卡在线 | 精品国产乱码一区二区三区在线 | 欧美精品一区在线 | 日韩精品专区在线影院重磅 | av在线播放中文字幕 | 欧美久久久久久久久久久久 | 免费高清在线一区 | 99九九热只有国产精品 | 一区二区三区免费在线观看视频 | 狠狠色丁香婷婷综合久久片 | 国产天天爽 | 国内精品小视频 | 精品国产激情 | 日韩高清国产精品 | 看v片 | 亚洲精品乱码久久久一二三 | 亚洲女人av | 国产不卡免费 | 在线观看韩国av | 久久精品4| 91丨九色丨蝌蚪丰满 | 麻豆久久 | 久久露脸国产精品 | 狠狠狠色丁香婷婷综合久久五月 | 国产精品av在线 | www.久草.com | 日韩国产精品一区 | 96超碰在线| 丁香免费视频 | 日日草av | 亚洲视频 中文字幕 | 免费视频久久久久 | 国产一区黄色 | 国产无套一区二区三区久久 | 中文字幕不卡在线88 | 国产精品视频专区 | 在线日韩中文 | 999国内精品永久免费视频 | 黄在线免费看 | 91影视成人 | 91人人澡人人爽 | 日本久久久久久科技有限公司 | 久久久久久久久精 | 久久九九精品 | 色中文字幕在线观看 | 摸bbb搡bbb搡bbbb | 在线导航av| 青青啪 | 久久中文精品视频 | 91精品导航 | 91精品在线播放 | 久久视频精品在线观看 | 91精品国产91久久久久福利 | 黄色成品视频 | 经典三级一区 | 久久综合给合久久狠狠色 | 亚洲国产精久久久久久久 | 久久精品一区二区三 | 99这里只有久久精品视频 | 国产高清在线免费观看 | 久久五月婷婷丁香社区 | 中文字幕精品一区久久久久 | av软件在线观看 | 在线一区二区三区 | 中文字幕资源在线观看 | 国产91电影在线观看 | 亚洲成人精品 | 午夜视频免费在线观看 | 亚洲视频网站在线观看 | 午夜精品一区二区国产 | 中文字幕在线观看网址 | 91在线在线观看 | 在线免费观看黄网站 | 最新国产在线观看 | 国产群p | wwwwww国产| 亚洲自拍av在线 | 91香蕉久久| 一级做a视频 | 日韩视频在线观看免费 | 日本久久免费电影 | 久热电影| av再线观看 | 亚洲男人天堂a | 久久久久久综合网天天 | 三级av在线 | 免费av网址在线观看 | 免费久久精品视频 | 免费视频黄色 | 久久免费看a级毛毛片 | 久久一区国产 | 中文 一区二区 | 免费在线黄网 | 色婷婷亚洲婷婷 | 黄色tv视频 | 日韩欧美精品在线观看视频 | 精品极品在线 | 国产亚洲精品久久网站 | 国产一级黄色av | 国产中文字幕一区二区 | 看av免费 | 99精品在线播放 | 午夜视频久久久 | 欧美日韩不卡在线视频 | 色九九影院 | 久久五月情影视 | 中文字幕在线免费播放 | 97夜夜澡人人双人人人喊 | 69久久夜色精品国产69 | 97色se | 国产精品自产拍在线观看 | 香蕉免费在线 | 欧美日韩一二三四区 | 日韩欧美在线影院 | 免费观看久久久 | 日本爱爱免费视频 | 欧美激情综合五月色丁香 | 亚洲精品欧美视频 | 亚洲在线免费视频 | 91精品国产自产老师啪 | 一区三区视频在线观看 | 国产高清99 | 亚洲无吗天堂 | 国产不卡在线看 | 国产做aⅴ在线视频播放 | 在线视频91 | 国产黄色网 | 日韩亚洲欧美中文字幕 | 在线视频精品播放 | 91麻豆精品国产91久久久久 | a在线v| 国产精品一区久久久久 | 爱爱av网| 久久情侣偷拍 | 中午字幕在线 | 国产人成看黄久久久久久久久 | 一区二区精品在线观看 | 手机看片国产日韩 | 丁香婷婷综合激情 | 午夜av在线 | 在线视频99 | 91久久国产综合精品女同国语 | 久久综合久久鬼 | 国产又黄又爽又猛视频日本 | av成人亚洲 | 日本久久91 | 久久五月婷婷综合 | 亚洲伊人网在线观看 | 啪啪动态视频 | 黄色国产在线观看 | 国产精品99久久久久久小说 | 国产成人333kkk | 99在线精品视频在线观看 | 久久不卡av | 婷婷伊人五月天 | 久久亚洲专区 | 国产成人免费观看久久久 | 免费在线观看日韩欧美 | 日韩精品免费在线观看 | 一区二区三区四区免费视频 | 麻豆国产网站 | 国产一级大片在线观看 | 中文字幕国产一区二区 | 四虎在线观看 | 国产精品日韩久久久久 | 欧美激情综合五月 | 五月天色婷婷丁香 | 狠狠干狠狠艹 | 亚洲精品国产精品国自产观看浪潮 | 久久免费av电影 | 免费精品国产va自在自线 | 亚洲综合视频在线播放 | 欧美日韩中字 | 国产精品门事件 | 天天操天天干天天爽 | 亚洲午夜精品一区 | 日韩在线视频看看 | 99热99热| 国产精品久久综合 | 国产免费亚洲 | 色中文字幕在线观看 | 人人射网站 | 日韩视频中文字幕在线观看 | 91精品国产99久久久久久久 | 久久久久久久久久久精 | 中文有码在线 | 草久久精品 | 天天曰天天曰 | 中文字幕av免费在线观看 | 九草在线观看 | 亚洲第一伊人 | 国产福利在线免费观看 | 久久超碰在线 | 在线观看国产日韩 | 丝袜足交在线 | 亚洲乱亚洲乱亚洲 | 在线观看视频三级 | 在线观看免费国产小视频 | 欧美专区国产专区 | 91精品国自产在线观看欧美 | 字幕网在线观看 | 国产精品毛片一区二区在线看 | 午夜在线观看 | 国产在线不卡精品 | 超碰免费久久 | 国产在线播放一区二区 | 国产成人精品一区二区三区在线 | 激情五月婷婷综合 | 久久99精品久久久久久三级 | www.狠狠操.com | 亚洲精品国久久99热 | 久久深爱网 | 国产精品久久久久久五月尺 | 麻豆传媒精品 | av一本久道久久波多野结衣 | 天天操婷婷 | 五月婷婷综合激情网 | 欧美91精品久久久久国产性生爱 | 免费欧美| 91看毛片| 亚洲女欲精品久久久久久久18 | 久久免费中文视频 | 午夜久久电影网 | 制服丝袜一区二区 | 久久久精品久久日韩一区综合 | 成人天堂网 | 深夜激情影院 | 国产91精品看黄网站在线观看动漫 | 色 免费观看 | 久久久国产精华液 | 成人av免费在线看 | 亚洲影视九九影院在线观看 | 豆豆色资源网xfplay | 99热九九这里只有精品10 | 久久免费视频在线观看30 | 久久久久久久久久久综合 | 99re8这里有精品热视频免费 | 久草在线免费在线观看 | 国产中文字幕视频在线 | 三级黄色片子 | 五月婷婷久草 | 久久国产午夜精品理论片最新版本 | 久久天天综合网 | 国产乱对白刺激视频在线观看女王 | 丁香婷婷色综合亚洲电影 | 久久国产一区二区三区 | 精品国产一区二区三区av性色 | 日韩日韩日韩日韩 | 狠狠色丁香婷婷综合基地 | 成人丁香花 | 欧美日韩中文字幕综合视频 | 中文字幕久久精品 | 69国产成人综合久久精品欧美 | 看国产黄色大片 | 久久久久久久久久久久久9999 | 久久99这里只有精品 | 视频福利在线观看 | 国产精品久久久久毛片大屁完整版 | 伊人影院在线观看 | 97成人免费| 天堂av免费在线 | 五月婷婷一区 | 免费在线播放av电影 | 久久久久久久久久久久电影 | 国产精品 国内视频 | 国产老熟 | 97品白浆高清久久久久久 | www.超碰| 亚洲男男gaygay无套 | 欧美精品在线视频 | 欧美日韩免费一区二区 | 国产精品午夜在线观看 | 欧美影院久久 | 可以免费观看的av片 | 久久婷婷激情 | 欧美日韩高清 | 亚洲二区精品 | 日韩欧美国产精品 | 午夜视频不卡 | 热re99久久精品国产66热 | 91精品国产成人观看 | 激情欧美一区二区三区免费看 | 欧美一二三区在线观看 | 婷婷丁香花五月天 | 一区二区三区手机在线观看 | 国产精品资源在线 | 在线播放av网址 | 中文字幕丝袜制服 | 综合网天天色 | 色婷久久 | 夜夜躁日日躁 | www.天天操.com| 国产亚洲视频中文字幕视频 | 国产二区视频在线 | 丝袜美腿亚洲 | 亚洲国产日韩欧美 | 欧美激情xxxx | 久久婷婷一区二区三区 | 亚洲一片黄 | 午夜美女wwww| 欧美日本高清视频 | 成人小视频在线观看免费 | 久久精品美女视频网站 | 亚洲精品免费在线观看视频 | 国产高清视频色在线www | 久久国产精品视频免费看 | 在线观看日本韩国电影 | 亚洲激情综合 | 欧美中文字幕久久 | 在线免费观看一区二区三区 | 久久69精品久久久久久久电影好 | 精品国产激情 | 欧美日韩性视频 | 国产精品一区二区三区免费看 | 成人亚洲免费 | 日韩av中文 | 91精品网站在线观看 | 亚洲欧美日韩一区二区三区在线观看 | 久久久久在线 | 999男人的天堂| 国产毛片aaa | 久久这里只有精品视频99 | 青青草国产免费 | 亚洲一区 影院 | 久久国产精品久久精品 | 欧美日韩国内在线 | 青青河边草观看完整版高清 | 国产精品黄色av | 91色九色 | 日韩av男人的天堂 | 欧美日韩国产一二三区 | 一区二区不卡在线观看 | av不卡中文字幕 | 999视频网站 | 成人影视免费看 | 日韩中文字幕国产 | 国内视频一区二区 | 免费福利片2019潦草影视午夜 | 色综合婷婷久久 | 成人午夜剧场在线观看 | 亚洲成人免费观看 | 91麻豆精品国产91久久久更新时间 | 国产成人久久av977小说 | 久久新 | 亚洲精品乱码久久久久久蜜桃动漫 | 日韩成人黄色 | 日本精a在线观看 | 久草资源在线 | 久久6精品| 99国产精品一区 | 视频在线日韩 | 久热久草在线 | 国产伦精品一区二区三区无广告 | 99久久精品国产观看 | 日韩av不卡在线 | 一区二区三区中文字幕在线 | 免费视频xnxx com | 久久公开免费视频 | 国产一区高清在线观看 | 国产黄视频在线观看 | 激情综合色图 | 亚洲乱码在线观看 | 91av在线不卡 | 久精品在线观看 | 亚洲欧洲精品视频 | 亚洲极色| 免费激情在线电影 | 91色蜜桃| 成人aⅴ视频 | 黄色av电影 | 人人爽夜夜爽 | 99re久久资源最新地址 | 成人三级网站在线观看 | 成人欧美一区二区三区黑人麻豆 | 人人爽人人舔 | 国产精品白虎 | 最新91在线视频 | 热久久国产精品 | 中文字幕在线观看视频一区二区三区 | 久草视频2| 久久久久久久久久久久久久电影 | 亚洲最大免费成人网 | 国产成人91| 国产美女精品视频免费观看 | 亚洲资源在线 | 日韩免费不卡av | 欧美日韩三级在线观看 | 亚洲综合一区二区精品导航 | 日韩精品视频在线观看免费 | 欧美aaaxxxx做受视频 | 在线免费91 | 国内少妇自拍视频一区 | 亚洲性xxxx| 91视频首页 | 伊人国产在线观看 | 69性欧美 | 欧美精品免费一区二区 | 精品久久久久久综合 | 黄色av播放| 国产一区二区三区免费观看视频 | 欧美日韩久久 | 日韩簧片在线观看 | 午夜电影一区 | 亚洲精品国产精品国产 | 人人看人人 | 欧美成人在线免费 | 97人人模人人爽人人喊中文字 | 狠狠干狠狠久久 | 久久午夜色播影院免费高清 | 成人在线观看av | 国产精品久久久久久久久久免费 | 欧美va在线观看 | 久久91网| 成年人视频在线免费 | 亚洲在线日韩 | 中文字幕在线观看视频网站 | 国产特级毛片aaaaaa | 在线观看视频黄色 | 国产亚洲综合在线 | 在线97| 狠狠干2018| 久久99国产精品自在自在app | 午夜精品99久久免费 | 高清国产午夜精品久久久久久 | 日韩成人免费观看 | 国产精品wwwwww | 亚洲一区二区视频在线播放 | 99久久婷婷国产精品综合 | 天天干 夜夜操 | 国产精品美女www爽爽爽视频 | 麻豆免费精品视频 | 成人午夜剧场在线观看 | 91新人在线观看 | 久久中文欧美 | 中文字幕日韩国产 | 99精品视频在线免费观看 | 娇妻呻吟一区二区三区 | 国产在线观看不卡 | 成人动图| 91九色综合| 免费 在线 中文 日本 | 亚洲国产99 | av在线日韩| 特级aaa毛片 | 婷婷久久综合九色综合 | 深爱婷婷久久综合 | 91丨九色丨蝌蚪丨老版 | 国产精品成人自产拍在线观看 | 亚洲日本一区二区在线 | 婷婷色在线播放 | 精品国产免费一区二区三区五区 | 麻豆视频免费网站 | 国产黄色特级片 | 国产一区电影在线观看 | 欧美性性网 | 国产九色视频在线观看 | 天天曰| 欧美少妇18p| 人人干免费 | 天天在线视频色 | 丁香花在线观看视频在线 | 国产成人av一区二区三区在线观看 | 国产精品永久免费 | 婷婷av色综合 | 国产精品资源 | 久久久久免费精品国产小说色大师 | 日韩激情在线视频 | av资源网在线播放 | 高清久久久久久 | 国产精品99页 | 亚洲涩涩涩涩涩涩 | 亚洲va欧美 | 在线a人片免费观看视频 | 人人插超碰| www在线观看视频 | av爱干| 日韩精品欧美视频 | 久久99久久99精品免观看粉嫩 | 国产精品欧美久久久久三级 | 色香蕉在线视频 | 国产精品一区二区久久久 | 久久中文精品视频 | www黄色软件 | 久草在线免 | 日韩av不卡在线播放 | 久久久久五月 | 一级免费看 | 在线观看深夜福利 | 天天干天天草 | 国产在线观看免费 | 中文字幕亚洲高清 | 亚洲综合黄色 | 夜夜嗨av色一区二区不卡 | 亚洲婷婷丁香 | 国产精品久99 | 国产aaa免费视频 | 黄毛片在线观看 | 亚洲黄色免费观看 | 久久精品视频在线播放 | 亚洲精品97 | 精品国产伦一区二区三区观看体验 | 亚洲男人天堂a | 亚洲成人精品av | 国产精品网站 | 福利视频一区二区 | 最新真实国产在线视频 | 国产中文在线字幕 | 国产精品密入口果冻 | 九九色网 | 又长又大又黑又粗欧美 | 亚洲国产婷婷 | 国产精选在线 | 欧美视频国产视频 | 狠狠色免费 | 国产精品国产亚洲精品看不卡15 | 久久成人福利 | 在线看的毛片 | 在线视频 亚洲 | 美女黄频视频大全 | 国产精品美女久久久久久2018 | 精品在线观看一区二区三区 | 人人插超碰 | 在线有码中文字幕 | 99精品视频中文字幕 | 久爱综合 | 五月婷婷在线观看视频 | 亚洲 欧美 成人 | 久久久黄视频 | av免费观看高清 | 在线综合色 | 亚洲人av免费网站 | 国产糖心vlog在线观看 | 99国产一区二区三精品乱码 | 成人久久18免费 | 97精产国品一二三产区在线 | 久久久久久久国产精品影院 | av久久久久久| 久久线视频 | 天堂在线成人 | 啪啪精品| 国产精品 日韩 | 欧美另类xxx | 久久影院精品 | 美国三级黄色大片 | 香蕉精品视频在线观看 | 丁香视频免费观看 | 中文字幕精品www乱入免费视频 | 在线观看日韩 | 日日夜夜精品视频天天综合网 | 久久精品这里热有精品 | 91热精品| 亚洲免费不卡 | 99av国产精品欲麻豆 | 亚洲人成在线观看 | 在线视频日韩精品 | 三级黄色a | 五月激情丁香婷婷 | 欧美在线日韩在线 | 波多野结衣电影一区二区三区 | 亚洲成a人片在线www | 伊人五月天av | 国产亚洲日本 | 久久狠狠一本精品综合网 | 免费高清在线视频一区· | 久久久久国产成人免费精品免费 | 欧美一二三在线 | 黄色亚洲 | 国产精品乱码一区二三区 | 成人观看 | 亚洲aaa毛片 | 国产精品成人久久久久久久 | 国产在线久久久 | 中文字幕在线播放av | 国产精品久久久久永久免费观看 | 亚洲电影成人 | 深爱婷婷激情 | 五月激情综合婷婷 | 久久精品—区二区三区 | 色婷婷狠狠18 | 久久精品一二三区白丝高潮 | av大片免费 | 黄色精品免费 | www91在线观看 | 久香蕉 | 手机av在线网站 | 久草精品在线播放 | 久久人人97超碰国产公开结果 | 欧美性生活小视频 | 怡红院久久 | 黄色免费观看网址 | 中文字幕日韩精品有码视频 | 成人国产一区二区 | 国产日韩一区在线 | 国产精品一区二区62 | 激情婷婷在线观看 | 国产成人免费在线观看 | 日日干天天插 | 91在线免费公开视频 | 国产精品久久久久久一二三四五 | 高清av中文在线字幕观看1 | 亚洲成人免费在线观看 | 欧美一级视频一区 | 18国产精品福利片久久婷 | 国产淫片| 欧美伦理一区二区三区 | 黄色av成人在线观看 | 久久精品久久精品 | 国产黄色高清 | 免费在线观看91 | 九九热中文字幕 | 黄色片毛片 | 国产精品免费一区二区 | 免费精品| 99热在线国产精品 | 日产中文字幕 | 国产精品一区二区在线观看免费 | 黄色免费在线视频 | 亚洲电影久久 | 91成人午夜 | 国产1区2区| 又色又爽的网站 | 日本精品视频免费 | 日韩,精品电影 | www.狠狠操 | www国产亚洲精品久久网站 | 深夜免费小视频 | 日韩av男人的天堂 | 99中文字幕视频 | 日韩一区二区免费在线观看 | 国产精品999久久久 久产久精国产品 | 久久一区二区免费视频 | 色黄www小说 | 久久久久一区二区三区四区 | 亚洲一区二区精品 | av天天草| 国产理伦在线 | 久草精品资源 | 中文字幕在线一二 | 最近久乱中文字幕 | 丝袜美腿亚洲综合 | 99精彩视频在线观看免费 | 亚洲码国产日韩欧美高潮在线播放 | 激情xxxx| 天天操天天射天天 | 狠狠躁夜夜躁人人爽视频 | 午夜精品一区二区三区视频免费看 | 成人免费视频视频在线观看 免费 | 久久66热这里只有精品 | 色综合久久久久久久 | 免费看亚洲毛片 | 天天操网 | 天天色天天干天天色 | 日韩综合第一页 | 丰满少妇在线观看网站 | 西西www4444大胆在线 | 99精品亚洲 | 人人狠狠综合久久亚洲婷 | 99色人 | 日本在线中文在线 | 欧美日韩国产一区二区在线观看 | 成年人在线免费看片 | 天天干天天操天天入 | www.夜夜爱| 午夜少妇 | 天天翘av| 成人国产精品入口 | 久久久精品 | 人人爽人人 | 午夜精品久久久久久久久久久久久久 | 成人性生交大片免费看中文网站 | 男女免费av | 欧美一级性 | 99视频网站| 久久婷婷精品视频 | 日韩一区视频在线 | 久久久久久久国产精品影院 | 国产黄色大片免费看 | 国产小视频国产精品 | 久久深夜| 国产一区二区在线看 | av在线网站大全 | 久草国产在线观看 | 天天操网址 | 天天操天天爱天天干 | 国产成人免费观看久久久 | 91九色在线视频 | 色多多污污 | 麻豆精品国产传媒 | 国产丝袜美腿在线 | 456免费视频 | 亚洲专区在线视频 | 天天操综合 | 久久综合成人网 | 九九九九九精品 | 国内精品视频一区二区三区八戒 | 国产一区黄色 | 国产精品video爽爽爽爽 | 精品国产成人 | 最近中文字幕国语免费高清6 | 999久久久精品视频 日韩高清www | 在线观看av中文字幕 | 91精品国产电影 | 日韩欧美视频在线免费观看 | 久久99精品久久久久久久久久久久 | 亚洲伦理电影在线 | 日韩av电影手机在线观看 | 91福利国产在线观看 | 在线中文字母电影观看 | 97精品一区 | 81国产精品久久久久久久久久 | 欧美另类v | 69人人| 久久精品视频99 | 日日操日日插 | 一区二区三区四区五区在线视频 | 国产精品毛片完整版 | 日韩影视在线观看 | 久久精品一二区 | 女人高潮一级片 | 成x99人av在线www | 国产免费高清视频 | 91在线视频在线 | 亚洲精品在线免费观看视频 | 亚洲国产精品日韩 | 在线免费黄色av | 精品视频免费观看 | 一级性av | 免费看片亚洲 | 2022中文字幕在线观看 | 超碰免费观看 | 五月天网页 | 天天色天天干天天 | 麻豆视频91 | 精品国产伦一区二区三区观看方式 | 国产又粗又长的视频 | 在线免费观看羞羞视频 | 国产视频每日更新 | 最新日韩在线观看视频 | 免费看一级 | 精品久久久99| 免费久久视频 | 中文字幕在线专区 | 国内久久精品视频 | 国产高清网站 | 欧美精品免费一区二区 | 91色偷偷 | 久久伦理视频 | 国产91亚洲 | 99这里有精品 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 日韩欧美一区二区在线播放 | 国产精品欧美激情在线观看 | 精品人人人 | 天天爱天天操天天干 | 97在线视频观看 | 91黄色小视频 | 99爱在线观看 | 97精品超碰一区二区三区 | 欧美一区三区四区 | 亚洲国产中文字幕在线 | a级片久久久 | 日韩在线视频一区二区三区 | 亚洲美女视频在线 | 美女国产 | 国产成人在线精品 | 久久精品中文字幕少妇 | 国产精品v a免费视频 | 亚洲黄色片在线 | 久久精品亚洲国产 | 欧美性猛片, | 99视频国产精品免费观看 | 亚洲一区二区精品视频 | 97国产一区二区 | 久久欧洲视频 | 国产成人精品日本亚洲999 | 三级黄色网址 | 亚洲精品国偷拍自产在线观看蜜桃 | 日韩区在线观看 | 成人啊 v | 亚洲精品88欧美一区二区 | 亚洲国产精品电影在线观看 | 国外成人在线视频网站 | 欧美三级在线播放 | 99精品视频在线观看免费 | 日韩亚洲国产精品 | www.国产在线观看 | va视频在线观看 | 天天操天天射天天爱 | 国产亚洲精品久久久久久电影 | 欧美国产日韩一区二区三区 | 欧美一级片免费在线观看 | 人人看看人人 | 黄色a一级视频 | 五月天伊人 | av中文在线播放 | 在线电影中文字幕 | 国产精品久久久久久久久久ktv | 97电影手机 | 一区二区三区免费 | av在线免费网站 | 成人av电影在线 | 国产精品美女免费看 | 免费人成在线观看网站 | 国产精品短视频 | 91麻豆看国产在线紧急地址 | 日韩在线中文字幕视频 | 又黄又爽的免费高潮视频 | 免费又黄又爽 | 久久久午夜精品福利内容 | 国产成人久久精品一区二区三区 | 又黄又刺激视频 | 高清日韩一区二区 | 国产精品免费视频一区二区 | 国产精品video爽爽爽爽 | 欧美一区二区在线免费观看 | 日本丶国产丶欧美色综合 | 黄色av一级 | 婷婷伊人五月 | 国产精品久久久久久婷婷天堂 | 国产资源在线免费观看 | 成人av高清在线 | 久久精品国产一区 | 久色网 | 国产精品久久久久久久久费观看 | 国产精品乱看 | 怡红院av久久久久久久 | 密桃av在线 | 国产一级黄色片免费看 | 欧美另类激情 | 一级黄色大片在线观看 | 色综合亚洲精品激情狠狠 | 久久视频99 | 欧美一区二区三区在线播放 | 69xx视频 | 国产精品一区二区免费在线观看 | www.天天射| av大全在线 | 久久精品8 | 免费在线国产视频 | 国产一区二区视频在线 | 九九热在线视频 | 色激情在线 | 97超碰国产精品女人人人爽 | 99视频在线精品免费观看2 | 国产精品一区二区三区免费视频 | 国产在线观看中文字幕 | 在线看国产日韩 | 久久黄色小说 | 免费看黄色小说的网站 | 午夜精品成人一区二区三区 | 成人免费观看a | 国产日产精品一区二区三区四区的观看方式 | 国产成人久| www.色五月 | 国产精品视频永久免费播放 | 91av在线视频免费观看 | 人人看人人艹 | 国产成人综合精品 | 日精品| 久久中文字幕视频 | 亚洲国产精品va在线看黑人 | 看av在线 | 中文在线√天堂 | 国内久久 | 亚洲精品午夜久久久 | 综合精品在线 | av在线播放不卡 | 99热在线网站 | 国产精品久久久久免费观看 | 在线成人免费av | 91av在线免费| 久久久久久久久久福利 | 香蕉视频在线免费 | 蜜臀av夜夜澡人人爽人人桃色 | 国内精品久久久久久久97牛牛 | 99精品国产免费久久久久久下载 | 丁香综合五月 | 九九免费观看视频 | 成人三级黄色 | 久久婷婷国产 | 992tv成人免费看片 | 玖玖精品在线 | 日本午夜在线亚洲.国产 | 国产看片免费 | 国产精品网址在线观看 | 狠狠色丁香婷婷综合橹88 | 日韩电影在线一区 | 国产精品日韩久久久久 | 亚洲天堂网在线视频 | 午夜视频在线观看网站 | 九九九电影免费看 | 国产69久久久欧美一级 | 日韩亚洲在线视频 | 欧美激情视频一区二区三区 | 亚洲精品国产自产拍在线观看 | 男女免费视频观看 | 亚洲特级毛片 | 久草在线免费播放 | 9热精品| 国产精品不卡一区 | 国产精品久久久久一区二区 | 在线看片中文字幕 | 国产色就色 | 欧美国产日韩在线视频 | 福利片免费看 | 免费日韩在线 | 超碰在线观看av.com | 91在线中字 | 视频三区在线 | 天天干天天操天天拍 | 美女国产精品 | 国产亚洲精品久久 | 字幕网av | 日韩免费视频网站 | 美女啪啪图片 | 97在线精品 | 99re久久精品国产 | 五月婷婷六月丁香 | 伊人www22综合色 | 久久曰视频 | 日韩黄色av网站 | 午夜精品久久久久久久久久久久久久 | 免费视频久久久久 | 国产精品视频一二三 | 日本中文字幕久久 | 亚洲欧美在线观看视频 | 99久久影院 | 超碰成人免费电影 | 久久亚洲专区 | 手机在线小视频 | 中文字幕乱码一区二区 | 精品91| 91在线porny国产在线看 | 久久激情视频网 | 色夜视频 | 偷拍视频一区 | 一级欧美黄 | 久草在线视频中文 | 中文字幕在线观看播放 | 国模精品在线 | 精品999在线 | 色欧美视频 | 欧美久久久久久久久 | 久久人人爽人人人人片 | 激情视频免费在线观看 | 国产精品毛片一区二区 | 手机av资源 | 日韩av视屏 | 国产午夜激情视频 | 欧美午夜精品久久久久 | 黄色www在线观看 | 99色人 | 久久激情视频免费观看 | 精品亚洲国产视频 | 亚洲精品国产自产拍在线观看 | 久久亚洲影视 | 黄a网 |