在线等各路大侠,路过进来看看啊。。用MFC 如何在edit中画函数的图形?比如y=a*ex 点击button按钮,根据公式计算画出函数曲线,在edit中显示,, 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在edit中画图首先要获得它的设备上下文,就是CDC *pDC = CEdit ::GetDC();然后创建一个GDI+对象,就可以画一些曲线了,个人觉得实用GDI+比GDI好,虽然CPU占用率会高一些,但是画贝塞尔什么曲线比较容易。 绘图必取DC,之后调用相应GDI函数 这是我引用别人的一个代码,是在onpaint中画的。可问题是我点击button1,画不出图啊,,,void CMy6Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle 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; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else if (boolpaint) { CBitmap bmp; CRect rc; CPaintDC dc2(GetDlgItem(IDC_STATIC1)); GetDlgItem(IDC_STATIC1)->GetClientRect(rc); bmp.CreateCompatibleBitmap(&dc2,rc.Width(),rc.Height()); CDC memDC; memDC.CreateCompatibleDC(&dc2); memDC.SelectObject(&bmp); CPoint pt(rc.CenterPoint()); int WIDTH = min(rc.Width(), rc.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; CPen pen; pen.CreatePen(PS_SOLID,2,RGB(0,0,255)); CPen *oldpen=(CPen *)memDC.SelectObject(&pen); CBrush brush; brush.CreateSolidBrush(RGB(255,0,0)); CBrush *oldbrush=(CBrush *)memDC.SelectObject(&brush); memDC.FillSolidRect(rc, GetSysColor(COLOR_3DFACE)); memDC.Ellipse(x1,y1,x2,y2); int x3 = pt.x - WIDTH2 / 2; int y3 = pt.y - HEIGHT2 / 2; int x4 = pt.x + WIDTH2 / 2; int y4 = pt.y + HEIGHT2 / 2; pen.DeleteObject(); pen.CreatePen(PS_SOLID, 2, RGB(255, 255, 128)); oldpen = (CPen*)memDC.SelectObject(&pen); brush.DeleteObject(); brush.CreateSolidBrush(RGB(0, 255, 0)); oldbrush=(CBrush *)memDC.SelectObject(&brush); memDC.Ellipse(x3, y3, x4, y4); dc2.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY); memDC.SelectObject(oldpen); memDC.SelectObject(oldbrush); bmp.DeleteObject(); memDC.DeleteDC(); } else { CDialog::OnPaint(); } //CDialog::OnPaint(); }我用一个 bool 类型控制是否画图, void CMy6Dlg::OnButton1() { // TODO: Add your control notification handler code here boolpaint = true; OnPaint();} 用richedit可能简单点,先在内存中画好,然后在edit里面贴出来 dc取得不对,按1楼的方式取得DC试试,另外,最好不要在OnPaint()里画,你取得了编辑框里的DC,就可以在OnButton1();试试. 我从没在编辑框里画过图,一般我在PICTURE控件里画 我在button1里实现的,有两个问题:1.//显示rect坐标 的时候怎么全是 0 啊?2.pDC->LineTo(x,y); 和 pDC->MoveTo(x,y);参数是int类型的,取值的时候不长也太大了,我想用long,duble类型的,取得值能密集一些,这样的话怎么实现啊?void CMy6Dlg::OnButton1() { // TODO: Add your control notification handler code here CWnd *pWnd=(CWnd*)GetDlgItem (IDC_STATIC); CDC *pDC=pWnd->GetDC(); CRect rect; pWnd->GetClientRect (rect); int W=rect.Width();//画图区域宽度 int H=rect.Height();//画图区域高度 //显示rect坐标 char t[10]; memset(t,0,10); itoa(rect.top,t,10); MessageBox(t); memset(t,0,10); itoa(rect.top,t,10); MessageBox(t); memset(t,0,10); itoa(rect.top,t,10); MessageBox(t); memset(t,0,10); itoa(rect.top,t,10); MessageBox(t); long y_0 =2*rect.left* rect.left+3; pDC->MoveTo(rect.left,y_0); long y; for (long x =rect.left;x<rect.right ;) { y = 2*rect.left* rect.left+3; pDC->LineTo(x,y); pDC->MoveTo(x,y); x+= 1; if (y >rect.bottom) { break; } }} 上面的for (long x =rect.left;x<rect.right ;){///////////////////////////////////y = 2*rect.left* rect.left+3; /////////////////////////////////pDC->LineTo(x,y);pDC->MoveTo(x,y);x+= 1;if (y >rect.bottom){break;} y = 2*rect.left* rect.left+3;应该是y = 2*x* x+3; 刚没改过来。 pWnd->GetClientRect (rect);这语句你编绎通过了吗,我记得是这么写:pWnd->GetClientRect (&rect);因为你定义的是CRect rect;另外,int 是32位的,不是16位的,因此够用了 CWnd *pWnd=(CWnd*)GetDlgItem (IDC_STATIC);你把IDC_STATIC改成IDC_STATIC1或其它的ID,不要用这个,这个好象是通用的或MFC特殊用途的 void CaaDlg::OnBnClickedButton1(){ CWnd *pWnd=(CWnd*)GetDlgItem (IDC_STATIC1); CDC *pDC=pWnd->GetDC(); CRect rect; pWnd->GetClientRect (rect); int W=rect.Width();//画图区域宽度 int H=rect.Height();//画图区域高度 //显示rect坐标/* char t[10]; memset(t,0,10); _itoa(rect.top,t,10); MessageBox(t); memset(t,0,10); itoa(rect.top,t,10); MessageBox(t); memset(t,0,10); itoa(rect.top,t,10); MessageBox(t); memset(t,0,10); itoa(rect.top,t,10); MessageBox(t);*/ long y_0 =2*rect.left* rect.left+3; pDC->MoveTo(rect.left,y_0); long y; for (long x =rect.left;x<rect.right ;) {// y = 2*rect.left* rect.left+3; y = 2*x* x+3; pDC->LineTo(x,y); pDC->MoveTo(x,y); x+= 1; if (y >rect.bottom) { break; } }}我在VS2010下编绎通过,能显示曲线 关于opengl画圆柱体的问题 关于mciSendCommand的问题~ 创建对象占用内存过大 麻烦高手帮忙看一下这个程序,给点意见 请问一个关于对话框很基础的问题 请熟悉控件坐标的高手帮忙看一看这个tab control 中的CStatic control 的size出了什么问题? --多表连接-- 我想捕获特殊字段…………高分…… 急需解决的问题!!!!(SetWindowPos) 安装vc.net要求的配置是不是很高? dialog上点击按钮重绘界面 Windows VC 编程中如何向其他程序控件(按钮或编辑框)发送键盘鼠标等消息,以使其他程序自动运行,急需
{ if (IsIconic())
{
CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle
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; // Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else if (boolpaint)
{
CBitmap bmp;
CRect rc;
CPaintDC dc2(GetDlgItem(IDC_STATIC1));
GetDlgItem(IDC_STATIC1)->GetClientRect(rc);
bmp.CreateCompatibleBitmap(&dc2,rc.Width(),rc.Height());
CDC memDC;
memDC.CreateCompatibleDC(&dc2);
memDC.SelectObject(&bmp);
CPoint pt(rc.CenterPoint());
int WIDTH = min(rc.Width(), rc.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;
CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(0,0,255));
CPen *oldpen=(CPen *)memDC.SelectObject(&pen);
CBrush brush;
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *oldbrush=(CBrush *)memDC.SelectObject(&brush);
memDC.FillSolidRect(rc, GetSysColor(COLOR_3DFACE));
memDC.Ellipse(x1,y1,x2,y2);
int x3 = pt.x - WIDTH2 / 2;
int y3 = pt.y - HEIGHT2 / 2;
int x4 = pt.x + WIDTH2 / 2;
int y4 = pt.y + HEIGHT2 / 2;
pen.DeleteObject();
pen.CreatePen(PS_SOLID, 2, RGB(255, 255, 128));
oldpen = (CPen*)memDC.SelectObject(&pen);
brush.DeleteObject();
brush.CreateSolidBrush(RGB(0, 255, 0));
oldbrush=(CBrush *)memDC.SelectObject(&brush);
memDC.Ellipse(x3, y3, x4, y4);
dc2.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCCOPY);
memDC.SelectObject(oldpen);
memDC.SelectObject(oldbrush);
bmp.DeleteObject();
memDC.DeleteDC();
}
else
{
CDialog::OnPaint();
} //CDialog::OnPaint();
}
我用一个 bool 类型控制是否画图,
void CMy6Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
boolpaint = true;
OnPaint();
}
我从没在编辑框里画过图,一般我在PICTURE控件里画
1.//显示rect坐标 的时候怎么全是 0 啊?
2.pDC->LineTo(x,y); 和 pDC->MoveTo(x,y);参数是int类型的,取值的时候不长也太大了,我想用long,duble类型的,取得值能密集一些,这样的话怎么实现啊?void CMy6Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
CWnd *pWnd=(CWnd*)GetDlgItem (IDC_STATIC);
CDC *pDC=pWnd->GetDC();
CRect rect;
pWnd->GetClientRect (rect);
int W=rect.Width();//画图区域宽度
int H=rect.Height();//画图区域高度 //显示rect坐标
char t[10];
memset(t,0,10);
itoa(rect.top,t,10);
MessageBox(t);
memset(t,0,10);
itoa(rect.top,t,10);
MessageBox(t);
memset(t,0,10);
itoa(rect.top,t,10);
MessageBox(t);
memset(t,0,10);
itoa(rect.top,t,10);
MessageBox(t);
long y_0 =2*rect.left* rect.left+3;
pDC->MoveTo(rect.left,y_0);
long y;
for (long x =rect.left;x<rect.right ;)
{
y = 2*rect.left* rect.left+3;
pDC->LineTo(x,y);
pDC->MoveTo(x,y);
x+= 1;
if (y >rect.bottom)
{
break;
}
}
}
for (long x =rect.left;x<rect.right ;)
{
///////////////////////////////////
y = 2*rect.left* rect.left+3;
/////////////////////////////////
pDC->LineTo(x,y);
pDC->MoveTo(x,y);
x+= 1;
if (y >rect.bottom)
{
break;
}
y = 2*rect.left* rect.left+3;应该是y = 2*x* x+3;
刚没改过来
。
这语句你编绎通过了吗,我记得是这么写:
pWnd->GetClientRect (&rect);因为你定义的是CRect rect;
另外,int 是32位的,不是16位的,因此够用了
你把IDC_STATIC改成IDC_STATIC1或其它的ID,不要用这个,这个好象是通用的或MFC特殊用途的
{
CWnd *pWnd=(CWnd*)GetDlgItem (IDC_STATIC1);
CDC *pDC=pWnd->GetDC();
CRect rect;
pWnd->GetClientRect (rect);
int W=rect.Width();//画图区域宽度
int H=rect.Height();//画图区域高度 //显示rect坐标
/*
char t[10];
memset(t,0,10);
_itoa(rect.top,t,10);
MessageBox(t);
memset(t,0,10);
itoa(rect.top,t,10);
MessageBox(t);
memset(t,0,10);
itoa(rect.top,t,10);
MessageBox(t);
memset(t,0,10);
itoa(rect.top,t,10);
MessageBox(t);
*/ long y_0 =2*rect.left* rect.left+3;
pDC->MoveTo(rect.left,y_0);
long y;
for (long x =rect.left;x<rect.right ;)
{
// y = 2*rect.left* rect.left+3;
y = 2*x* x+3; pDC->LineTo(x,y);
pDC->MoveTo(x,y);
x+= 1;
if (y >rect.bottom)
{
break;
}
}}
我在VS2010下编绎通过,能显示曲线