青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

本文URL: http://www.microsoft.com/china/msdn/library/langtool/vs2005/dnvs05customdraw.mspx?mfr=true

Visual Studio 2005:在 Visual C++ 中開發(fā)自定義的繪圖控件

發(fā)布日期: 2006-4-14 | 更新日期: 2006-4-14

Tom Archer
Program Manager, Microsoft

適用于:
Win32 API
Microsoft 基礎(chǔ)類
Visual C++ 2005
摘要:TomArcher介紹自定義的繪圖技術(shù) — 開發(fā)自定義控件,使自己的應(yīng)用程序具有獨(dú)特的外觀。

下載相關(guān)的示例代碼,CustomDraw.exe。

*
本頁內(nèi)容
您想變得有多與眾不同? 您想變得有多與眾不同?
主宰繪圖操作 主宰繪圖操作
實(shí)現(xiàn)自定義繪制的三步曲 實(shí)現(xiàn)自定義繪制的三步曲
示例:創(chuàng)建一個列表視圖控件自定義繪制控件 示例:創(chuàng)建一個列表視圖控件自定義繪制控件
小結(jié) 小結(jié)
致謝 致謝
參考資料 參考資料

至今我仍然記得一次對話(回首 1995 年,那時我在 Peachtree Software 管理一支開發(fā)團(tuán)隊(duì)),話題是關(guān)于 Visual C++ 和 MFC 能為我們節(jié)約多少時間,從而使計(jì)帳系統(tǒng)的上市時間能加快多少。大概情況是這樣的:

:Visual Studio 向?qū)⑹刮覀兡軌蛟趲酌腌姷臅r間內(nèi)生成應(yīng)用程序的框架。我們基本上可以免費(fèi)得到所有用戶界面。從菜單、狀態(tài)欄、完整的文檔/視圖結(jié)構(gòu),到單獨(dú)的數(shù)據(jù)和演示文稿、工具欄等。甚至,它們還在其中生成了類似于文件打開、打印和打印預(yù)覽的功能!

市場人員:聽起來不錯。那么,你們完成全部編碼要用多長時間?

:鑒于我們得到的所有 UI 都是免費(fèi)的,并且只需加入有關(guān)計(jì)帳的內(nèi)容,所以會花 6 到 9 個月的時間完成編碼。最棒的是,該應(yīng)用程序的外觀會象一個 Microsoft Office 應(yīng)用程序一樣!

市場人員:哦?

:真的。從具有 Microsoft 風(fēng)格的應(yīng)用程序中,我們可以獲得潛在的好處。這一點(diǎn)特別重要,如果我們的應(yīng)用程序象個 Office 產(chǎn)品,那么在其包裝盒上打上 Windows 95 徽標(biāo)會更容易。

市場人員:我們不能在市場上大喊“購買我們的產(chǎn)品吧,它多象 XXX 產(chǎn)品呀?!彼械挠?jì)帳產(chǎn)品都具有相同的基本功能。我們的產(chǎn)品區(qū)別于其他產(chǎn)品的唯一方式就是用戶界面。我們要雇傭圖形設(shè)計(jì)師來設(shè)計(jì)一個完全自定義的用戶界面,然后您的團(tuán)隊(duì)再進(jìn)行編碼。這要花多少時間?

:在我們沒看到準(zhǔn)確的控件前,很難說會花多長時間,但至少這樣會加倍我們的工作。

市場人員:那么,你們最好盡快開始。

兩年后,Peachtree Software 發(fā)布了自己第一個從零開始設(shè)計(jì)并創(chuàng)建的產(chǎn)品,并且作為其中的一份子,我也以此為而驕傲。經(jīng)過 10 年的變遷,我也帶頭進(jìn)行了一些知名產(chǎn)品(分別為 IBM、AT&T 和 VeriSign)的開發(fā),這些產(chǎn)品在全球數(shù)百萬的 PC 和電話上運(yùn)轉(zhuǎn)著,期間,我始終記得一個教訓(xùn):不管應(yīng)用程序在內(nèi)部運(yùn)行時有多好,但如果它不能在紛繁的產(chǎn)品中脫穎而出并抓住用戶的心,那么它也賣不出去。

因此,當(dāng)我在 MSDN 發(fā)表第一篇文章時,我考慮最好著眼于一個我感興趣的題目 — 過去我在 Peachtree 經(jīng)常使用的一項(xiàng)技術(shù),用來開發(fā)一些市場部門需要的奇妙的 UI 部件 — 開發(fā)自定義的繪圖控件。

您想變得有多與眾不同?

在您決定開發(fā) Windows 提供的常規(guī)免費(fèi)自定義控件范圍之外的控件之后,您必需確定自己的控件將有多少獨(dú)到之處 — 在功能和外觀兩方面。例如,我們假定您正在創(chuàng)建一個類似于計(jì)速表的控件。由于公共控件庫 (ComCtrl32.dll) 中沒有類似的控件,您完全需要自己進(jìn)行以下操作:編寫所有控件功能需要的代碼,進(jìn)行繪制,默認(rèn)終端用戶的交互,以及控件與其父窗口之間需要的任意消息處理。

另一方面,還包括一些您只想調(diào)整公共控件功能的情況。例如,我們假定您想創(chuàng)建一個屏蔽編輯控件,它只允許接受指定的字符。如果使用 MFC,通常涉及從 MFC 提供的類派生一個類,該類封裝了一個公共控件(在屏蔽編輯控件中,通常為 CEdit),重寫必需的虛函數(shù)(或處理指定的消息),然后加入自定義的代碼。

本文討論的重點(diǎn)介于兩者之間 — 公共控件賦予您想要的大部分功能,但控件的外觀并不是您想要的。例如,列表視圖控件提供在許多視圖風(fēng)格中顯示數(shù)據(jù)列表的方式 — 小圖標(biāo)、大圖標(biāo)、列表和詳細(xì)列表(報(bào)告)。然而,如果您想要一個網(wǎng)格控件,那結(jié)果怎樣呢?盡管公共控件庫里沒有特別包含網(wǎng)格,但是列表視圖控件與它較為接近,它以行和列顯示數(shù)據(jù),并有一個相關(guān)的標(biāo)頭控件。因此,許多人以一個標(biāo)準(zhǔn)的列表視圖控件為起點(diǎn)創(chuàng)建自己的網(wǎng)格控件,然后重寫該控件及其子項(xiàng)的呈現(xiàn)方式或繪制方式。

主宰繪圖操作

即使“只”進(jìn)行繪制,您仍然有至少四種選項(xiàng)可用,它們都具有鮮明的優(yōu)缺點(diǎn):

?

處理 WM_PAINT

?

所有者繪制

?

自定義繪制

?

處理 WM_CTLCOLOR

處理 WM_PAINT

最極端的選擇是執(zhí)行一個 WM_PAINT 處理程序,并且自己完成所有的繪制。這意味著,您的代碼將需要進(jìn)行一些與呈現(xiàn)控件相關(guān)的瑣事 — 創(chuàng)建適當(dāng)?shù)脑O(shè)備上下文(一個或多個),決定控件的大小和位置,繪制控件等。在繪制過程中,很少需要這種級別的控件。

所有者繪制

控制控件繪制的另一種方法是利用所有者繪制。事實(shí)上,您也許聽開發(fā)人員提到過所有者繪制控件,因?yàn)樗怯糜陂_發(fā)自定義控件最普通的技術(shù)。該技術(shù)普遍使用的主要原因在于,Windows 可為您提供很多幫助。在呈現(xiàn)控件的那一刻,Windows 就已經(jīng)創(chuàng)建并填寫了設(shè)備上下文,決定了控件的大小和位置,并且向您傳遞信息以使您了解此刻繪制的需求。對于列表控件(例如,列表框和列表視圖),Windows 將為列表中的每一項(xiàng)調(diào)用繪制代碼,這意味著您只需繪制這些項(xiàng),而無需考慮控件的其他方面。注意,所有者繪制可用于大多數(shù)控件。然而,它不能用于編輯控件;并且考慮到列表控件,它只能用于報(bào)表視圖樣式。

自定義繪制

對于繪制自己的控件而言,這可能是最少為人所知的技術(shù)。事實(shí)上,許多技術(shù)能力較高的開發(fā)人員也混淆了術(shù)語所有者繪制 (owner-draw) 和自定義繪制 (custom-draw)。關(guān)于自定義控件,首先需要了解,它僅針對于指定的公共控件:標(biāo)頭、列表視圖、rebar、工具欄、工具提示、跟蹤條和樹視圖。此外,盡管所有者繪制只允許繪制報(bào)告視圖風(fēng)格的列表視圖控件,而自定義繪制則使您能夠處理列表視圖控件所有視圖風(fēng)格的繪制。使用自定義繪制的另一個明顯優(yōu)勢是,您可以對希望繪制的內(nèi)容進(jìn)行嚴(yán)格挑選。實(shí)現(xiàn)方式是,在控件繪制的每個階段由 Windows 向代碼發(fā)送一個消息。這樣,您可以決定在每個階段是自己進(jìn)行所有的繪制工作,增加默認(rèn)的繪制,還是允許 Windows 為該階段執(zhí)行所有的繪制。(鑒于自定義繪制是本文的一個主題,因此您很快會看到它的工作方式。)

處理 WM_CTLCOLOR

這可能是幫助決定如何呈現(xiàn)控件最簡單的方式。正如消息名所指,當(dāng)要繪制一個控件,并且它能讓您的代碼決定要使用的畫筆時,發(fā)送 WM_CTLCOLOR 消息。通常情況下,如果您只想更改控件的顏色,并且不提供除控件本身之外的更多功能,則使用該技術(shù)。此外,對于由 Internet Explorer 引入的公共控件(列表視圖、樹視圖、rebar 等),不發(fā)送該消息,并且它只與標(biāo)準(zhǔn)控件(編輯、列表框等)協(xié)同使用。

實(shí)現(xiàn)自定義繪制的三步曲

既然您已經(jīng)了解了繪制控件可用的各種選項(xiàng)(包括使用自定義繪制的好處),那么,讓我們來看看實(shí)現(xiàn)一個自定義繪制控件需要的三個主要步驟。

?

執(zhí)行一個 NM_CUSTOMDRAW 消息處理程序。

?

指定處理所需的繪制階段。

?

篩選特定的繪制階段(在這些階段中,您需要加入自己的特定于控件的繪制代碼)。

執(zhí)行一個NM_CUSTOMDRAW 消息處理程序

當(dāng)需要繪制一個公共控件時,MFC 會將控件的自定義繪制通知消息(最初發(fā)送到控件的父窗口)以 NM_CUSTOMDRAW 消息的形式反饋給控件。以下是一個 NM_CUSTOMDRAW 處理程序的示例。

void CMyCustomDrawControl::OnCustomDraw(NMHDR* pNMHDR, 
                                        LRESULT* pResult)
{
  LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR);
  ...
}

正如您所見,NM_CUSTOMDRAW 處理程序?qū)⒁粋€指針傳遞給 NMHDR 類型的結(jié)構(gòu)。然而,該值不足以用于象 NMHDR 這樣只包含三個成員(hwndFrom、idFromcode)的結(jié)構(gòu)。

因此,您通常需要將該結(jié)構(gòu)指針轉(zhuǎn)換為信息量更大的結(jié)構(gòu) — LPNMCUSTOMDRAWLPNMCUSTOMDRAW 指向 NMCUSTOMDRAW,它包含諸如 dwDrawStage、dwItemSpecuItemState 這樣的成員 — 它們是決定當(dāng)前繪制階段及確切繪制(例如,控件本身、或控件的一個項(xiàng)目或子項(xiàng))所必需的。

這里值得注意的是,還可以將 NMHDR 指針指向特定于正在繪制控件的類型的結(jié)構(gòu)。表 1 顯示控件的一個列表及其相關(guān)的自定義繪制結(jié)構(gòu)類型名。

表 1:控件及其相關(guān)的自定義繪制結(jié)構(gòu)
控件 結(jié)構(gòu)(在 commctrl.h 中定義)

Rebar、Trackbar、AuthTicket、My.Resources、My.Settings、My.User 和 My.WebServices。

NMCUSTOMDRAW

List-view

NMLVCUSTOMDRAW

Toolbar

NMTBCUSTOMDRAW

Tooltip

NMTTCUSTOMDRAW

Tree-view

NMTVCUSTOMDRAW

指定處理所需的繪制階段

正如我在前面提到的,繪制一個控件存在一些“階段”。特別是,您可以將繪制過程理解為一系列階段,其中控件通知其父窗口需要繪制的內(nèi)容。事實(shí)上,控件甚至?xí)诶L制控件及其各項(xiàng)前后發(fā)送一個通知,從而讓編程人員更好地控制該過程。

在所有情況下,單一的 NM_CUSTOMDRAW 處理程序在每個繪制階段都進(jìn)行調(diào)用。然而,謹(jǐn)記:自定義繪制允許您在自己的繪制中合并默認(rèn)的控件繪制,您需要指定您將處理哪個繪制階段。這通過設(shè)置 NM_CUSTOMDRAW 處理程序的第二個參數(shù) (pResult) 完成。事實(shí)上,如果您從未設(shè)置該值,則用初始階段的 CDDS_PREPAINT 調(diào)用函數(shù)后,您的函數(shù)將不再被調(diào)用!

從技術(shù)上講,只有兩個階段指定需要的繪制階段(CDDS_PREPAINTCDDS_ITEMPREPAINT),它們影響發(fā)送通知消息的內(nèi)容。然而,通常只在處理程序的最后指定代碼將處理的繪制階段。表 2 列出用于指定所需繪制階段(代碼關(guān)注的)的值。

表 2:自定義繪制返回標(biāo)志
自定義繪制返回標(biāo)志 含義

CDRF_DEFAULT

指示控件自行繪制。該值為默認(rèn)值,不應(yīng)該將它與其他值組合在一起。

CDRF_SKIPDEFAULT

用于指定控件根本不進(jìn)行任何繪制。

CDRF_NEWFONT

當(dāng)代碼更改繪制項(xiàng)/子項(xiàng)的字體時使用。

CDRF_NOTIFYPOSTPAINT

使通知信息在控件或每個項(xiàng)/子項(xiàng)繪制后發(fā)送。

CDRF_NOTIFYITEMDRAW

指出項(xiàng)(或子項(xiàng))將進(jìn)行繪制。注意,它下面的值與 CDRF_NOTIFYSUBITEMDRAW 相同。

CDRF_NOTIFYSUBITEMDRAW

指出子項(xiàng)(或項(xiàng))將進(jìn)行繪制。注意,它下面的值與 CDRF_NOTIFYITEMDRAW 相同。

CDRF_NOTIFYPOSTERASE

當(dāng)刪除控件后需要通知代碼時使用。

以下為一個示例,其中的代碼指定,當(dāng)繪制控件的項(xiàng) (CDRF_NOTIFYITEMDRAW) 及子項(xiàng) (CDRF_NOTIFYPOSTPAINT),以及繪制完成時,應(yīng)該調(diào)用 NM_CUSTOMDRAW 處理程序。

void CListCtrlWithCustomDraw::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
  LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR);

  ...
  
  *pResult = 0; // Initialize value
  *pResult |= CDRF_NOTIFYITEMDRAW;
  *pResult |= CDRF_NOTIFYSUBITEMDRAW;
  *pResult |= CDRF_NOTIFYPOSTPAINT;
}

篩選指定的繪制階段

一旦指定要關(guān)注的階段后,您需要處理這些階段。因?yàn)槔L制過程的每個階段只有一個消息要發(fā)送,慣例是執(zhí)行一個 switch 語句以決定準(zhǔn)確的繪制階段。不同的繪制階段由以下標(biāo)志定義:

CDDS_PREPAINT
CDDS_ITEM
CDDS_ITEMPREPAINT
CDDS_ITEMPOSTPAINT
CDDS_ITEMPREERASE
CDDS_ITEMPOSTERASE
CDDS_SUBITEM
CDDS_POSTPAINT
CDDS_PREERASE
CDDS_POSTERASE

對于一個 CListCtrl 派生的類,有一個 NM_CUSTOMDRAW 處理程序的示例,其中您可以發(fā)現(xiàn),代碼決定當(dāng)前繪制階段的方式:

void CMyCustomDrawControl::OnCustomDraw(NMHDR* pNMHDR, 
                                        LRESULT* pResult)
{
  LPNMCUSTOMDRAW pNMCD = reinterpret_cast(pNMHDR);
  switch(pNMCD->dwDrawStage)
  {
    case CDDS_PREPAINT:
      ...
    break;
    
    case CDDS_ITEMPREPAINT:
      ...
    break;

    case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
      ...
    break;
    
    ...
  }

  *pResult = 0;
}

注意,為了決定子項(xiàng)(例如,列表視圖控件)繪制的階段,您必需使用按位 or 操作符,它有兩個值:其中一個為 CDDS_ITEMPREPAINT 或者 CDDS_ITEMPOSTPAINT,另一個為 CDDS_SUBITEM。

要說明它,我們假定您想在繪制列表視圖項(xiàng)之前進(jìn)行一些處理。將編寫 switch 語句來處理 CDDS_ITEMPREPAINT。

case CDDS_ITEMPREPAINT:
...
break;

然而,如果是您所關(guān)注子項(xiàng)的預(yù)繪制階段,則將如下操作:

case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
...
break;

示例:創(chuàng)建一個列表視圖控件自定義繪制控件

如前面提到的,您可以完全控制控件及其項(xiàng)的繪制,或者僅執(zhí)行一小部分特定于應(yīng)用程序的繪制,并讓控件繼續(xù)進(jìn)行。本文的焦點(diǎn)更多地偏重于控件繪制技術(shù)而非高級的繪制技術(shù),我們將演練一個簡單的示例,其中列表視圖控件是一個自定義的繪制,因此項(xiàng)的文本將在創(chuàng)建拼接外觀的交替單元中顯示為不同的顏色。

?

創(chuàng)建一個基于 Visual C++ 2005 對話框的項(xiàng)目,名為 ListCtrlColor。

?

Class View 中選擇 Project 菜單選項(xiàng),并單擊 Add Class 調(diào)用 Add Class 對話框。

?

從分類列表中選擇 MFC,然后從模板列表中選擇 MFC Class。

?

單擊 Add 按鈕,調(diào)用 MFC Class Wizard 對話框。

?

對于 Class name,鍵入值 CListCtrlWithCustomDraw 并選擇 CListCtrlBase class。

?

單擊 Finish 按鈕,生成類的標(biāo)頭和執(zhí)行文件。

?

對于 Class View,右鍵單擊 CListCtrlWithCustomDraw 類,并選擇 Properties 上下文菜單選項(xiàng)。

?

顯示 Properties 窗口時,單擊頂部的 Messages 按鈕,顯示一個兩列的消息列表,您可以為其實(shí)現(xiàn)處理程序。

?

在消息列表中單擊 NM_CUSTOMDRAW 項(xiàng),然后下拉第二列的組合框箭頭,并選擇值 OnNMCustomdraw

?

現(xiàn)在,處理繪制代碼。這里,我們只簡單處理項(xiàng)和子項(xiàng)預(yù)繪制階段,指定基于當(dāng)前行(項(xiàng))和列(子項(xiàng))的文本和背景色。要進(jìn)行此操作,按如下所示修改 OnNMCustomdraw 函數(shù):

void CListCtrlWithCustomDraw::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
  LPNMLVCUSTOMDRAW lpLVCustomDraw = reinterpret_cast(pNMHDR);

  switch(lpLVCustomDraw->nmcd.dwDrawStage)
  {
    case CDDS_ITEMPREPAINT:
    case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
      if (0 == ((lpLVCustomDraw->nmcd.dwItemSpec + lpLVCustomDraw->iSubItem) % 2))
      {
        lpLVCustomDraw->clrText = RGB(255,255,255); // white text
        lpLVCustomDraw->clrTextBk = RGB(0,0,0); // black background
      }
      else 
      {
        lpLVCustomDraw->clrText = CLR_DEFAULT;
        lpLVCustomDraw->clrTextBk = CLR_DEFAULT;
      }
    break;

    default: break;    
  }

  *pResult = 0;
  *pResult |= CDRF_NOTIFYPOSTPAINT;
  *pResult |= CDRF_NOTIFYITEMDRAW;
  *pResult |= CDRF_NOTIFYSUBITEMDRAW;
}

現(xiàn)在,我們來測試新控件。要進(jìn)行此操作,您只需使用 CListCtrlWithCustomDraw 類將列表視圖控件放在對話框中,并對其進(jìn)行子類派生。下面是完成該操作的步驟。

?

Resource 視圖中,打開應(yīng)用程序的主對話框 (IDD_LISTCTRLCOLOR_DIALOG)。

?

Toolbox 中,將一個 List Control 拖放到該對話框。

?

右鍵單擊列表控件,并選擇 Properties 上下文菜單選項(xiàng)。

?

View 屬性設(shè)置為 Report

?

右鍵單擊控件,并選擇 Add Variable 上下文菜單選項(xiàng)。

?

出現(xiàn) Add Member Variable Wizard 對話框時,指定 m_lstBooksVariable name,并單擊 Finish 按鈕。

?

這時,您就有了一個 CListCtrl 派生類 (m_lstBooks),它將對話框上的列表視圖控件進(jìn)行子類派生。然而,m_lstBooks 需要從最新創(chuàng)建的 CListCtrlWithCustomDraw 派生,以便于調(diào)用您的繪制代碼。因此,打開對話框的標(biāo)題文件 (ListCtrlColorDlg.h),將 m_lstBooks 更改為 CListCtrlWithCustomDraw 類型。

?

CListCtrlColorDlg 類開始之前,添加以下指令。

#include "ListCtrlWithCustomDraw.h"
?

將下面的代碼添加到對話框的 OnInitDialog 成員函數(shù),這樣我們就能夠看到一些列表視圖行。

// Insert the columns
m_lstBooks.InsertColumn(0, _T("Author"));
m_lstBooks.InsertColumn(1, _T("Book"));

// Define the data
static struct 
{
  TCHAR m_szAuthor[50];
  TCHAR m_szTitle[100];
} BOOK_INFO[] = {
_T("Tom Archer"), _T("Visual C++.NET Bible"),
_T("Tom Archer"), _T("Extending MFC with the .NET Framework"),
_T("Brian Johnson"), _T("XBox 360 For Dummies")
};

// Insert the data
int idx;
for (int i = 0; i < sizeof BOOK_INFO / sizeof BOOK_INFO[0]; i++)
{
  idx = m_lstBooks.InsertItem(i, BOOK_INFO[i].m_szAuthor);
  m_lstBooks.SetItemText(i, 1, BOOK_INFO[i].m_szTitle);
}
?

現(xiàn)在,建立并運(yùn)行應(yīng)用程序。圖 1 為應(yīng)用程序外觀的一個示例。


圖 1. 自定義繪制示例應(yīng)用程序

小結(jié)

當(dāng) Windows 首次作為“下一代”操作系統(tǒng)引入到應(yīng)用程序開發(fā)之中時,它作為新圖形用戶界面的一個主要論據(jù)就是其一致性。該論據(jù)的要點(diǎn)所在是其具有一個通用的外觀:統(tǒng)一的菜單項(xiàng)、通用控件等。這一通用性的感覺可能會一直延續(xù),直到有第二家公司想設(shè)計(jì)其自己的應(yīng)用程序。簡單說,提供外觀與其他應(yīng)用程序雷同的應(yīng)用程序,任何公司都不會逃離這一怪圈。

要建立一個唯一的且讓人過目難忘的用戶界面,其中一種方式是為應(yīng)用程序設(shè)計(jì)并開發(fā)自定義的控件。希望本文能對您有所幫助,現(xiàn)在,您了解到一種非常強(qiáng)大的技術(shù),它使您的應(yīng)用程序能從眾多競爭對手的應(yīng)用程序中脫穎而出。

致謝

我要感謝 Microsoft 的項(xiàng)目經(jīng)理 Andrew Whitechapel,我們合著有兩本書籍(Inside C#, Second EditionVisual C++.NET Bible)。幾年來,我從 Andrew 那里學(xué)到很多東西,包括本文中我寫到的一些內(nèi)容。

參考資料

?

Custom Draw Overview

?

Custom Draw Reference

關(guān)于作者

Tom Archer 是 Microsoft 的一位項(xiàng)目經(jīng)理。他曾經(jīng)是 C++ MVP,Tom 現(xiàn)負(fù)責(zé) Visual C++、Windows Vista 以及 MSDN 中的 Windows SDK Developer Centers。


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            午夜精品久久久久久久99黑人| 国产精品高潮呻吟久久av黑人| 国产日韩欧美一区二区三区在线观看| 99视频精品在线| 亚洲精品影院| 欧美日韩精品三区| 亚洲自拍偷拍麻豆| 香蕉乱码成人久久天堂爱免费| 国产欧美亚洲一区| 久久婷婷色综合| 男人天堂欧美日韩| 国产精品99久久久久久久久久久久| 亚洲精品欧洲| 国产欧美精品一区aⅴ影院| 久久久久9999亚洲精品| 玖玖综合伊人| 中文在线不卡| 久久成人精品无人区| 亚洲福利视频二区| av不卡在线| 激情自拍一区| 亚洲精品久久久久久久久久久| 欧美激情综合亚洲一二区| 亚洲欧美清纯在线制服| 欧美一区影院| 夜夜爽99久久国产综合精品女不卡| 一区二区三区www| 狠狠做深爱婷婷久久综合一区| 亚洲国产导航| 国产婷婷一区二区| 亚洲国产精品尤物yw在线观看| 欧美体内she精视频| 久久人人爽人人爽爽久久| 欧美精品国产一区二区| 久久精品99无色码中文字幕| 欧美成人一区二区三区片免费| 亚洲午夜精品久久久久久app| 久久精品在线观看| 午夜精品久久久久久久99樱桃| 伊人久久综合97精品| 99re这里只有精品6| 激情六月婷婷久久| 国产精品一区二区三区久久久| 欧美大片在线看| 国产伦精品一区二区三区视频黑人| 欧美黑人国产人伦爽爽爽| 国产麻豆精品在线观看| 最新日韩在线| 精品动漫3d一区二区三区| 亚洲调教视频在线观看| 亚洲精品国产精品国自产观看浪潮 | 久久综合久久美利坚合众国| 亚洲摸下面视频| 欧美日韩国产小视频在线观看| 久久中文字幕一区| 国产亚洲欧洲997久久综合| av不卡在线| 夜夜躁日日躁狠狠久久88av| 欧美大片91| 欧美成人免费全部| **性色生活片久久毛片| 久久国产毛片| 久久久在线视频| 国产情人综合久久777777| 亚洲性线免费观看视频成熟| 国产精品99久久久久久久久| 欧美精品一区二区高清在线观看| 亚洲国产经典视频| 亚洲精品视频一区二区三区| 欧美1区免费| 亚洲福利av| 亚洲美女91| 欧美欧美午夜aⅴ在线观看| 亚洲破处大片| 亚洲视频国产视频| 欧美系列电影免费观看| 一本久道综合久久精品| 亚洲欧美成人一区二区三区| 国产精品爽爽爽| 亚洲欧美日本日韩| 久久最新视频| 亚洲欧洲在线一区| 欧美日本免费一区二区三区| 正在播放欧美视频| 欧美一区二区三区婷婷月色| 国产亚洲欧美激情| 久久亚洲影音av资源网| 欧美国产视频在线| 中文在线资源观看网站视频免费不卡 | 国产精品男人爽免费视频1| 亚洲免费一区二区| 毛片基地黄久久久久久天堂| 亚洲精品乱码久久久久| 欧美日韩专区| 久久国产精品亚洲77777| 欧美顶级少妇做爰| 亚洲性感激情| 精品999在线观看| 欧美国产精品| 亚洲欧美日韩爽爽影院| 嫩草成人www欧美| 亚洲小少妇裸体bbw| 国产一区高清视频| 欧美大片免费观看| 午夜在线精品偷拍| 亚洲欧洲另类国产综合| 欧美在线精品免播放器视频| 欧美日韩亚洲视频一区| 午夜欧美精品久久久久久久| 欧美高清影院| 欧美在线视频免费观看| 亚洲伦理自拍| 黑人巨大精品欧美一区二区小视频 | 久久riav二区三区| 日韩视频二区| 女同一区二区| 欧美一区二区三区在线免费观看| 亚洲国产精品一区二区三区| 国产精品免费网站在线观看| 欧美国产第一页| 欧美制服丝袜第一页| 在线一区二区三区四区五区| 欧美成人精品不卡视频在线观看| 亚洲欧美日韩爽爽影院| 亚洲美女毛片| 亚洲国产综合91精品麻豆| 国产情人节一区| 国产精品久久7| 欧美精品在线看| 噜噜噜躁狠狠躁狠狠精品视频| 午夜精品久久久久久久蜜桃app| 日韩手机在线导航| 亚洲国产第一| 欧美激情一区二区三区蜜桃视频 | 亚洲人人精品| 欧美激情女人20p| 免费永久网站黄欧美| 久久久www免费人成黑人精品| 亚洲欧美影院| 午夜精品免费| 性欧美长视频| 欧美一区二区女人| 欧美一级淫片aaaaaaa视频| 亚洲一区在线观看免费观看电影高清| 亚洲精品乱码久久久久久久久| 亚洲国产高清高潮精品美女| 极品少妇一区二区| 在线观看91精品国产麻豆| 国内偷自视频区视频综合| 狠狠久久亚洲欧美专区| 国产一区二区三区久久久久久久久| 国产精品一区二区三区久久久| 国产精品亚洲不卡a| 国产欧美精品xxxx另类| 韩曰欧美视频免费观看| 一色屋精品视频免费看| 亚洲国产一区在线| 亚洲美女视频在线观看| 中国亚洲黄色| 亚洲欧美视频一区二区三区| 欧美一区二区三区免费视频| 久久国产精品一区二区| 欧美成人国产一区二区| 亚洲国产精品一区二区三区| 亚洲美女诱惑| 亚洲自拍电影| 久久综合九色综合欧美狠狠| 欧美国产日本韩| 国产精品乱子乱xxxx| 国产亚洲成精品久久| 亚洲高清免费视频| 一本色道久久| 久久成人免费视频| 亚洲高清视频在线观看| 亚洲色无码播放| 久久婷婷av| 欧美日韩在线三区| 韩国精品主播一区二区在线观看| 亚洲大黄网站| 亚洲欧美日韩综合国产aⅴ| 久久这里有精品视频| 亚洲精品久久久久| 欧美一区二区三区喷汁尤物| 免费人成网站在线观看欧美高清| 欧美午夜免费影院| 精品99一区二区| 午夜视频在线观看一区二区| 母乳一区在线观看| 亚洲天堂网在线观看| 久久视频一区二区| 国产伦精品一区二区三区四区免费 | 中文久久乱码一区二区| 狂野欧美激情性xxxx| 在线午夜精品| 女仆av观看一区| 国产综合香蕉五月婷在线| 亚洲天堂av电影| 欧美福利视频| 久久精品男女| 国产视频一区在线|