CDC::FrameRgn
程序示例:
在****view类中,定义一个成员变量:
HMETAFILE m_hMetafile;
//功能实现部分主要代码
void CMFCdrawView::OnDcCwindowdc()
{
// TODO: Add your command handler code here
CWindowDC dc(AfxGetMainWnd());
dc.TextOut(0,0,"Hello CWindowDC");
}
void CMFCdrawView::OnDcCmetafiledc()
{
// TODO: Add your command handler code here
//创建
CMetaFileDC dc;
dc.Create();
//绘制命令
dc.TextOut(100,100,"DcCmetafile");
dc.MoveTo(150,150);
dc.LineTo(200,200);
//关闭,并返回句柄
m_hMetafile= dc.Close();
CClientDC dc2(this);
dc2.PlayMetaFile(m_hMetafile);
}
void CMFCdrawView::OnDcCclientdc()
{
// TODO: Add your command handler code here
CClientDC dc(this);
dc.TextOut(0,0,"Hello CClientDC");
}
void CMFCdrawView::OnDcCdc()
{
// TODO: Add your command handler code here
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);//打印到屏幕上
RECT rc={0};
rc.left=0;rc.right=200;rc.top=0;rc.bottom=100;
dc.DrawText("hello cdc",&rc,DT_MODIFYSTRING);
dc.DeleteDC();
}
void CMFCdrawView::OnPaint()
{
CPaintDC dc(this); // device context for painting
dc.TextOut(0,20,"Hell0 Paint");
//使用CMetaFile
if(m_hMetafile) dc.PlayMetaFile(m_hMetafile);
//OnGdiBitmap();
// Do not call CView::OnPaint() for painting messages
}
void CMFCdrawView::OnGdiBitmap()
{
// TODO: Add your command handler code here
CClientDC dc(this);
CDC dcBitmap;//内存dc
dcBitmap.CreateCompatibleDC(&dc);
CBitmap bmp;//位图对象
bmp.LoadBitmap(IDB_BITMAP1);//插入的图片资源
CBitmap*oldbmp=dcBitmap.SelectObject(&bmp);//放入内存dc
//dc.BitBlt(300,300,110,37,&dcBitmap,0,0,SRCCOPY);//成像
RECT rc={0};
GetClientRect(&rc);
//拉伸成像
dc.StretchBlt(0,0,rc.right,rc.bottom,&dcBitmap,0,0,101,37,SRCCOPY);
dcBitmap.SelectObject(oldbmp);
dcBitmap.DeleteDC();//删除内存dc
bmp.DeleteObject();//删除位图对象
}
void CMFCdrawView::OnGdiBrush()
{
// TODO: Add your command handler code here
//CBrush brush(HS_CROSS,RGB(0,255,0));//普通画刷
CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP2);
CBrush brush(&bmp);//位图画刷
CClientDC dc(this);
CBrush*oldbrush=dc.SelectObject(&brush);
dc.RoundRect(50,50,220,220,2,2);
dc.SelectObject(oldbrush);
brush.DeleteObject();
}
void CMFCdrawView::OnGdiFont()
{
// TODO: Add your command handler code here
CFont font;
font.CreatePointFont(500,"黑体");
CClientDC dc(this);
CFont*oldfont=dc.SelectObject(&font);
dc.TextOut(150,150,"OnGdiFont");
dc.SelectObject(oldfont);
font.DeleteObject();
}
void CMFCdrawView::OnGdiPen()
{
// 创建画笔
CPen pen(PS_SOLID,5,RGB(255,0,0));
//将画笔选择当前设备
CClientDC dc(this);
CPen * oldpen=dc.SelectObject(&pen);
dc.TextOut(10,10,"OnGdiPen");
dc.RoundRect(100,100,200,200,2,2);
dc.SelectObject(oldpen);
pen.DeleteObject();
}
void CMFCdrawView::OnGdiRgn()
{
CRgn rgn1,rgn2;
//创建
rgn1.CreateEllipticRgn(100,100,300,300);
rgn2.CreateEllipticRgn(150,100,350,300);
//几何运算
rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR);
//填充
CClientDC dc(this);
CBrush brush(RGB(255,0,0));
CBrush brush2(RGB(0,0,255));
dc.FillRgn(&rgn1,&brush);
//dc.FillRgn(&rgn2,&brush2);
//填充边框
dc.FrameRgn(&rgn1,&brush2,5,1);
//将窗口的区域设置成rgn1
AfxGetMainWnd()->SetWindowRgn(rgn1,TRUE);
}
效果:
2、
简单的鼠标绘图的例子
1 图形数据,1 起点和终点,CPoint;
2 使用整数变量确定当前绘制的图形
UINT m_nType;
m_nType=1;直线
m_nType=2;矩形
m_nType=3;椭圆
m_nType=0;不绘制图形
3 BOOL m_bFlag;//标识是否开始画线
2 绘制过程
2.1 LBUTTONDOWN消息
m_bFlag=TRUE;//开始绘图
m_ptBegin=m_ptEnd=point; //确定起点位置
2.2 MOUSEMOVE消息
if(m_bFlag)
{
//擦线
//画线
}
2.3 LBUTTONUP消息
m_bFlag=FALSE;//结束画线
模拟绘图软件,鼠标点下进行绘图,放开则绘制指定的图形。
新建立 MFC 应用程序,并按照如下操作:
在****view 中,加入成员变量:
CPoint m_ptBegin;//起点坐标
CPoint m_ptEnd;//终点坐标
UINT m_nType;//类型:1-直线,2-距形,3-圆
BOOL m_bFlag;//是否开始画线
****view中主要实现代码:
//构造函数
CMFCdraw2View::CMFCdraw2View()
{
// TODO: add construction code here
m_nType=0;
m_bFlag=FALSE;
m_ptBegin=m_ptEnd=0;
}
void CMFCdraw2View::OnDrawElipse()
{
// TODO: Add your command handler code here
m_nType=3;
}
void CMFCdraw2View::OnDrawLine()
{
// TODO: Add your command handler code here
m_nType=1;
}
void CMFCdraw2View::OnDrawRect()
{
// TODO: Add your command handler code here
m_nType=2;
}
void CMFCdraw2View::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bFlag=TRUE;//开始绘图
m_ptBegin=m_ptEnd=point; //确定起点位置
CView::OnLButtonDown(nFlags,point);
}
void CMFCdraw2View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bFlag=FALSE;//结束画线
CView::OnLButtonUp(nFlags, point);
}
void CMFCdraw2View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
if(m_bFlag)
{
//擦线
DrawShape(&dc,m_ptBegin,m_ptEnd);
//画线
DrawShape(&dc,m_ptBegin,point);
//保存终点位置,为擦线准备
m_ptEnd=point;
}
CView::OnMouseMove(nFlags, point);
}
void CMFCdraw2View::DrawShape(CDC *pDC, CPoint p1, CPoint p2)
{
//设置绘图模式,R2_NOT与当前画线处颜色相反
pDC->SetROP2(R2_NOT);
//设置画刷为透明画刷
CBrush *pOldBrush=
(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
switch (m_nType)
{
case 1://直线
pDC->MoveTo(p1);
pDC->LineTo(p2);
break;
case 2://矩形
pDC->Rectangle(p1.x,p1.y,p2.x,p2.y);
break;
case 3://椭圆
pDC->Ellipse(p1.x,p1.y,p2.x,p2.y);
break;
}
//恢复默认画刷
pDC->SelectObject(pOldBrush);
}
void CMFCdraw2View::OnUpdateDrawElipse(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetRadio(m_nType==3);//更改选中的状态
}
void CMFCdraw2View::OnUpdateDrawLine(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetRadio(m_nType==1);
}
void CMFCdraw2View::OnUpdateDrawRect(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetRadio(m_nType==2);
}
效果: