CDC PatBlt 函式詳解。

2021-05-21 18:49:50 字數 4208 閱讀 6927

函式功能:該函式使用當前選入指定裝置環境中的刷子繪製給定的矩形區域。通過使用給出的光柵操作來對該刷子的顏色和表面顏色進行組合。

函式原型:bool patblt(hdc hdc, int nxleft, int nyleft, int nwidth, int nheight, dword dwrop);

引數:hdc:裝置環境控制代碼。

nxleft:指定要填

充的矩形左上角的x軸座標,座標按邏輯單位表示。

nyleft:指定要填充的矩形左上角的y軸座標,座標按邏輯單位表示。

nwidth:指定矩形的寬度,按邏輯單位表示寬度。

nheight:指定矩形的高度,按邏輯單位表示高度。

dwrop:指定光柵操作碼。該操作碼可以取下列值,這些值的含義如下:

patcopy:將指定的模式拷貝到目標點陣圖中。

patinvert:使用布林or(或)操作符將指定模式的顏色與目標矩形的顏色進行組合。

dstinvert:將目標矩形反向。

whiteness:使用物理調色盤中與索引1有關的顏色來填充目標矩形。(對於預設的物理調色盤而言,該顏色為白色)。

返回值:如果函式執行成功,則返回值為非零;如果函式執行失敗,則返回值為0。

備註:該函式的引數dwrop取值限定為全部256個三元光柵操作有限子集。特別地,涉及源矩形的操作碼不能使用。

函式功能:該函式對指定的源裝置環境區域中的畫素進行位塊(bit_block)轉換,以傳送到目標裝置環境。

函式原型:bool bitblt(hdc hdcdest,int nxdest,int nydest,int nwidth,int nheight,hdc hdcsrc,int nxsrc,int nysrc,dword dwrop);

引數:hdcdest:指向目標裝置環境的控制代碼。

nxdest:指定目標矩形區域左上角的x軸邏輯座標。

nydest:指定目標矩形區域左上角的y軸邏輯座標。

nwidth:指定源和目標矩形區域的邏輯寬度。

nheight:指定源和目標矩形區域的邏輯高度。

hdcsrc:指向源裝置環境的控制代碼。

nxsrc:指定源矩形區域左上角的x軸邏輯座標。

nysrc:指定源矩形區域左上角的y軸邏輯座標。

dwrop:指定光柵操作**。這些**將定義源矩形區域的顏色資料,如何與目標矩形區域的顏色資料組合以完成最後的顏色。

下面列出了一些常見的光柵操作**:

dstinvert:表示使目標矩形區域顏色取反。

mergecopy:表示使用布林型的and(與)操作符將源矩形區域的顏色與特定模式組合一起。

mergepaint:通過使用布林型的or(或)操作符將反向的源矩形區域的顏色與目標矩形區域的顏色合併。

notsrccopy:將源矩形區域顏色取反,於拷貝到目標矩形區域。

notsrcerase:使用布林型別的or(或)操作符組合源和目標矩形區域的顏色值,然後將合成的顏色取反。

patcopy:將特定的模式拷貝到目標點陣圖上。

patpaint:通過使用布林or(或)操作符將源矩形區域取反後的顏色值與特定模式的顏色合併。然後使用or(或)操作符將該操作的結果與目標矩形區域內的顏色合併。

patinvert:通過使用xor(異或)操作符將源和目標矩形區域內的顏色合併。

srcand:通過使用and(與)操作符來將源和目標矩形區域內的顏色合併。

srccopy:將源矩形區域直接拷貝到目標矩形區域。

srcerase:通過使用and(與)操作符將目標矩形區域顏色取反後與源矩形區域的顏色值合併。

srcinvert:通過使用布林型的xor(異或)操作符將源和目標矩形區域的顏色合併。

srcpaint:通過使用布林型的or(或)操作符將源和目標矩形區域的顏色合併。

whiteness:使用與物理調色盤中索引1有關的顏色填充目標矩形區域。(對於預設物理調色盤來說,這個顏色就是白色)。

返回值:如果函式成功,那麼返回值非零;如果函式失敗,則返回值為零。

備註:如果在源裝置環境中可以實行旋轉或剪下變換,那麼函式bitblt返回乙個錯誤。如果存在其他變換(並且目標裝置環境中匹配變換無效),那麼目標裝置環境中的矩形區域將在需要時進行拉伸、壓縮或旋轉。

如果源和目標裝置環境的顏色格式不匹配,那麼bitblt函式將源場景的顏色格式轉換成能與目標格式匹配的格式。當正在記錄乙個增強型圖元檔案時,如果源裝置環境標識為乙個增強型圖元檔案裝置環境,那麼會出現錯誤。如果源和目標裝置環境代表不同的裝置,那麼bitblt函式返回錯誤。

windows ce:在windows ce 1.0版中,引數dwrop只可以指定為下列值:srccopy、srcand、srcpaint、srcinvert。在windows ce 2.0版中,引數dwrop可以是任何光柵操作**值。

void invalidate( bool berase = true );

該函式的作用是使整個視窗客戶區無效。視窗的客戶區無效意味著需要重繪,例如,如果乙個被其它視窗遮住的視窗變成了前台視窗,那麼原來被遮住的部分就是無效的,需要重繪。這時windows會在應用程式的訊息佇列中放置wm_paint訊息。mfc為視窗類提供了wm_paint的訊息處理函式onpaint,onpaint負責重繪視窗。檢視類有一些例外,在檢視類的onpaint函式中呼叫了ondraw函式,實際的重繪工作由ondraw來完成。引數berase為true時,重繪區域內的背景將被擦除,否則,背景將保持不變。

它和 updatewindow( )區別在於:

updatewindow( )的作用是使視窗立即重繪。呼叫invalidate等函式後視窗不會立即重繪,這是由於wm_paint訊息的優先順序很低,它需要等訊息佇列中的其它訊息傳送完後才能被處理。呼叫updatewindow函式可使wm_paint被直接傳送到目標視窗,從而導致視窗立即重繪。

onpaint()與onerasebkgnd()區別與聯絡

在mfc中 任何乙個window元件的繪圖 都是放在這兩個member function中

在設定上 onerasebkgnd()是用來畫底圖的 而onpaint()是用來畫主要物件的

舉例說明 乙個按鈕是灰色的 上面還有文字

則onerasebkgnd()所做的事就是把按鈕畫成灰色

而onpaint()所做的事就是畫上文字

既然這兩個member function都是用來畫出元件的

那為何還要分onpaint() 與 onerasebkgnd() 呢

其實onpaint() 與 onerasebkgnd() 特性是有差的:

1.         onerasebkgnd()的要求是快速 在裡面的繪圖程式最好是不要太耗時間因為每當window元件有任何小變動 都會馬上呼叫onerasebkgnd()

2.         onpaint() 是只有在程式有空閒的時候才會被呼叫

3.         onerasebkgnd() 是在 onpaint() 之前呼叫的

所以 onpaint()被呼叫一次之前 可能會呼叫onerasebkgnd()好幾次

如果我們是乙個在做圖形化使用者介面的人,常需要把一張美美的設為我們dialog的底圖,把繪圖的程式**放在onpaint() 之中,可能會常碰到一些問題,比方說拖曳乙個視窗在我們做的dialog上面一直移動,則dialog會變成灰色直到動作停止才恢復,這是因為每次需要重繪的時候 程式都會馬上呼叫onerasebkgnd(), onerasebkgnd()就把dialog畫成灰色而只有動作停止之後 程式才會呼叫onpaint() 這時才會把我們要畫的底圖貼上去這個問題的解法 比較差點的方法是把onerasebkgnd() 改寫成不做事的function如下所示:

bool cmydlg::onerasebkgnd(cdc* pdc)

以上本來是會呼叫cdialog::onerasebkgnd() 但是如果我們不呼叫的話程式便不會畫上灰色的底色了比較好的做法是直接將繪圖的程式從onpaint()移到onerasebkgnd()來做如下所示:

// m_bmpbkgnd 為一cbitmap物件且事先早已載入我們的底圖

// 底圖的大小與我們的視窗client大小一致

bool cmydlg::onerasebkgnd(cdc* pdc)

每當重新繪畫視窗的乙個無效區域時,windows就給視窗傳遞一條wm_erasebkgnd訊息。當視窗沒有處理給訊息時,defwindowproc()就自動擦除視窗的背景,使用的是與該視窗關聯的wndclass結構中的hbrbackground欄位確定的刷子。

這樣,在自己的**中處理wm_erasebkgnd訊息,我們可以動態的選擇視窗背景的顏色。

mod函式詳解

我們知道,mod函式是乙個求餘函式,其格式為 mod nexp1,nexp2 即是兩個數值表示式作除法運算後的餘數。那麼 兩個同號整數求餘與你所知的兩個正數求餘完全一樣 即兩個負整數與兩個正整數的演算法一樣 一 兩個異號整數求餘 1.函式值符號規律 餘數的符號 mod 負,正 正 mod 正,負 負...

php header 函式詳解

一 作用 php只是以http協議將html文件的標頭送到瀏覽器,告訴瀏覽器具體怎麼處理這個頁面,至於傳送的內容則需要熟悉一下http協議了,與php無關了,可參照http www.w3.org protocols rfc2616 rfc2616。傳統的標頭一定包含下面三種標頭之一,並只能出現一次。...

select函式詳解

select的機制中提供了乙個fd set的資料結構,實際上是long型別的陣列,每乙個陣列元素都能與一開啟的檔案控制代碼 不管是socket控制代碼,還是其他檔案或命名管道或裝置控制代碼 建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select 時,由核心根據io狀態修改fd set的內容,由...