基于MFC对话框的画图,添加了编辑框和滑动块控件及picture控件,在onpaint下画图。为何执行后可以显示图形,但如果将整个对话框拖动,上面就什么都没有了?是重绘的问题吗
解决方案 »
- CListCtrl中SetItemText字数限制问题
- DirectShow 中,如何得到Filter的CLSID?
- 我在自己的类中调用AfxBeginThread(SmThread, this, THREAD_PRIORITY_NORMAL);为什么提示即使使用参数相关的查找,也未找到标识符
- 隐藏文件的图标问题?!
- 请教HOOK的几个问题,谢谢!!
- vc6做的基于对话框的程序 按确认键(ENTER) 就结束程序 如何改
- VC之路在哪里?
- 如何用ADO来创建SQL Server2000数据库??
- 关于sizeof运算符的问题
- 关于错误提示的问题
- 关于菜单栏中的TOOLBAR打钩的问题
- 求救: GetDlgItem(IDC_WAVEFORM)->GetDC() 无效
编辑框和滑动块控件 是在资源里面添加进去的?还是你程序里面写的?
[/Quote山是在资源文件里的
DC只CBitmap* pOldBmp = SelectObject(&m_bmp);
但是没有在绘制结束后SelectObject(pOldBmp);结果将m_bmp给释放了
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{ CBitmap bmp1;
CRect rc1;
CPaintDC dc1(GetDlgItem(IDC_STATIC1));
GetDlgItem(IDC_STATIC1)->GetClientRect(rc1);
bmp1.CreateCompatibleBitmap(&dc1,rc1.Width(),rc1.Height());
CDC memDC1;
memDC1.CreateCompatibleDC(&dc1);
memDC1.SelectObject(&bmp1);
//CWnd *pic;
//pic=GetDlgItem(IDC_STATIC1);
//pic->GetClientRect(rc);
CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(0,0,255));
CPen *oldpen=(CPen*)memDC1.SelectObject(&pen);
CPoint pt(rc1.CenterPoint());
int WIDTH = min(rc1.Width(), rc1.Height());
int HEIGHT = WIDTH;
int WIDTH2 = WIDTH/2;
int HEIGHT2 = WIDTH2;
int x1 = pt.x - WIDTH / 2;
int y1 = pt.y - HEIGHT / 2;
int x2 = pt.x + WIDTH / 2;
int y2 = pt.y + HEIGHT / 2;
memDC1.Ellipse(x1,y1,x2,y2);
CBrush brush;
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *oldbrush=(CBrush *)memDC1.SelectObject(&brush);
int num11,num22;
num11=(int)num1;
num22=(int)num2;
int xx,yy;
xx=num11-20;
yy=num22-20;
memDC1.Ellipse (num11,num22,xx,yy);
memDC1.ExtFloodFill(num11,num22,RGB(255,0,0),RGB(255,0,0));
brush.DeleteObject();
pen.DeleteObject();
dc1.BitBlt(0,0,rc1.Width(),rc1.Height(),&memDC1,0,0,SRCCOPY);
memDC1.SelectObject(oldpen);
memDC1.SelectObject(oldbrush);
bmp1.DeleteObject();
memDC1.DeleteDC();
CBitmap bmp2;
CRect rc2;
CPaintDC dc2(GetDlgItem(IDC_STATIC2));
GetDlgItem(IDC_STATIC2)->GetClientRect(rc2);
bmp2.CreateCompatibleBitmap(&dc2,rc2.Width(),rc2.Height());
CDC memDC2;
memDC2.CreateCompatibleDC(&dc2);
memDC2.SelectObject(&bmp2);
double v, rr,x,y,I,I1,R=8.8;
double n=fbl/2;
int i,j;
double s[3],dy[fbl][fbl],dimage[fbl][fbl];
double r[3]={1,3,-4};
double m[3]={3.85,0.82,15};
double max=0,min=0;
rr=dot(r,r);
if (rr<R*R)
{for(i=1;i<=fbl;i++)
{for(j=1;j<=fbl;j++)
{ x=(i-n)/n*R;
y=(j-n)/n*R;
s[0]=x;
s[1]=y;
s[2]=sqrt(R*R-x*x-y*y);
I=x*x+y*y;
if(I<=R*R)
v=potential(r,m,s);
else
v=0;
dy[i-1][j-1]=v;
}
}
}
max=dy[0][0];
min=dy[0][0];
for(i=1;i<=fbl;i++)
{for(j=1;j<=fbl;j++)
{ x=(i-n)/n*R;
y=(j-n)/n*R;
I1=x*x+y*y;
if(I1<R*R)
{if(max<dy[i-1][j-1])
max=dy[i-1][j-1];
if(min>dy[i-1][j-1])
min=dy[i-1][j-1];
dimage[i-1][j-1]=255*(dy[i-1][j-1]-min)/(max-min);
}
else dimage[i-1][j-1]=255;
}
}
CPen pen1;
pen1.CreatePen(PS_DOT,100,RGB(dimage,0,0));
CPen *oldpen1=(CPen*)memDC2.SelectObject(&pen1);
for(i=0+10;i<=fbl+10;i++)
for(j=0;j<=fbl;j++)
{memDC2.SetPixelV(i,j,RGB(dimage[i-10][j],dimage[i-10][j],dimage[i-10][j]));} dc2.BitBlt(0,0,rc2.Width(),rc2.Height(),&memDC2,0,0,SRCCOPY);
memDC2.SelectObject(oldpen1);
bmp2.DeleteObject();
memDC2.DeleteDC();
}
}
其中num1,num2,num3是通过编辑框获取的输入变量
void CkuangjiaDlg::OnBnClickedButton1(){UpdateData(1);
int num1,num2;
char ch1[10],ch2[10];
GetDlgItemText(IDC_EDIT1,LPTSTR(ch1),10);
GetDlgItemText(IDC_EDIT2,LPTSTR(ch2),10);
num1=atoi(ch1);
num2=atoi(ch2);
Invalidate();
}
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{ CBitmap bmp1;
CRect rc1;
CPaintDC dc1(GetDlgItem(IDC_STATIC1));
GetDlgItem(IDC_STATIC1)->GetClientRect(rc1);
bmp1.CreateCompatibleBitmap(&dc1,rc1.Width(),rc1.Height());
CDC memDC1;
memDC1.CreateCompatibleDC(&dc1);
memDC1.SelectObject(&bmp1);
//CWnd *pic;
//pic=GetDlgItem(IDC_STATIC1);
//pic->GetClientRect(rc);
CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(0,0,255));
CPen *oldpen=(CPen*)memDC1.SelectObject(&pen);
CPoint pt(rc1.CenterPoint());
int WIDTH = min(rc1.Width(), rc1.Height());
int HEIGHT = WIDTH;
int WIDTH2 = WIDTH/2;
int HEIGHT2 = WIDTH2;
int x1 = pt.x - WIDTH / 2;
int y1 = pt.y - HEIGHT / 2;
int x2 = pt.x + WIDTH / 2;
int y2 = pt.y + HEIGHT / 2;
memDC1.Ellipse(x1,y1,x2,y2);
CBrush brush;
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *oldbrush=(CBrush *)memDC1.SelectObject(&brush);
int num11,num22;
num11=(int)num1;
num22=(int)num2;
int xx,yy;
xx=num11-20;
yy=num22-20;
memDC1.Ellipse (num11,num22,xx,yy);
memDC1.ExtFloodFill(num11,num22,RGB(255,0,0),RGB(255,0,0));
brush.DeleteObject();
pen.DeleteObject();
dc1.BitBlt(0,0,rc1.Width(),rc1.Height(),&memDC1,0,0,SRCCOPY);
memDC1.SelectObject(oldpen);
memDC1.SelectObject(oldbrush);
bmp1.DeleteObject();
memDC1.DeleteDC();
CBitmap bmp2;
CRect rc2;
CPaintDC dc2(GetDlgItem(IDC_STATIC2));
GetDlgItem(IDC_STATIC2)->GetClientRect(rc2);
bmp2.CreateCompatibleBitmap(&dc2,rc2.Width(),rc2.Height());
CDC memDC2;
memDC2.CreateCompatibleDC(&dc2);
memDC2.SelectObject(&bmp2);
double v, rr,x,y,I,I1,R=8.8;
double n=fbl/2;
int i,j;
double s[3],dy[fbl][fbl],dimage[fbl][fbl];
double r[3]={1,3,-4};
double m[3]={3.85,0.82,15};
double max=0,min=0;
rr=dot(r,r);
if (rr<R*R)
{for(i=1;i<=fbl;i++)
{for(j=1;j<=fbl;j++)
{ x=(i-n)/n*R;
y=(j-n)/n*R;
s[0]=x;
s[1]=y;
s[2]=sqrt(R*R-x*x-y*y);
I=x*x+y*y;
if(I<=R*R)
v=potential(r,m,s);
else
v=0;
dy[i-1][j-1]=v;
}
}
}
max=dy[0][0];
min=dy[0][0];
for(i=1;i<=fbl;i++)
{for(j=1;j<=fbl;j++)
{ x=(i-n)/n*R;
y=(j-n)/n*R;
I1=x*x+y*y;
if(I1<R*R)
{if(max<dy[i-1][j-1])
max=dy[i-1][j-1];
if(min>dy[i-1][j-1])
min=dy[i-1][j-1];
dimage[i-1][j-1]=255*(dy[i-1][j-1]-min)/(max-min);
}
else dimage[i-1][j-1]=255;
}
}
CPen pen1;
pen1.CreatePen(PS_DOT,100,RGB(dimage,0,0));
CPen *oldpen1=(CPen*)memDC2.SelectObject(&pen1);
for(i=0+10;i<=fbl+10;i++)
for(j=0;j<=fbl;j++)
{memDC2.SetPixelV(i,j,RGB(dimage[i-10][j],dimage[i-10][j],dimage[i-10][j]));} dc2.BitBlt(0,0,rc2.Width(),rc2.Height(),&memDC2,0,0,SRCCOPY);
memDC2.SelectObject(oldpen1);
bmp2.DeleteObject();
memDC2.DeleteDC();
}
}
其中num1,num2,num3是通过编辑框获取的输入变量
void CkuangjiaDlg::OnBnClickedButton1(){UpdateData(1);
int num1,num2;
char ch1[10],ch2[10];
GetDlgItemText(IDC_EDIT1,LPTSTR(ch1),10);
GetDlgItemText(IDC_EDIT2,LPTSTR(ch2),10);
num1=atoi(ch1);
num2=atoi(ch2);
Invalidate();
}
也就是CPaintDC dc1(this);
该写你的程序试一下
Invalidate(FALSE);