1、矩形填充图
(1)、填充矩形图函数FillRect():用指定的画刷填充一个无边线的矩形区域(上边界和左边界)
Void FillRect(
LPCRECT lpRect, //将要填充的矩形
CBrush* pBrush //填充矩形所需的画刷
)
(2)、单色矩形填充函数
void FillSolidRect(
LPCRECT lpRect, //填充的矩形
COLORREF clr //填充矩形的颜色
)
(3)、实例
创建位图资源IDB_BITMAP1
在对话框的OnPaint()函数里添加绘制代码
CPaintDC dc(this);
CBrush brush1(HS_HORIZONTAL,RGB(255,0,0)); //横纹画刷
dc.FillRect(CRect(10,30,150,70),&brush1);
CBrush brush2(HS_VERTICAL,RGB(0,255,0)); //竖纹画刷
dc.FillRect(CRect(10,80,150,120),&brush2);
CBrush brush3(HS_FDIAGONAL,RGB(255,0,0)); //正斜纹画刷
dc.FillRect(CRect(10,130,150,170),&brush3);
CBrush brush4(HS_BDIAGONAL,RGB(0,0,255)); //反斜纹画刷
dc.FillRect(CRect(10,180,150,220),&brush4);
CBrush brush5(HS_CROSS,RGB(0,255,255)); //十字条纹画刷
dc.FillRect(CRect(10,230,150,270),&brush5);
CBrush brush6(HS_DIAGCROSS,RGB(255,0,255)); //斜十字纹画刷
dc.FillRect(CRect(10,280,150,320),&brush6);
CBrush brush7;
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
brush7.CreatePatternBrush(&bmp); //位图画刷
dc.FillRect(CRect(180,30,310,310),&brush7);
dc.FillSolidRect(320,30,150,50,RGB(0,255,255)); //单色矩形填充区域
dc.FillSolidRect(320,90,150,50,RGB(255,255,0));
dc.FillSolidRect(320,150,150,50,RGB(255,0,255));
CDialogEx::OnPaint();
结果
2、扇形填充图
函数为Pie(),填充整个扇形区域
BOOL Pie(LPCRECT lpRect //扇形图对应圆的外接矩形
POINT ptStart //圆弧起点
POINT ptEnd //圆弧终点
)
BOOL Pie(
int x1,int y1,int x2,int y2,
int x3,int y3,
int x4,int y4
)
实例
在对话框的OnPaint()函数里添加绘制扇形函数
CPaintDC dc(this);
CBrush brush1(HS_HORIZONTAL,RGB(255,0,0)); //横纹画刷
CBrush brush5(HS_CROSS,RGB(0,255,255)); //十字条纹画刷
CBrush brush6(HS_DIAGCROSS,RGB(255,0,255)); //斜十字纹画刷
CBrush brush7;
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP1);
brush7.CreatePatternBrush(&bmp); //位图画刷
CBrush *oldBrush=dc.SelectObject(&brush1);
dc.Pie(CRect(10,10,150,150),CPoint(15,25),CPoint(80,130));
dc.SelectObject(&brush5);
dc.Pie(CRect(10,160,150,300),CPoint(15,175),CPoint(80,280));
dc.SelectObject(&brush6);
dc.Pie(CRect(160,10,300,150),CPoint(165,25),CPoint(230,130));
dc.SelectObject(&brush7);
dc.Pie(CRect(160,160,300,300),CPoint(165,185),CPoint(230,280));
dc.SelectObject(oldBrush);
CDialogEx::OnPaint();
结果
3、填充拖动矩形
拖动矩形的填充函数为DrawDragRect(),反复调用该成员函数可重新绘制一个拖动的矩形。如为得到视觉反馈,可以在指定鼠标位置后循环调用该函数。
void DrawDragRect(
LPCRECT lpRect,
SIZE size,
LPCRECT lpRectLast,
SIZE sizeLast,
CBrush *pBrush=NULL,
CBrush *pBrushLast=NULL
)
lpRect:指向RECT结构或CRect对象的指针
size:边界厚度
lpRectLast:指向RECT结构或CRect对象的指针,矩形的原始位置处于重新绘制状态,第一次调用设置为NULL
sizeLast:重新绘制矩形边界厚度
pBrush:指向画刷的指针
pBrushLast:指向最近使用的画刷指针
实例:
在对话框里添加成员变量
private:
CRect m_rect; //拖动的矩形
CPoint m_ptOrigin; //矩形左上角
bool m_bDraw; //是否绘制拖动的矩形
bool m_bFirstDraw; //是否第一次绘制矩形
CBrush m_brush; //填充拖放矩形的画刷
在构造函数里初始化
m_bFirstDraw=TRUE;
m_bDraw=FALSE;
m_ptOrigin=CPoint(0,0);
m_brush.CreateHatchBrush(HS_CROSS,RGB(0,0,255));
重载对话框的3个鼠标事件
void CdeskClock_testDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bFirstDraw=TRUE; //第一次绘制
m_bDraw=TRUE; //开始绘制
m_ptOrigin=point; //鼠标当前点作为矩形左上角
CDialogEx::OnLButtonDown(nFlags, point);
}
void CdeskClock_testDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
m_bDraw=FALSE; //停止绘制
CClientDC dc(this); //屏幕设备描述符
CRect rect(0,0,0,0); //空矩形
//结束填充区域
dc.DrawDragRect(rect,CSize(1,1),m_rect,CSize(1,1),NULL,NULL);
CDialogEx::OnLButtonUp(nFlags, point);
}
void CdeskClock_testDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
if(m_bDraw==TRUE)
{
CRect rect(m_ptOrigin,point); //绘制的矩形
rect.NormalizeRect(); //使矩形区域正常化
if(m_bFirstDraw==TRUE) //第一次绘制矩形
{
m_bFirstDraw=FALSE; //标识已经开始绘制
dc.DrawDragRect(rect,CSize(10,10),NULL,CSize(10,10),&m_brush,&m_brush); //绘制矩形
}
else
{
//绘制拖动矩形
dc.DrawDragRect(rect,CSize(10,10),m_rect,CSize(10,10),&m_brush,&m_brush);
}
m_rect.CopyRect(rect); //保存当前矩形
}
CDialogEx::OnMouseMove(nFlags, point);
}
结果
4、填充区域
填充一点周围的同色区域
(1)、使用当前刷从指定点开始向四周填充到颜色为指定色的边界
BOOL FloodFill(
int x,int y, //填充的起始点
COLORREF crColor //填充的颜色
)
(2)、使用当前刷从指定点开始向四周填充
BOOL ExFloodFill(
int x,int y,
COLORREF crColor,
UNIT nFillType //FLOODFILLBORDER(同FloodFill()函数):内部颜色不同但边界颜色相同的区域
//FLOODFILLSURFACE:内部颜色相同但边界颜色可以不同的区域
)
5、GDI输出字体的实际应用
CPaintDC dc(this);
LOGFONT lf;
CFont font;
CFont *pOldFont;
for(int i=0;i<5;i++)
{
dc.SetTextColor(RGB(50*i,50*i,250-50*i));
dc.GetCurrentFont()->GetLogFont(&lf);
lf.lfHeight=20+i*10;
lf.lfWidth=lf.lfHeight/2;
lf.lfWeight=500;
lf.lfItalic=i%2;
lf.lfUnderline=(i+1)%2;
lf.lfStrikeOut=i%2;
strcpy(lf.lfFaceName,"隶书");
font.CreateFontIndirect(&lf);
pOldFont=dc.SelectObject(&font);
dc.SetBkMode(TRANSPARENT);
dc.TextOut(10,10+lf.lfHeight*(i),"CFont字体输出!!!!");
font.DeleteObject();
}
CDialogEx::OnPaint();
结果