求助:关于画图的一个问题。
我在一个对话框上画了个图,但是每次当我打开新的对话框时(盖住图),关闭这个新的后,图被盖住的那部分就变了颜色,不知道为什么,谢谢各位答疑释惑! 问题点数:20、回复次数:8Top
1 楼syy64(太平洋)回复于 2006-03-01 14:45:28 得分 0
你画图的程序是在Onpaint函数里吗?Top
2 楼sojoy131(小菜鸟要变大菜鸟)回复于 2006-03-01 14:53:21 得分 0
是的。不知道哪出了问题,郁闷~Top
3 楼cpio(备注)回复于 2006-03-01 14:53:22 得分 0
你得在OnPaint里面绘制
不能用个按钮来绘Top
4 楼cpio(备注)回复于 2006-03-01 14:55:23 得分 0
会不会是什么对象没有释放啊Top
5 楼sojoy131(小菜鸟要变大菜鸟)回复于 2006-03-01 14:59:42 得分 0
我是在一个list box上绘的。现在的情况是,我画出这个图,然后打开别的程序,再看这幅图,就变色了~Top
6 楼sojoy131(小菜鸟要变大菜鸟)回复于 2006-03-01 15:06:30 得分 0
我看看了,应该释放的我都释放了啊。Top
7 楼Mackz(在相互)回复于 2006-03-01 21:34:53 得分 0
多一点代码。Top
8 楼sojoy131(小菜鸟要变大菜鸟)回复于 2006-03-02 08:52:49 得分 0
void CListDraw::OnPaint()
{
CPaintDC dc(this); // device context for painting
/////////////////------------------
CRgn hrgn;
CRect rect;
GetClientRect(rect);
hrgn.CreateRectRgnIndirect(&rect);
dc.SelectClipRgn(&hrgn,RGN_COPY);
//那就这样用,限制绘图区域为当前控件窗口
/////////////////------------------
if(check==0){fnInitList(dc);}
if(fnGetData()==1){fnDrawData(dc);}
ReleaseDC(&dc);
}
BOOL CListDraw::fnInitList(CDC &dc)
{
/////////////////------------------
CRgn hrgn;
CRect rect;
GetClientRect(rect);
hrgn.CreateRectRgnIndirect(&rect);
dc.SelectClipRgn(&hrgn,RGN_COPY); //MSDN上不是说CDC::SelectClipRgn吗?
//那就这样用,限制绘图区域为当前控件窗口
/////////////////------------------
CBrush *newBrush; CBrush *oldBrush;
newBrush = new CBrush(m_bgrColor);
oldBrush = dc.SelectObject(newBrush); //选择画线的绘图对象
dc.Rectangle(-1,-1,rect.right+1,rect.bottom+1);
dc.SelectObject(oldBrush);
delete newBrush;
//绘制网格
double fPerLength = 1.0f*rect.right/12.0f;
double fPerHigh = 1.0f*rect.bottom/4.0f;
//为提高精度,任何运算应为浮点数,只在最后作图时候由系统转换
CPen *gridPen;
gridPen = new CPen(PS_DOT,0,RGB(255,0,0));
dc.SelectObject(gridPen);
dc.MoveTo(0,fPerHigh); dc.LineTo(rect.right,fPerHigh);
dc.MoveTo(0,fPerHigh*2); dc.LineTo(rect.right,fPerHigh*2);
dc.MoveTo(0,fPerHigh*3); dc.LineTo(rect.right,fPerHigh*3);
//绘制横网格线
dc.MoveTo(fPerLength,0); dc.LineTo(fPerLength,rect.bottom);
dc.MoveTo(fPerLength*2,0); dc.LineTo(fPerLength*2,rect.bottom);
dc.MoveTo(fPerLength*3,0); dc.LineTo(fPerLength*3,rect.bottom);
dc.MoveTo(fPerLength*4,0); dc.LineTo(fPerLength*4,rect.bottom);
dc.MoveTo(fPerLength*5,0); dc.LineTo(fPerLength*5,rect.bottom);
dc.MoveTo(fPerLength*6,0); dc.LineTo(fPerLength*6,rect.bottom);
dc.MoveTo(fPerLength*7,0); dc.LineTo(fPerLength*7,rect.bottom);
dc.MoveTo(fPerLength*8,0); dc.LineTo(fPerLength*8,rect.bottom);
dc.MoveTo(fPerLength*9,0); dc.LineTo(fPerLength*9,rect.bottom);
dc.MoveTo(fPerLength*10,0); dc.LineTo(fPerLength*10,rect.bottom);
dc.MoveTo(fPerLength*11,0); dc.LineTo(fPerLength*11,rect.bottom);
dc.MoveTo(fPerLength*12,0); dc.LineTo(fPerLength*12,rect.bottom);
//绘制纵网格线
delete gridPen;
return true;
check=1;
}
int CListDraw::fnGetData()
{
for(int i=0;i<=11;i++){data1[i]=i*5;}
return 1;
}
void CListDraw::fnDrawData(CDC &dc)
{
fnFindMax();
CRect rect;
GetClientRect(rect);
//定义坐标最小区间
double fPerLength = 1.0f*rect.right/para1;
double fPerHigh = 1.0f*rect.bottom/para2;
//画图
CPen *DataPen;
DataPen = new CPen(PS_SOLID,1,RGB(34,0,255));
dc.SelectObject(DataPen);
for(int j=0;j<=10;j++)
{
dc.MoveTo(fPerLength*j,rect.bottom-(data1[j]*rect.bottom/max)*para3);
dc.LineTo(fPerLength*(j+1),rect.bottom-(data1[j+1]*rect.bottom/max)*para3);
}
dc.SelectObject(DataPen);
delete DataPen;
}
多谢各位高手赐教~Top




