用CDC的Rectangle函數(shù)繪制一個(gè)矩形,代碼為
m_downPoint為CDrawView類(lèi)的CPoint類(lèi)型的私有成員,在OnLButtonDown函數(shù)中保存了鼠標(biāo)左鍵按下的位置
void CDrawView::OnLButtonUp(UINT nFlags,CPoint point)
{
//創(chuàng)建并獲得設(shè)備描述表
CClientDC dc(this);
//繪制矩形
dc.Rectangle(CRect(m_downPoint,point));
CView::OnLButtonUp(nFlags,point);
}
運(yùn)行Draw程序,在程序窗口中繪制矩形,但是當(dāng)繪制兩個(gè)相互重疊的矩形時(shí),后繪制的矩形遮蓋住了先繪制的矩形。原因在于設(shè)備描述表中有一個(gè)默認(rèn)的白色畫(huà)刷,在繪圖時(shí)會(huì)利用這個(gè)畫(huà)刷填充矩形內(nèi)部。
GetStockObject函數(shù)可以獲取一個(gè)透明畫(huà)刷。但是這個(gè)函數(shù)獲取的是一個(gè)畫(huà)刷句柄,而我們?cè)谶M(jìn)行繪制操作時(shí)需要的是一個(gè)畫(huà)刷對(duì)象。如何從畫(huà)刷句柄轉(zhuǎn)化為一個(gè)畫(huà)刷對(duì)象?利用CBrush類(lèi)提供的FromeHandle函數(shù)可以實(shí)現(xiàn)這個(gè)功能。
void CDrawView::OnLButtonUp(UINT nFlags,CPoint point)
{
//創(chuàng)建并獲得設(shè)備描述表
CClientDC dc(this);
//得到透明畫(huà)刷句柄
HBRUSH hb = (HBRUSH) GetStockObject(NULL_BRUSH);
//把畫(huà)刷句柄轉(zhuǎn)化為畫(huà)刷對(duì)象
CBrush* brush = CBrush::FromHandle(hb);
//將透明畫(huà)刷選入設(shè)備描述表
CBrush *pOldBrush = dc.SelectObject(brush);
//繪制矩形
dc.Rectangle(CRect(m_downPoint,point));
//回復(fù)先前的畫(huà)刷
dc.SelectObject(pOldBrush);
CView::OnLButtonUp(nFlags,point);
}
注意:
1.FromeHandle函數(shù)原型為 static CBrush* PASCAL FromHandle( HBRUSH hBrush );是一個(gè)靜態(tài)函數(shù),所以用CBrush::FromHandle(hb)調(diào)用方式!
2.GetStockObject函數(shù)原型為HGDIOBJ GetStockObject( int fnObject ),返回類(lèi)型為HGDIOBj,所以需要一個(gè)強(qiáng)制類(lèi)型轉(zhuǎn)換,將其轉(zhuǎn)換為HBRUSH類(lèi)型的
3.FileRect和Rectangle函數(shù)都能繪制矩形,但是FileRect函數(shù)在參數(shù)中提供了繪制使用的畫(huà)刷,因此他就直接利用此畫(huà)刷填充矩形,并不需要先把需要的畫(huà)刷選入設(shè)備描述表中。而Rectangle并沒(méi)有提供這個(gè)參數(shù),因此先要把需要的畫(huà)刷選入設(shè)備描述表中,然后再調(diào)用此函數(shù)來(lái)繪制矩形。
【天涯博客】本文地址
http://blog.tianya.cn/blogger/post_show.asp?BlogID=2613299&PostID=21739817