1 绘图
void CMy58View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
CPen pen(PS_SOLID, 50, RGB(0, 0, 255));
CPen *oldPen = NULL;
CBrush *brush = NULL;
CBrush *oldBrush = NULL;
brush = CBrush::FromHandle((HBRUSH)::GetStockObject(NULL_BRUSH));
dcMetaFile.SelectObject(&pen);
dcMetaFile.SelectObject(brush);
switch (m_nDrawType)
{
case 1:
dcMetaFile.SetPixel(point, RGB(0, 0, 255));
break;
case 2:
dcMetaFile.MoveTo(pointOriginal);
dcMetaFile.LineTo(point);
break;
case 3:
dcMetaFile.Rectangle(&CRect(pointOriginal, point));
break;
case 4:
dcMetaFile.Ellipse(&CRect(pointOriginal, point));
break;
}
CScrollView::OnLButtonUp(nFlags, point);
}
///
2 重绘
void CMy58View::OnDraw(CDC* pDC)
{
CMy58Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
HMETAFILE hMetaFile; //句柄
hMetaFile = dcMetaFile.Close(); //关闭以获得该句柄
pDC->PlayMetaFile(hMetaFile); //播放该句柄对应的图形
dcMetaFile.Create(); //创建Windows图元文件设备上下文,并将其附加给CMetaFileDC对象
dcMetaFile.PlayMetaFile(hMetaFile);//将上次的绘图操作保存到该CMetaFileDC对象关联的新的内存块中
DeleteMetaFile(hMetaFile);//释放句柄
}
///3 保存
void CMy58View::OnFileSave()
{
// TODO: Add your command handler code here
HMETAFILE hMetaFile;
hMetaFile = dcMetaFile.Close(); //Close后返回句柄
CopyMetaFile(hMetaFile, "file.mf"); //以file.mf为文件名保存
dcMetaFile.Create(); //Close 和 Create对应
DeleteMetaFile(hMetaFile); //释放
}
///
4 打开
void CMy58View::OnFileOpen()
{
// TODO: Add your command handler code here
HMETAFILE hMetaFile;
hMetaFile = GetMetaFile("file.mf"); //获得文件名为file.mf的metafile,返回句柄
dcMetaFile.PlayMetaFile(hMetaFile); //播放该文件
DeleteMetaFile(hMetaFile); //释放句柄
Invalidate(); //窗口重绘 进入OnDraw函数, 从而重绘,( 见 2重绘)
}
?