日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

裁剪(Clipping)-Window GDI

發布時間:2025/3/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 裁剪(Clipping)-Window GDI 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
裁剪(Clipping)-Window GDI

http://blog.csdn.net/windcsn/article/details/492105

裁剪是在一個應用程序的窗口中限制輸出區域或路徑的過程,下面討論裁剪.

關于裁剪

應用程序以各種方法來使用剪切。WORD程序和電子表格程序裁剪鍵盤輸入來避免其出現在頁或表格的邊界;CAD和繪畫程序裁剪圖形輸出是為了避免在圖畫的邊界被覆蓋。

一個裁剪區域是一個直線或曲線邊的區域;一個裁剪路徑是邊可以為直線、曲線或他們的組合的區域。更多的信息參見區域和路徑。

?

區域

區域可以是一個矩形、多邊形、橢圓形(或他們兩個或三個的組合的圖形),他們能夠被填充、著色、被轉向、也可以加邊框并且被用來執行點擊測試(為光標位置測試)。

關于區域

下面的三種已經被填充和加邊框了。

?


路徑

路徑是一到多個圖像(圖形),他們可以被填充,有輪廓,或者兩者都有。路徑用在繪畫和著色的應用程序中。CAD應用程序使用路徑來創建獨特的裁減區域,畫出不規則的圖形外觀,然后填充這些不規則的圖形內部。一個不規則的圖形是由Bzier曲線和直線組成的圖形。(規則的圖形包括橢圓、圓、矩形、多邊形)

關于路徑

路徑是與DC相關聯的對象之一;然而不像默認對象(筆、刷子、字體)是任何新的DC的一部分,沒有默認的路徑對象。

?

裁減區域

裁減區域是應用程序可以選進DC的圖形對象之一。通常是一個矩形。如果沒有提供裁減區域的話,有些DC提供一個預定義的或默認的裁減區域。例如,如果你從BeginPaint函數獲得了一個DC的HANDLE,DC包含一個相對應于需要被重繪的無效矩形的預定義矩形的裁減區域。然而,當你通過GetDC而提供NULL作為hWnd參數時獲得的設備HANDLE,或者通過CreateDC函數創建的,DC并不包含默認的裁減區域。更多的關于BeginPaint返回的DC的內容參見Painting and Drawing;而CreateDC和GetDC返回的DC信息參見Device Contexts.

應用程序可以在裁減區域上執行各種操作。許多操作需要一個標示區域的HANDLE,而有些不需要。例如,應用程序可以直接在一個DC的裁減區域上執行下面操作:

ü?????????通過傳遞相應的線、弧、位圖、文本或填充圖形給PtVisible函數來判斷圖形輸出是否在區域的邊界。

ü?????????通過調用RectVisible函數來判斷區域和客戶區的部分存在交集。

ü?????????通過傳遞給OffsetClipRgn函數一個指定的偏移來移動一個存在的區域

ü?????????通過調用ExcludeClipRect函數來從當前裁減區中去除客戶區的某矩形部分。

ü?????????調用IntersectClipRect函數來合并當前裁減區域和客戶區的矩形區域

在獲得一個裁減區域的HANDLE之后,應用程序能執行通常區域進行的任何操作,如下:

ü?????????通過調用CombineRgn來合并當前的裁減區域和第二個區域

ü?????????調用EqualRgn來比較當前裁減區域和第二個區域

ü?????????通過調用PtInRegion來判斷一個點是否在當前裁減區域的副本內部

?

裁減路徑

和裁減區域一樣,裁減路徑是另一個可被應用程序選進DC中的圖形對象。和裁減區域不同的是,裁減路徑一直由應用成天許來創建,通常用來裁減一到多個不規則圖形。例如,一個應用程序使用線和曲線得到一個字符串文本中字符路徑。

為了創建裁減路徑,首先創建一個路徑來描述不規則圖形是必要的。路徑通過在BeginPath和EndPath之間調用適當的GDI函數來創建,這個函數集合被叫做路徑支架。更多的關于路徑和路徑支架的信息參見Paths.

在路徑被創建之后,能通過SelectClipPath函數來將其轉換為裁減路徑,標示一個DC并指定使用模式。使用模式決定了系統怎么樣合并原來的裁減區域和新的裁減路徑。下面是使用模式的介紹:

模式

描述

RGN_AND

裁減路徑包含當前路徑和設備參見區域的交集(重疊部分)

RGN_COPY

裁減路徑是當前路徑

RGN_DIFF

裁減路徑是設備內容裁減區域減去當前路徑與其的交集

RGN_OR

包含兩者,是并集

RGN_XOR

兩者的并去掉交集

?

使用裁減

本節包含一個例子介紹怎么樣生成一個由字符串組成的裁減路徑。例子創建一個邏輯字體并使用它在一個裁減路徑中畫一個字符串,然后用水平和垂直線來填充路徑。

// DoClipPat - Draws a clip path using the specified string // Return value - TRUE if successful; FALSE otherwise // lplf - address of a LOGFONT structure that defines the font to //????????use to draw the clip path // lpsz - address of a string to use for the clip path ? BOOL DoClipPath(LPLOGFONT lplf, LPSTR lpsz) { ????LOGFONT lf;???????????// logical font structure ????HFONT hfont;??????????// new logical font handle ????HFONT hfontOld;???????// original logical font handle ????HDC hdc;??????????????// display DC handle ????int nXStart, nYStart; // drawing coordinates ????RECT rc;??????????????// rectangle structure for painting window ????SIZE sz;??????????????// size structure that receives text extents ????int nStrLen;??????????// length of the string ????int i;????????????????// loop counter ????????HRESULT hr; ????????size_t * pcch; ????// Retrieve a cached DC for the window. ? ????hdc = GetDC(hwnd); ? ????// Erase the current window contents. ? ????GetClientRect(hwnd, &rc); ????FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH)); ? ????// Use the specified font to create a logical font and select it ????// into the DC. ? ????hfont = CreateFontIndirect(lplf); ????if (hfont == NULL) ????????return FALSE; ????hfontOld = SelectObject(hdc, hfont); ? ????// Create a clip path. ? ????????hr = StringCchLength(lpsz, STRSAFE_MAX_CCH, pcch); ????????if (FAILED(hr)) ????????{ ????????// TODO: write error handler ????????} ????????nStrLen = *pcch ????BeginPath(hdc); ????????TextOut(hdc, nXStart, nYStart, lpsz, nStrLen); ????EndPath(hdc); ????SelectClipPath(hdc, RGN_DIFF); ? ????// Retrieve the dimensions of the rectangle surrounding ????// the text. ? ????GetTextExtentPoint32(hdc, lpsz, nStrLen, &sz); ? ????// Draw horizontal lines through the clip path. ? ????for (i = nYStart + 1; i < (nYStart + sz.cy); i += 3) ????{ ???????MoveToEx(hdc, nXStart, i, (LPPOINT) NULL); ???????LineTo(hdc, (nXStart + sz.cx), i); ????} ? ????// Draw vertical lines through the clip path. ? ????for (i = nXStart + 1; i < (nXStart + sz.cx); i += 3) ????{ ???????MoveToEx(hdc, i, nYStart, (LPPOINT) NULL); ???????LineTo(hdc, i, (nYStart + sz.cy)); ????} ? ????// Select the original font into the DC and release the DC. ? ????SelectObject(hdc, hfontOld); ????DeleteObject(hfont); ????ReleaseDC(hwnd, hdc); ? ????return TRUE; }

總結

以上是生活随笔為你收集整理的裁剪(Clipping)-Window GDI的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。