当前位置:首页 > 在MFC中怎样把数据保存为TXT文档的方法
//创建一个会在内存中画画的画家 CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
2、内存里面说好给的那种新的纸在哪啊? //创建一个内存中的图纸 CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC, 800, 600); 为什么上面要传入一个当前窗口类中通过GetDC得到的pDC?
因为CreateCompatibleBitmap初始化了一个与pDC指定的设备上下文兼容的位图,位图与指定的设备上下文具有相同的颜色位面数或相同的每个像素的位数。你可以试一试,如果此处传入&MemDC,完啦完啦,画家怎么画,图上都是灰色的线条,郁闷死啦。
至于CreateCompatibleBitmap的后面两个参数,指定的是图纸的大小,具体指你可以根据自己窗口大小等实际情况确定,大了无所谓,用不完后面复制的时候可以截取指定尺寸。
3、怎么让画家在这张纸上画画? //呵呵,酱紫就搞定啦~
MemDC.SelectObject(&MemBitmap);
4、内存中的画家如何画画?
完全一样,只不过是MemDC在挥笔。 MemDC.MoveTo(60, 220); MemDC.LineTo(520, 220); MemDC.LineTo(510, 223);
对啦,温馨提示,大家多半想用一种颜色填充指定矩形区域,因为InvalidateRect就是干的这事嘛,你把人家挤下来了,自然这事就得自己做啦。 MemDC.FillSolidRect(0, 0, 580, 250, RGB(1,4,1));
上面这个函数表示的是,以图纸的(0,0)位置(也就是图纸的最左上角)作为矩形的左上角坐标,画一个颜色为RGB(1,4,1),长为580,宽为250的矩形。尺寸什么的大家不必过于纠结,根据自己的窗口大小,多试几种尺寸和坐标,就能找出最合适的参数了。
需要注意的是,MemDC是在MemBitmap上画画,所以MemDC调用函数传入的坐标是MemBitmap这个图纸上的坐标,不是窗口上的坐标。
4、如何让在窗口蹲点的那位画家直接从内存画家手上复制图纸?
//下面函数的意思是:在MemDC手中的画纸上,以(0,0)处作为矩形框的左上角坐标,拉一个长为580,宽为250的复制矩形框,这个框框里面框中的图像复制到窗口中,复制矩形框的左上角与窗口的(20,50)处重合。580,250决定了复制框框的大小,(0,0)决定了复制框框在MemBitmap上的位置,(20,50)决定了复制框框在窗口上的位置。
pDC->BitBlt(20, 50, 580, 250, &MemDC, 0, 0, SRCCOPY);
下面是部分画图代码,删除了很多周边功能,如果不小心多删到了什么还请大家海涵,主要留着看个思路和框架。
1、画坐标轴的函数,你们看,我就是让 ”内存画家“ --- MemDC 画画的,表示用了双缓冲的哦,呵呵。
void CXXXDlg::DrawAxis(CDC &MemDC, LPTSTR TitleForX, LPTSTR TitleForY) {
//选择画坐标轴的画笔
CPen PenForDrawAxis(PS_SOLID, 1, RGB(0, 128, 64)); MemDC.SelectObject(PenForDrawAxis);
//绘制X轴
MemDC.MoveTo(60, 220); MemDC.LineTo(520, 220); //绘制箭头
MemDC.LineTo(510, 223); MemDC.LineTo(510, 217); MemDC.LineTo(520, 220);
//绘制Y轴
MemDC.MoveTo(60, 220); MemDC.LineTo(60, 30);
//绘制箭头
MemDC.LineTo(57, 40); MemDC.LineTo(63, 40); MemDC.LineTo(60, 30);
//设置文本的颜色
COLORREF OldColor = MemDC.SetTextColor(RGB(255, 255, 0));
//绘制标注
MemDC.TextOut(480, 230, TitleForX); MemDC.TextOut(40, 10, TitleForY);
//还原文本颜色
MemDC.SetTextColor(OldColor); }
2、画图例的函数
void CXXXDlg::DrawLegend(CDC &MemDC, CPen &PenForDraw, CPen &PenForDrawAB, CPen &PenForDrawBE) {
//设置文本的颜色
COLORREF OldColor = MemDC.SetTextColor(RGB(0, 128, 64));
//绘制图例
MemDC.SelectObject(PenForDraw); MemDC.TextOut(530, 30, _T(\ MemDC.MoveTo(530, 50); MemDC.LineTo(570, 50);
MemDC.SelectObject(PenForDrawAB); MemDC.TextOut(530, 70, _T(\ MemDC.MoveTo(530, 90); MemDC.LineTo(570, 90);
MemDC.SelectObject(PenForDrawBE); MemDC.TextOut(530, 110, _T(\ MemDC.MoveTo(530, 130); MemDC.LineTo(570, 130);
//还原文本颜色
MemDC.SetTextColor(OldColor); }
3、画曲线的函数
void CXXXDlg::DrawDynamicCurve(CDC &MemDC, CPen &Pen, deque
//选择画笔
MemDC.SelectObject(Pen); //进入临界区
EnterCriticalSection(&(m_cControllingParameters.m_cCriticalSection));
//绘制曲线
if (DisplayData.size() >= 2) {
COORDINATE XPos = 60;
for (UINT PointIndex = 1; PointIndex != DisplayData.size(); PointIndex++) {
MemDC.MoveTo(XPos++, 220 -
(COORDINATE)((double)(DisplayData[PointIndex - 1].second) / Proportion)); MemDC.LineTo(XPos, 220 -
(COORDINATE)((double)(DisplayData[PointIndex].second) / Proportion)); } }
共分享92篇相关文档