怎样在视图的图像上画线?

时间:2022-08-09 09:28:50
基于MFC的一个视图界面,继承 CFormView 类的一个视图上添加了 Picture Control 变量并显示在此区域,

GetDlgItem(IDC_BG)->ShowWindow(SW_SHOW);//IDC_BG为图像ID
CStatic pbg;//Picture Control 控件变量

void CPanel::OnDraw(CDC* pDC)
{
GetDlgItem(IDC_BG)->ShowWindow(SW_SHOW);//图像能显示出来
CDC* bgDC = pbg.GetDC();
bgDC->MoveTo(0,100);
bgDC->LineTo(0,100);//此直线不能显示出来,?????为什么呢
}

上面的图像显示,但直线不显示,如果换成按钮响应如下
void CPanel::OnBnClickedButton1()
{
CDC* bgDC = pbg.GetDC();
bgDC->MoveTo(ORX,ORY);
bgDC->LineTo(ORX,ORY + 100);//直线 能够 显示出来,???为什么 OnDraw 刷新就不能显示
}


请各位指教


谢谢啦,

19 个解决方案

#1


bgDC->MoveTo(0,100);
bgDC->LineTo(0,100);//此直线不能显示出来,?????为什么呢
--------------------------------
你这是个点吧???起点和终点坐标一样?

#2


回一楼,上面的代码抄错了。
应该是
bgDC->MoveTo(0,0);
bgDC->LineTo(100,100);//此直线不能显示出来,?????为什么呢

#3


其实我想做个类似圆盘时钟的程序,以图像为背景
怎样在视图的图像上画线?

然后随时变动在这个图像上画线。

但是现在问题是画线不能在显示

void CPanel::OnDraw(CDC* pDC)
{
GetDlgItem(IDC_BG)->ShowWindow(SW_SHOW);//图像能显示出来
CDC* bgDC = pbg.GetDC();
bgDC->MoveTo(0,0);
bgDC->LineTo(100,100);//此直线不能显示出来,?????为什么呢
}

但是在按钮响应函数中就能显示图像和线条
void CPanel::OnBnClickedButton1()
{
CDC* bgDC = pbg.GetDC();
bgDC->MoveTo(0,0);
bgDC->LineTo(100,100);//直线 能够 显示出来,???为什么 OnDraw 刷新就不能显示
}

谢谢

#4


为什么不用OnDraw(CDC* pDC)中的pDC呢?

#5


引用 4 楼 hhhh63 的回复:
为什么不用OnDraw(CDC* pDC)中的pDC呢?


OnDraw() 中的 pDC 不能在这种表态图像上画线。

#6


楼主应该再看看背景的设置:
CBitmap    m_background ; 

void CParamGPTD::OnPaint() 
{
CRect rect;
GetClientRect(&rect);
CDC dcMem; 
dcMem.CreateCompatibleDC(&dc); 
BITMAP bitMap;
m_background.GetBitmap(&bitMap);
CBitmap *pbmpOld=dcMem.SelectObject(&m_background);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
dc.StretchBlt(2,8,328,114,&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
}

设置背景后,在界面上的操作应该不受影响

#7


引用 6 楼 jiuzhoulh 的回复:
楼主应该再看看背景的设置:
CBitmap    m_background ; 

void CParamGPTD::OnPaint() 
{
CRect rect;
GetClientRect(&rect);
CDC dcMem; 
dcMem.CreateCompatibleDC(&dc); 
BITMAP bitMap;
m_background.GetBitmap(&bitMap);
CBitmap *pbmpOld=dcMem.SelectObject(&m_background);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
dc.StretchBlt(2,8,328,114,&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
}

设置背景后,在界面上的操作应该不受影响


我的背景图不是用代码生成的,而是 Picture Control 类控件(Type:Bitmap),
这个我不知道怎么修改属性

#8


在DC上先把位图贴上来,然后再在图上画线,应该不受影响的

#9


可能是 你画的 线被 控件覆盖了

用DC贴图 然后画线

#10


加一些颜色看看到底问题出在哪,比如加上背景色,线条加上颜色

#11


引用 8 楼 wshcdr 的回复:
在DC上先把位图贴上来,然后再在图上画线,应该不受影响的


我就是不想在DC上画,想直接用 Picture Control 显示图像作为背景,然后再在它的上面画一些动态变化的线条。但是发现线条都被遮挡住不能显示。

#12


引用 9 楼 CS2130 的回复:
可能是 你画的 线被 控件覆盖了

用DC贴图 然后画线


就是被Picture Contro控件挡住不能显示,怎样解决呢。我不想用DC贴图,因为用DC贴图显示的效果不能像其它控件显示那样会根据系统的分辨率适当调整比例。

#13


引用 10 楼 yeah2000 的回复:
加一些颜色看看到底问题出在哪,比如加上背景色,线条加上颜色


经测试,线条加上背景色也不能显示出来

#14


getdc之后要释放dc,否则多次之后就不响应了。
我个人怀疑DC以及坐标有问题。

#15


引用 14 楼 xuddk727 的回复:
getdc之后要释放dc,否则多次之后就不响应了。
我个人怀疑DC以及坐标有问题。


坐标没有问题啊,同样的代码,我在按钮响应函数中调用时能显示出线条,但在 OnDraw 函数中就不能显示出来

#16


bgDC->MoveTo(0,100);
bgDC->LineTo(0,100);//此直线不能显示出来,?????为什么呢

这代码就是在原地踏步,怎么可能画出线来?
bgDC->LineTo(0,200); //试试

#17


CDC* bgDC = pbg.GetDC();这个应该错了,pbg是啥玩意啊?
改成
CDC* bgDC = pDC;

#18


引用 16 楼 worldy 的回复:
bgDC->MoveTo(0,100);
bgDC->LineTo(0,100);//此直线不能显示出来,?????为什么呢

这代码就是在原地踏步,怎么可能画出线来?
bgDC->LineTo(0,200); //试试

一开始发贴时抄错了,我在2楼回帖是已经补充了,
bgDC->MoveTo(0,0);
bgDC->LineTo(100,100);//此直线不能显示出来

这时直线不能显示(OnDraw 函数调用),

如果换成按钮响应如下
void CPanel::OnBnClickedButton1()
{
    CDC* bgDC = pbg.GetDC();
    bgDC->MoveTo(ORX,ORY);
    bgDC->LineTo(ORX,ORY + 100);//直线 能够 显示出来,???为什么 OnDraw 刷新就不能显示
}

#19


引用 17 楼 worldy 的回复:
CDC* bgDC = pbg.GetDC();这个应该错了,pbg是啥玩意啊?
改成
CDC* bgDC = pDC;


pbg 是 CStatic pbg;//Picture Control 控件变量
如果换成 pDC 则直线显示不出来

#1


bgDC->MoveTo(0,100);
bgDC->LineTo(0,100);//此直线不能显示出来,?????为什么呢
--------------------------------
你这是个点吧???起点和终点坐标一样?

#2


回一楼,上面的代码抄错了。
应该是
bgDC->MoveTo(0,0);
bgDC->LineTo(100,100);//此直线不能显示出来,?????为什么呢

#3


其实我想做个类似圆盘时钟的程序,以图像为背景
怎样在视图的图像上画线?

然后随时变动在这个图像上画线。

但是现在问题是画线不能在显示

void CPanel::OnDraw(CDC* pDC)
{
GetDlgItem(IDC_BG)->ShowWindow(SW_SHOW);//图像能显示出来
CDC* bgDC = pbg.GetDC();
bgDC->MoveTo(0,0);
bgDC->LineTo(100,100);//此直线不能显示出来,?????为什么呢
}

但是在按钮响应函数中就能显示图像和线条
void CPanel::OnBnClickedButton1()
{
CDC* bgDC = pbg.GetDC();
bgDC->MoveTo(0,0);
bgDC->LineTo(100,100);//直线 能够 显示出来,???为什么 OnDraw 刷新就不能显示
}

谢谢

#4


为什么不用OnDraw(CDC* pDC)中的pDC呢?

#5


引用 4 楼 hhhh63 的回复:
为什么不用OnDraw(CDC* pDC)中的pDC呢?


OnDraw() 中的 pDC 不能在这种表态图像上画线。

#6


楼主应该再看看背景的设置:
CBitmap    m_background ; 

void CParamGPTD::OnPaint() 
{
CRect rect;
GetClientRect(&rect);
CDC dcMem; 
dcMem.CreateCompatibleDC(&dc); 
BITMAP bitMap;
m_background.GetBitmap(&bitMap);
CBitmap *pbmpOld=dcMem.SelectObject(&m_background);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
dc.StretchBlt(2,8,328,114,&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
}

设置背景后,在界面上的操作应该不受影响

#7


引用 6 楼 jiuzhoulh 的回复:
楼主应该再看看背景的设置:
CBitmap    m_background ; 

void CParamGPTD::OnPaint() 
{
CRect rect;
GetClientRect(&rect);
CDC dcMem; 
dcMem.CreateCompatibleDC(&dc); 
BITMAP bitMap;
m_background.GetBitmap(&bitMap);
CBitmap *pbmpOld=dcMem.SelectObject(&m_background);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
dc.StretchBlt(2,8,328,114,&dcMem,0,0,bitMap.bmWidth,bitMap.bmHeight,SRCCOPY);
}

设置背景后,在界面上的操作应该不受影响


我的背景图不是用代码生成的,而是 Picture Control 类控件(Type:Bitmap),
这个我不知道怎么修改属性

#8


在DC上先把位图贴上来,然后再在图上画线,应该不受影响的

#9


可能是 你画的 线被 控件覆盖了

用DC贴图 然后画线

#10


加一些颜色看看到底问题出在哪,比如加上背景色,线条加上颜色

#11


引用 8 楼 wshcdr 的回复:
在DC上先把位图贴上来,然后再在图上画线,应该不受影响的


我就是不想在DC上画,想直接用 Picture Control 显示图像作为背景,然后再在它的上面画一些动态变化的线条。但是发现线条都被遮挡住不能显示。

#12


引用 9 楼 CS2130 的回复:
可能是 你画的 线被 控件覆盖了

用DC贴图 然后画线


就是被Picture Contro控件挡住不能显示,怎样解决呢。我不想用DC贴图,因为用DC贴图显示的效果不能像其它控件显示那样会根据系统的分辨率适当调整比例。

#13


引用 10 楼 yeah2000 的回复:
加一些颜色看看到底问题出在哪,比如加上背景色,线条加上颜色


经测试,线条加上背景色也不能显示出来

#14


getdc之后要释放dc,否则多次之后就不响应了。
我个人怀疑DC以及坐标有问题。

#15


引用 14 楼 xuddk727 的回复:
getdc之后要释放dc,否则多次之后就不响应了。
我个人怀疑DC以及坐标有问题。


坐标没有问题啊,同样的代码,我在按钮响应函数中调用时能显示出线条,但在 OnDraw 函数中就不能显示出来

#16


bgDC->MoveTo(0,100);
bgDC->LineTo(0,100);//此直线不能显示出来,?????为什么呢

这代码就是在原地踏步,怎么可能画出线来?
bgDC->LineTo(0,200); //试试

#17


CDC* bgDC = pbg.GetDC();这个应该错了,pbg是啥玩意啊?
改成
CDC* bgDC = pDC;

#18


引用 16 楼 worldy 的回复:
bgDC->MoveTo(0,100);
bgDC->LineTo(0,100);//此直线不能显示出来,?????为什么呢

这代码就是在原地踏步,怎么可能画出线来?
bgDC->LineTo(0,200); //试试

一开始发贴时抄错了,我在2楼回帖是已经补充了,
bgDC->MoveTo(0,0);
bgDC->LineTo(100,100);//此直线不能显示出来

这时直线不能显示(OnDraw 函数调用),

如果换成按钮响应如下
void CPanel::OnBnClickedButton1()
{
    CDC* bgDC = pbg.GetDC();
    bgDC->MoveTo(ORX,ORY);
    bgDC->LineTo(ORX,ORY + 100);//直线 能够 显示出来,???为什么 OnDraw 刷新就不能显示
}

#19


引用 17 楼 worldy 的回复:
CDC* bgDC = pbg.GetDC();这个应该错了,pbg是啥玩意啊?
改成
CDC* bgDC = pDC;


pbg 是 CStatic pbg;//Picture Control 控件变量
如果换成 pDC 则直线显示不出来

#20