精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
VB與API學(xué)習(xí)筆記(5) 認識DC(Device Context簡介)

我一直不知道DC,見過DC名,看過此類文,就不知道:

為什么出現(xiàn)DC?DC有什么用呢?直接到看另一個文章,才知道這個東西?

感謝今天,我也明白了,2013年5月25日特別的日子。


先說下個人認識,DC是一個中介機構(gòu),就象拉皮條一樣,讓不同的人(設(shè)備)能認識。



如上圖,我們從總體上看一下為什么要有DC。

一、   顯示器上顯示的窗體或圖片,怎么輸出到打印機上呢?

           顯示器上圖像是不能直接被打印機“認識的”,怎么辦?用一個中間人,這個中間人它既認識顯示器,又認識打印機。

           于是就好辦了。把顯示器上圖像換算成DC形式保存在內(nèi)存中,打印機又認識DC,于是又從DC中提出“圖像”換算成自己的打印“形式”。

            于是,圖像就被打印了。所以,不管你是哪個廠家生產(chǎn)的打印機,它都能被打印出來。

二、 同樣對不同的顯示器,為什么會顯示同樣的圖像呢?一樣DC。

          再進一步對于顯示器不同程序(窗體或圖像)來說,因為保護模式的存在,相互并不能直接“通信”,你的圖像畫到我的窗體上來。各自

          有各自的“主權(quán)”,是不容侵犯的。怎么辦?

           DC中間人又出現(xiàn)了,把你的窗體保存到內(nèi)存的DC中,我的窗體通過DC又能識別或操作。

          

三、  上面是中間人的作用。中間人DC的內(nèi)部是什么呢,就是一個數(shù)據(jù)結(jié)構(gòu),把圖像分門別類的存儲在相關(guān)的屬性或者方法上。



        



嗯,這是個人理解,看下別人的文章


文章一:


         在mfc中經(jīng)常看到DC(Device Context),還有CDC,HDC等等一些組合,對此有些不明白的,學(xué)習(xí)后得到以下經(jīng)驗,分享如下:


      在計算機中, 一張圖像的實質(zhì)只是數(shù)據(jù),很多的0和1的組合. 它只是數(shù)據(jù), 至于如何顯示它呢, 毫無疑問,


       這涉及到硬件設(shè)備, 即顯示器\打印機等.那么現(xiàn)在的問題是我有表示圖像的數(shù)據(jù)流,如何將這些數(shù)據(jù)流代表的圖像描繪出來,即將這些數(shù)據(jù)流解釋為圖像而不是其他的什么東西呢?


       對應(yīng)于不同的數(shù)據(jù)結(jié)構(gòu), 微軟就搞了一個Device Context, 它能映射到顯示設(shè)備,即它代表了真正的硬件.將數(shù)據(jù)流交給電腦屏幕的DeviceContext, 顯示的細節(jié)交給它了. 但是微軟沒有提供如此簡潔的直覺性操作,在微軟看來, 圖像的顯示是該圖像的數(shù)據(jù)流從一個設(shè)備到另一個設(shè)備的過程.我們看看這意味著什么? 即我們在做顯示圖像這么簡單的操作時,我們不得不創(chuàng)建一個臨時的設(shè)備, 將其作為數(shù)據(jù)流到達目標(biāo)設(shè)備的過渡,在此之前還必須將圖像和臨時設(shè)備進行關(guān)聯(lián).


     1.DC實際上是GDI內(nèi)部保存的數(shù)據(jù)結(jié)構(gòu),DC與特定的顯示設(shè)備相關(guān),對于一個他的對象,會具體的包涵該對象的內(nèi)容,顯示細節(jié)等所有信息,不用用戶自己去定義,有一套默認信息,當(dāng)然可以自己來修改。


     2. 必須用這樣一個中間結(jié)構(gòu)體來進行中間傳輸,需要傳輸?shù)牡胤骄褪牵河嬎銠C-》顯示設(shè)備。


     3.所有的繪圖操作的調(diào)用都是通過一個設(shè)備描述表類型的對象來實現(xiàn),這個類對象封裝了Windows API(Application Programming Interface,應(yīng)用程序編程接口)函數(shù)中關(guān)于劃線、作圖和輸入輸出文本的的相關(guān)操作。設(shè)備描述表允許在窗口上進行與設(shè)備無關(guān)的繪圖操作,設(shè)備描述表可以用在往屏幕、打印機或者圖元文件的繪圖操作。


     4.由于用于傳輸?shù)脑O(shè)備,內(nèi)容不同,又分為幾種不同的dc:
       (1).CDC:包涵傳輸數(shù)據(jù)的設(shè)備環(huán)境和成員函數(shù),
       (2).HDC:HDC是DC的句柄,
       (3).pDC:一個指向設(shè)備環(huán)境的指針,pDC是類指針。  


hDC與pDC的區(qū)別:


     1.通過pDC獲得hdc:       HDC hdc=pDC->GetSafeHdc();      
     2.通過hdc獲得pDC:       CDC *pDC=new CDC;      pDC->Attach(hdc);



---------------------------------------------------------------

文章二:

在現(xiàn)實生活中我們要顯示一張圖像, 是一件很簡單的事情. 投射到計算機中, 則要復(fù)雜得多, 因為計算機不是現(xiàn)實世界, 但為了真實地反映現(xiàn)實世界, 走更多的彎路是必然的. 在計算機中, 一張圖像的實質(zhì)只是數(shù)據(jù), 很多的0和1的組合. 它只是數(shù)據(jù), 至于如何顯示它呢, 毫無疑問, 這涉及到硬件設(shè)備, 即顯示器\打印機等. 那么現(xiàn)在的問題是我有表示圖像的數(shù)據(jù)流, 如何將這些數(shù)據(jù)流代表的圖像描繪出來, 即將這些數(shù)據(jù)流解釋為圖像而不是其他的什么東西呢?.


如果我們能直接控制硬件, 那么我們可以將這些數(shù)據(jù)流塞給顯示器或打印機, 然后讓它們進行解釋. 如果真的這么簡單就好了, 我可以任意構(gòu)造一串?dāng)?shù)據(jù)流, 然后命令顯示設(shè)備進行解釋, 至于解釋成什么那我們不要管了, 美女或俊男這都不在我們掌握之內(nèi), 因為數(shù)據(jù)流是我們?nèi)我鈽?gòu)造的嗎!


問題是我們不能直接控制, 結(jié)果是我們只能間接控制. 對應(yīng)于數(shù)據(jù)結(jié)構(gòu), 微軟就搞了一個Device Context, 它能映射到顯示設(shè)備, 即它代表了真正的硬件. 如果我們能控制好Device Context, 那么我們也就能控制好真正的硬件.比如說, 我們擁有一些數(shù)據(jù)流, 我們也知道它代表了一張比較好看的圖像. 現(xiàn)在想將它顯示在電腦屏幕上, 該如何做呢?


直覺思維告訴我們: 將數(shù)據(jù)流交給電腦屏幕的Device Context, 顯示的細節(jié)叫給它了. 但是微軟沒有提供如此簡潔的直覺性操作, 在微軟看來, 圖像的顯示是該圖像的數(shù)據(jù)流從一個設(shè)備到另一個設(shè)備的過程. 我們看看這意味著什么? 即我們在做顯示圖像這么簡單的操作時, 我們不得不創(chuàng)建一個臨時的設(shè)備, 將其作為數(shù)據(jù)流到達目標(biāo)設(shè)備的過渡, 在此之前還必須將圖像和臨時設(shè)備進行關(guān)聯(lián).


HBITMAP hBitmap = LoadBitmap(...);
// 創(chuàng)建臨時設(shè)備, 即通常說的內(nèi)存DC, 而這個設(shè)備要與目標(biāo)設(shè)備兼容
// "兼容"就是指兩個設(shè)備在特性上面要吻合, 不能沖突, 說白了就是
// 屬性相同.

HDC pCurrentDC = CreateDC(...);
HDC hTmpDC = CreateCompatibleDC(pCurrentDC);
// 將Bitmap和臨時設(shè)備進行關(guān)聯(lián), 假設(shè)hbitmap已經(jīng)成功加載
HBITMAP hOldBitmap = reinterpret_cast<HBITMAP>SelectObject(hTmpDC,  hBitmap);

// 從臨時設(shè)備到目標(biāo)設(shè)備, 如果這個目標(biāo)設(shè)備是顯示器就是顯示圖像
BitBlt(hCurrentDC, 0, 0, nWidth, nHeight, &hTmpDC, 0, 0, SRCCOPY);

// 斷開臨時設(shè)備和Bitmap的關(guān)聯(lián)
SelectObject(hTmpDC, hOldBitmap);

// 釋放臨時設(shè)備
ReleaseDC(hTmpDC);

以上代碼做解釋用, 從中可以看出Device Context最大的特點是SelectObject,
而這個Object是Device Context的屬性之一, 同時有時必須的, 為什么這樣講呢?
因為每個Device Context創(chuàng)建后都有一系列默認的屬性O(shè)bject. 選進了新的Object,
操作完了還要將原來的屬性O(shè)bject再設(shè)定回去.


 


Device context
設(shè)備上下文(我更喜歡稱作 設(shè)備相關(guān)性)


A device context is a structure that defines a set of graphic objects and their associated attributes, as well as the graphic modes that affect output.
DC是一個包含了一系列圖形對象(及屬性)和影響圖形輸出模式的結(jié)構(gòu)。


Unlike most of the structures, an application never has direct access to the DC; instead, it operates on the structure indirectly by calling various functions.
不像其他一些常見的結(jié)構(gòu),程序從不直接操作DC,而是通過調(diào)用各式各樣函數(shù)來間接進行操作。


現(xiàn)在就明白了,什么是DC了!原來就是那些映象模式和畫筆什么的啊。
再來看看Graphic objects究竟含有哪些東西。說實話我真不記得有哪些了。
位圖、畫刷、調(diào)色板、字體、路徑、畫筆、區(qū)域——7種
看起來都理所當(dāng)然,呵呵。


Device independence
設(shè)備無關(guān)性


Device independence is one of the chief features of Microsoft? Windows?.
這個特性是MS Windows的主要特性之一


Applications can draw and print output on a variety of devices.
The software that supports this device independence is contained in two dynamic-link libraries.
The first, Gdi.dll, is referred to as the graphics device interface (GDI);
實現(xiàn)設(shè)備無關(guān)性第一個需要的DLL是GDI.dll


the second is referred to as a device driver.
第二個是設(shè)備驅(qū)動


The name of the second depends on the device where the application draws output.
For example,
if the application draws output in the client area of its window on a VGA display, this library is Vga.dll;
如果是在VGA顯示器上的客戶區(qū)域里做圖形輸出的話,就調(diào)用的是Vga.dll的設(shè)備驅(qū)動


if the application prints output on an Epson FX-80 printer, this library is Epson9.dll.
如果是在愛普生的FX-80打印機上,就是調(diào)用的Epson9.dll了


An application must inform GDI to load a particular device driver and,
once the driver is loaded, to prepare the device for drawing operations (such as selecting a line color and width, a brush pattern and color, a font typeface, a clipping region, and so on).
程序必須通知GDI調(diào)用專屬的設(shè)備驅(qū)動,一旦設(shè)備驅(qū)動加載完畢,就可以進行作圖了。


These tasks are accomplished by creating and maintaining a device context (DC).
通過創(chuàng)建并保存DC就可以實現(xiàn)上述操作。




本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關(guān)于memory device context內(nèi)存設(shè)備上下文和位圖
對Windows程序中設(shè)備上下文DC(device context)的理解
VC中CDC與HDC的區(qū)別以及二者之間的轉(zhuǎn)換
CClientDC?和?CDC?的區(qū)別
CreateCompatibleDC
MFC中簡單繪圖幾種方式
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服

主站蜘蛛池模板: 三明市| 双辽市| 旬邑县| 邢台县| 河北区| 溆浦县| 淮安市| 黄陵县| 五台县| 南投县| 清镇市| 铜鼓县| 周至县| 清河县| 鄂托克前旗| 肥城市| 静宁县| 邳州市| 济源市| 个旧市| 汽车| 政和县| 罗田县| 镇坪县| 保德县| 忻州市| 嘉荫县| 吉安县| 南宁市| 天峨县| 沈丘县| 遵义市| 陆丰市| 郁南县| 信丰县| 抚顺市| 乌兰浩特市| 揭西县| 临汾市| 北京市| 道孚县|