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

Shuffy

不斷的學(xué)習(xí),不斷的思考,才能不斷的進(jìn)步.Let's do better together!
posts - 102, comments - 43, trackbacks - 0, articles - 19

【轉(zhuǎn)自】http://blog.chinaunix.net/u/28371/showart.php?id=404687
1.首先介紹一下什么是DC(設(shè)備描述表)

Windows應(yīng)用程序通過為指定設(shè)備(屏幕,打印機(jī)等)創(chuàng)建一個(gè)設(shè)備描述表(Device Context, DC)在DC表示的邏輯意義的“畫布”上進(jìn)行圖形的繪制。DC是一種包含設(shè)備信息的數(shù)據(jù)結(jié)構(gòu),它包含了物理設(shè)備所需的各種狀態(tài)信息。Win32程序在繪制圖形之前需要獲取DC的句柄HDC,并在不繼續(xù)使用時(shí)釋放掉。

2.CDC及其派生類

CDC及其派生類的繼承視圖:
CObject
public |------CDC
public |------CClientDC
public |------CPaintDC
public |------CWindowDC
public |------CMetaFileDC
(注意: 除CMetaFileDC以外的三個(gè)派生類用于圖形繪制.)
[以下幾段是翻譯MSDN中資料]
CDC類定義了一個(gè)設(shè)備描述表相關(guān)的類,其對(duì)象提供成員函數(shù)操作設(shè)備描述表進(jìn)行工作,如顯示器,打印機(jī),以及顯示器描述表相關(guān)的窗口客戶區(qū)域。

通過CDC的成員函數(shù)可進(jìn)行一切繪圖操作。CDC提供成員函數(shù)進(jìn)行設(shè)備描述表的基本操作,使用繪圖工具, 選擇類型安全的圖形設(shè)備結(jié)構(gòu)(GDI),以及色彩,調(diào)色板。除此之外還提供成員函數(shù)獲取和設(shè)置繪圖屬性,映射,控制視口,窗體范圍,轉(zhuǎn)換坐標(biāo),區(qū)域操作,裁減,劃線以及繪制簡(jiǎn)單圖形(橢圓,多邊形等)。成員函數(shù)也提供繪制文本,設(shè)置字體,打印機(jī)換碼,滾動(dòng), 處理元文件。

 

通過CDC的成員函數(shù)可進(jìn)行一切繪圖操作。CDC提供成員函數(shù)進(jìn)行設(shè)備描述表的基本操作,使用繪圖工具, 選擇類型安全的圖形設(shè)備結(jié)構(gòu)(GDI),以及色彩,調(diào)色板。除此之外還提供成員函數(shù)獲取和設(shè)置繪圖屬性,映射,控制視口,窗體范圍,轉(zhuǎn)換坐標(biāo),區(qū)域操作,裁減,劃線以及繪制簡(jiǎn)單圖形(橢圓,多邊形等)。成員函數(shù)也提供繪制文本,設(shè)置字體,打印機(jī)換碼,滾動(dòng), 處理元文件。

其派生類:
PaintDC: 封裝BeginPaint和EndPaint兩個(gè)API的調(diào)用。
CClientDC: 處理顯示器描述表的相關(guān)的窗體客戶區(qū)域。
CWindowDC: 處理顯示器描述表相關(guān)的整個(gè)窗體區(qū)域,包括了框架和控 件(子窗體)。
CMetaFileDC: 與元文件相關(guān)的設(shè)備描述表關(guān)聯(lián)。

CDC提供兩個(gè)函數(shù),GetLayout和SetLayout用于反轉(zhuǎn)設(shè)備描述表的布局。用于方便阿拉伯,希伯來的書寫文化習(xí)慣的設(shè)計(jì),以及非歐洲表中的字體布局。

CDC包含兩個(gè)設(shè)備描述表,m_hDC和m_hAttribDC對(duì)應(yīng)于相同的設(shè)備,CDC為m_hDC指定所有的輸出GDI調(diào)用,大多數(shù)的GDI屬性調(diào)用由m_hAttribDC控制。(如,GetTextColor是屬性調(diào)用,而SetTextColor是一種輸出調(diào)用。)

 

例子:框架使用這兩個(gè)設(shè)備描述表,一個(gè)對(duì)象從物理設(shè)備中讀取屬性輸出到元文件。打印機(jī)預(yù)覽在框架中被執(zhí)行時(shí)也是相同的形式。你也可以編寫代碼使用這兩個(gè)設(shè)備描述表在你的應(yīng)用程序中進(jìn)行類似的操作。

 

3.使用方法

創(chuàng)建一個(gè)UseDC的MFC單文檔程序,定制7個(gè)按鈕用來選擇使用的DC,每個(gè)按鈕由一個(gè)成員變量標(biāo)識(shí)控制[互斥],分別是

bool m_bHDCDisplay ---- 使用整個(gè)屏幕的HDC;
bool m_bHDC ---- 使用當(dāng)前視圖的對(duì)應(yīng)的DC;
bool m_bCDC ---- 使用CDC類[當(dāng)前視圖窗體];
bool m_bCClientDC ---- 使用CClientDC類[視圖客戶區(qū)域DC];
bool m_bCPaintDC ---- 使用CPaintDC[視圖窗體];
bool m_bCWindowDC ---- 使用CWindowDC[整個(gè)視圖窗體];
bool m_bCMetaFileDC ---- 使用CMetaFileDC

添加7個(gè)按鈕的響應(yīng)函數(shù)以控制這些bool變量.(這里比較簡(jiǎn)單我就不提供代碼了)

視圖類構(gòu)造函數(shù):

CUseDCView::CUseDCView()

{

this->m_bHDCDisplay = false;
this->m_bHDC = false;
this->m_bCDC = false;
this->m_bCClientDC = false;
this->m_bCPaintDC = false;
this->m_bCWindowDC = false;
this->m_bCMetaFileDC = false;
m_hMetaFile = NULL;

}

視圖類OnDraw函數(shù)

void CUseDCView::OnDraw(CDC* pDC)

{

CUseDCDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

//窗體在OnDraw中會(huì)自動(dòng)傳入關(guān)聯(lián)當(dāng)前視圖窗體客戶矩形區(qū)域的CPaintDC
//才能獲取相應(yīng)的設(shè)備描述表

HDC HDCDisplay = NULL; //屏幕DC的句柄 對(duì)應(yīng)m_bHDCDisplay
HDC hDC = NULL; //普通DC的句柄 對(duì)應(yīng)m_bHDC;
CDC * pCDC = NULL; //對(duì)應(yīng)m_bCDC
CClientDC * pClientDC = NULL; //對(duì)應(yīng)m_bCClientDC
CPaintDC * pPaintDC = NULL; //對(duì)應(yīng)m_bCPaintDC
CWindowDC * pWindowDC = NULL; //對(duì)應(yīng)m_bCWindowDC
CMetaFileDC * pMetaFileDC = NULL; //對(duì)應(yīng)m_bMetaFileDC

HMETAFILE hMetaFile = NULL;
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

RECT rect; //定義一個(gè)設(shè)備左上角的矩形區(qū)域
rect.left = 0;
rect.top = 0;
rect.right = 200;
rect.bottom = 30;

//注意: HDCDisplay和hDC的::Release()中第一個(gè)參數(shù)HWND
//與GetDC()的第一個(gè)參數(shù)必須對(duì)應(yīng)。
if(m_bHDCDisplay)
{
HDCDisplay = ::GetDC(NULL); //獲得整個(gè)顯示器區(qū)域的DC
::DrawText(HDCDisplay, "HDC of Display", 14, &rect, DT_LEFT|DT_TOP);
::ReleaseDC(NULL, HDCDisplay);
HDCDisplay = NULL;
}
if(m_bHDC) //繪制在客戶區(qū)域
{
hDC = ::GetDC(this->m_hWnd); //本窗體的DC
::DrawText(hDC, "HDC", 3, &rect, DT_LEFT|DT_TOP);
::ReleaseDC(this->m_hWnd, hDC);
hDC = NULL;
}
else if(m_bCDC){
//必須釋放由程序框架傳入的pDC才能獲取當(dāng)前客戶區(qū)域設(shè)備描述表
pCDC = this->GetDC(); //當(dāng)前窗體(視圖)的設(shè)備描述表
pCDC->DrawText("Use class CDC", 13, &rect, DT_LEFT|DT_TOP);
this->ReleaseDC(pCDC);
pCDC = NULL;
}
else if(m_bCClientDC){
pClientDC = new CClientDC(this); //獲取本窗體客戶區(qū)域的DC
pClientDC->DrawText("Use class CClientDC", &rect, DT_LEFT|DT_TOP);
delete pClientDC;
pClientDC = NULL;
}
else if(m_bCPaintDC) { //測(cè)試當(dāng)前傳入的CDC是不是CPaintDC
pPaintDC = (CPaintDC*)pDC;
pPaintDC->DrawText("Use class CPaintDC", &rect, DT_LEFT|DT_TOP);
}
else if(m_bCWindowDC){
pWindowDC = new CWindowDC(this); //獲取本窗體框架和客戶區(qū)域的DC
//注意:繪制字符串的矩形區(qū)域空白部分覆蓋了視圖子窗體的邊緣.
pWindowDC->DrawText("Use class CWindowDC", &rect, DT_LEFT|DT_TOP);
delete pWindowDC;
pWindowDC = NULL;
}
else if(m_bCMetaFileDC){
//傳入pDC->m_hDC使用pDC繪制,圖形在視圖窗體左上角
pMetaFileDC = new CMetaFileDC();
pMetaFileDC->m_hDC = pDC->m_hDC;
pMetaFileDC->DrawText("Use class CMetaFileDC", &rect, DT_LEFT|DT_TOP);
pMetaFileDC->Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);
m_hMetaFile = pMetaFileDC->Close();
delete pMetaFileDC;
pDC->PlayMetaFile(m_hMetaFile);
}

}

MFC程序中使用CPaintDC在視圖窗口中繪制圖象時(shí)要注意,應(yīng)該在OnPaint()編寫關(guān)于CPaintDC相關(guān)的代碼,而不是在OnDraw()中.但是請(qǐng)注意,如果使用OnPaint()函數(shù)響應(yīng)WM_PAINT事件,OnDraw函數(shù)將會(huì)被屏蔽;

可以使用以下代碼測(cè)試:

在CUseDCView.h,CUseDCView的類定義中語句DECLARE_MESSAGE_MAP()之前加上afx_msg void OnPaint(),在CUseDCView.cpp中BEGIN_MESSAGE_MAP (CUseDCView, CView)和END_MESSAGE_MAP()之間加上ON_WM_PAINT()。

void CUseDCView::OnPaint()

{
CPaintDC dc(this);
RECT rect;
rect.left = 0;
rect.top = 0;
rect.right = 200;
rect.bottom = 30;
dc.Draw3dRect(&rect, (COLORREF)0xff0000, (COLORREF)0x0000ff);
}

使用CMetaFileDC

有興趣可以在以下語句中可以嘗試以下幾種情況:

else if(m_bCMetaFileDC){

...
...

}

情況1:(與上面的OnDraw函數(shù)中相同)
//傳入pDC->m_hDC使用pDC繪制,圖形在視圖窗體左上角
pMetaFileDC = new CMetaFileDC();
pMetaFileDC->m_hDC = pDC->m_hDC;
pMetaFileDC->DrawText("Use class CMetaFileDC", &rect, DT_LEFT|DT_TOP);
pMetaFileDC->Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);
m_hMetaFile = pMetaFileDC->Close();
delete pMetaFileDC;
pDC->PlayMetaFile(m_hMetaFile);

情況2:

//傳入pDC->m_hDC使用屏幕DC繪制,圖形在視圖窗體左上角
HDC hdc;
pMetaFileDC = new CMetaFileDC();
hdc = ::GetDC(NULL);
pMetaFileDC->m_hDC = pDC->m_hDC;
pMetaFileDC->DrawText("Use class CMetaFileDC", &rect, DT_LEFT|DT_TOP);
pMetaFileDC->Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);
m_hMetaFile = pMetaFileDC->Close();
delete pMetaFileDC;
::PlayMetaFile(hdc, m_hMetaFile);
::ReleaseDC(NULL, hdc);

情況3:

//傳入屏幕DC,使用屏幕DC繪制,圖像在屏幕左上角
HDC hdc;
pMetaFileDC = new CMetaFileDC();
hdc = ::GetDC(NULL);
pMetaFileDC->m_hDC = hdc;
pMetaFileDC->DrawText("Use class CMetaFileDC", &rect, DT_LEFT|DT_TOP);
pMetaFileDC->Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);
m_hMetaFile = pMetaFileDC->Close();
delete pMetaFileDC;
::PlayMetaFile(hdc, m_hMetaFile);
::ReleaseDC(NULL, hdc);

情況4:

//傳入屏幕DC,使用pDC繪制, 圖像在屏幕左上角
HDC hdc;
pMetaFileDC = new CMetaFileDC();
hdc = ::GetDC(NULL);
pMetaFileDC->m_hDC = hdc;
pMetaFileDC->DrawText("Use class CMetaFileDC", &rect, DT_LEFT|DT_TOP);
pMetaFileDC->Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);
m_hMetaFile = pMetaFileDC->Close();
delete pMetaFileDC;
pDC->PlayMetaFile(m_hMetaFile);
::ReleaseDC(NULL, hdc);

情況5:

//傳入屏幕DC,使用pDC繪制,但是繪制前釋放屏幕DC,
//沒有出錯(cuò),而且圖像繪制在屏幕左上角
HDC hdc;
pMetaFileDC = new CMetaFileDC();
hdc = ::GetDC(NULL);
pMetaFileDC->m_hDC = hdc;
pMetaFileDC->DrawText("Use class CMetaFileDC", &rect, DT_LEFT|DT_TOP);
pMetaFileDC->Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);
m_hMetaFile = pMetaFileDC->Close();
delete pMetaFileDC;
::ReleaseDC(NULL, hdc);
pDC->PlayMetaFile(m_hMetaFile);

情況6:

//傳入屏幕pDC->hDC,使用CMetaFileDC繪制,圖像在視圖窗體左上角
HDC hdc;
pMetaFileDC = new CMetaFileDC();
hdc = pDC->m_hDC;
pMetaFileDC->m_hDC = hdc;
pMetaFileDC->DrawText("Use class CMetaFileDC", &rect, DT_LEFT|DT_TOP);
pMetaFileDC->Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);
m_hMetaFile = pMetaFileDC->Close();
pMetaFileDC->PlayMetaFile(m_hMetaFile);
delete pMetaFileDC;
::ReleaseDC(NULL, hdc);

情況7:

//傳入屏幕DC,使用CMetaFileDC繪制,圖像在屏幕左上角
HDC hdc;
pMetaFileDC = new CMetaFileDC();
hdc = ::GetDC(NULL);
pMetaFileDC->m_hDC = hdc;
pMetaFileDC->DrawText("Use class CMetaFileDC", &rect, DT_LEFT|DT_TOP);
pMetaFileDC->Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);
m_hMetaFile = pMetaFileDC->Close();
pMetaFileDC->PlayMetaFile(m_hMetaFile);
delete pMetaFileDC;
::ReleaseDC(NULL, hdc);

情況8:

//傳入屏幕DC,使用CMetaFileDC繪制,繪圖前釋放hdc
//仍然沒有出錯(cuò),圖像在屏幕左上角
HDC hdc;
pMetaFileDC = new CMetaFileDC();
hdc = ::GetDC(NULL);
pMetaFileDC->m_hDC = hdc;
pMetaFileDC->DrawText("Use class CMetaFileDC", &rect, DT_LEFT|DT_TOP);
pMetaFileDC->Draw3dRect(200, 0, 300, 30, (COLORREF)0xffff00, (COLORREF)0x0000ff);
m_hMetaFile = pMetaFileDC->Close();
::ReleaseDC(NULL, hdc);
pMetaFileDC->PlayMetaFile(m_hMetaFile);
delete pMetaFileDC;

由上面代碼可見繪圖的位置與傳入CMetaFileDC::m_hDC的值有關(guān)。

使用CMetaFileDC需要注意:

使用CMetaFileDC對(duì)象調(diào)用一系列你想重復(fù)的CDC的GDI命令,只能使用CDC類中GDI輸出命令。CDC的PlayMetaFile可以使用圖元文件句柄來執(zhí)行圖元文件中的命令,圖元文件也能使用CopyMetaFile使其存儲(chǔ)在磁盤上。當(dāng)不再需要圖元文件時(shí),調(diào)用DeleteMetaFile從內(nèi)存中刪除它。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            另类亚洲自拍| 欧美一区二区国产| 久久精品男女| 亚洲欧美日韩国产综合| 亚洲人永久免费| 狂野欧美激情性xxxx欧美| 久久国产精品免费一区| 亚洲综合国产激情另类一区| 一区二区欧美日韩视频| 亚洲午夜精品网| 午夜精品久久久久久久久久久久| 亚洲毛片网站| 亚洲欧美区自拍先锋| 久久人体大胆视频| 一本一本久久a久久精品牛牛影视| 日韩一区二区久久| 亚洲香蕉网站| 六十路精品视频| 亚洲精品少妇| 亚洲欧美综合网| 欧美刺激性大交免费视频| 欧美日产国产成人免费图片| 国产精品久久久爽爽爽麻豆色哟哟| 国产精品一区二区久久精品| 激情91久久| 亚洲欧美久久久久一区二区三区| 亚洲制服丝袜在线| 国内一区二区三区| 99国产精品| 亚洲欧美乱综合| 亚洲片区在线| 久久精品亚洲热| 亚洲国产va精品久久久不卡综合| 亚洲第一视频网站| 欧美一区二区国产| 宅男在线国产精品| 欧美精品www| 亚洲国产欧美国产综合一区| 欧美在线一二三| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 艳女tv在线观看国产一区| 亚洲一区二区免费视频| 亚洲高清成人| 欧美日韩一区二区精品| 日韩亚洲国产欧美| 夜夜嗨av一区二区三区四区| 亚洲国产一二三| 浪潮色综合久久天堂| 国产欧美精品在线| 久久天天躁夜夜躁狠狠躁2022 | 中日韩高清电影网| 亚洲第一精品夜夜躁人人躁 | 欧美 日韩 国产一区二区在线视频 | 亚洲精品国产拍免费91在线| 欧美丰满高潮xxxx喷水动漫| 美女黄色成人网| 亚洲一区在线观看免费观看电影高清| 亚洲三级视频| 国产精品三级视频| 欧美成人亚洲成人| 欧美日韩亚洲高清| 久久人91精品久久久久久不卡| 亚洲一区亚洲| 91久久国产自产拍夜夜嗨| 亚洲性色视频| 日韩亚洲欧美成人一区| 午夜精品久久久久久久99热浪潮 | 欧美系列一区| 欧美福利影院| 国产一区高清视频| 亚洲免费精彩视频| 国产一区清纯| 亚洲看片网站| 亚洲一区视频在线观看视频| 亚洲人在线视频| 麻豆av一区二区三区| 午夜精品一区二区三区四区| 美女爽到呻吟久久久久| 久久亚洲综合色| 黄色成人片子| 久久夜色精品一区| 欧美国产日本| 夜夜嗨av一区二区三区四季av| 久久精品一区二区三区中文字幕| 欧美在线综合| 精品av久久久久电影| 久久香蕉国产线看观看av| 另类酷文…触手系列精品集v1小说| 国产日韩精品一区二区三区| 亚洲欧洲av一区二区| 欧美一区二区在线免费观看| 国产精品伊人日日| 老司机成人网| 亚洲一区二区三区777| 久久精品中文字幕一区| 激情成人中文字幕| 欧美日韩不卡在线| 久久久国产精品亚洲一区| 亚洲国产精品一区二区第一页| 一区二区日韩伦理片| 国产女优一区| 欧美日韩美女| 久久一区国产| 亚洲精品视频一区| 国产免费观看久久黄| 欧美成人免费va影院高清| 亚洲欧美日韩另类| 99这里有精品| 亚洲乱码国产乱码精品精98午夜| 久久精品视频在线免费观看| 在线综合+亚洲+欧美中文字幕| 狠狠综合久久av一区二区老牛| 国产精品进线69影院| 欧美日韩国内| 欧美日本二区| 欧美日韩国产小视频| 欧美h视频在线| 欧美—级在线免费片| 欧美国产大片| 欧美视频在线一区| 国产精品美女诱惑| 国产毛片久久| 国产曰批免费观看久久久| 国产专区欧美专区| 亚洲电影在线| 一区二区日韩欧美| 性久久久久久| 欧美88av| 亚洲一区二区三区成人在线视频精品| 在线视频亚洲| 久久综合中文字幕| 欧美日韩国产精品一卡| 国产精品嫩草99a| 亚洲视频在线播放| 欧美韩日精品| 亚洲综合不卡| 欧美日韩国产成人在线免费| 国产日韩欧美三区| 亚洲精品日韩综合观看成人91| 亚洲一区二区综合| 欧美国产第二页| 中文欧美日韩| 欧美成人xxx| 亚洲国产精品久久久久婷婷老年| 久久久久久九九九九| 欧美日韩中文字幕| 亚洲欧洲一区二区三区| 久久aⅴ国产欧美74aaa| 91久久久久久久久久久久久| 欧美在线免费一级片| 国产精品免费一区豆花| 日韩视频在线观看| 亚洲第一成人在线| 久久字幕精品一区| 亚洲高清久久久| 久久综合九色综合久99| 亚洲欧美日韩成人| 国产色产综合产在线视频| 亚洲欧洲av一区二区| 亚洲无毛电影| 国产精品久久久久毛片大屁完整版| 在线一区视频| 亚洲一区999| 国产有码在线一区二区视频| 久久国产加勒比精品无码| 午夜影视日本亚洲欧洲精品| 国产精品久久久久9999| 亚洲一区二区三区777| 亚洲一区综合| 亚洲欧洲偷拍精品| 夜夜嗨av一区二区三区四区| 欧美性色视频在线| 欧美激情一区二区三区蜜桃视频| 欧美不卡福利| 欧美在线视频一区| 欧美激情精品久久久久久免费印度| 99成人精品| 久久综合中文字幕| 亚洲免费电影在线观看| 免费的成人av| 国产精品高潮粉嫩av| 久久天堂成人| 国产日产高清欧美一区二区三区| 久久精品五月| 欧美丝袜一区二区三区| 免费黄网站欧美| 欧美黑人在线播放| 国产精品啊v在线| 欧美激情麻豆| 国产亚洲人成a一在线v站| 亚洲精品中文字幕女同| 国产亚洲人成网站在线观看| 免费看精品久久片| 在线免费一区三区| 亚洲中字在线| 欧美日韩情趣电影| 日韩视频在线你懂得| 一级成人国产| 亚洲国产色一区| 欧美日本一区|