MFC 单文档 无文档视图程序 View中绘图如何能一直显示

zhouyj-csdn 2017-11-03 05:28:32
我要做的是在客户区既能显示相机录制的内容,还需要在客户区上绘制坐标轴,坐标轴要显示在视频之上,我现在遇到的问题是不开启相机时,绘图可以在视图区显示,一旦打开相机,我绘制的坐标线就会被覆盖,只有在窗体有变化,需要重绘的时候会闪现一下,怎样才可以让坐标轴一直显示呢?
CChildView.cpp

void CChildView::OnPaint()
{
CPaintDC dc(this); // 用于绘制的设备上下文
// TODO: 在此处添加消息处理程序代码
// 不要为绘制消息而调用 CWnd::OnPaint()
PaintImage();
}
void CChildView::PaintImage()
{
CDC *dc = GetDC();
CDC myDC;
CRect rect;
GetClientRect( &rect );
CBitmap bmp;
myDC.CreateCompatibleDC(dc);
bmp.CreateCompatibleBitmap(dc,rect.Width(),rect.Height());
//将内存位图选进内存DC中用来保存在内存DC中绘制的图形
myDC.SelectObject(&bmp);
myDC.FillSolidRect(0,0,WIDTH,HEIGHT,RGB(255,255,255));
CBitmap *oldbmp=myDC.SelectObject(&bmp);
CPen pen(PS_SOLID,2,RGB(255,0,0));
CPen* oldpen=dc->SelectObject(&pen);
int height=HEIGHT;
int width=WIDTH;
myDC.MoveTo(m_iX,0);
myDC.LineTo(m_iX,height);
myDC.MoveTo(0,m_iY);
myDC.LineTo(width,m_iY);
dc->BitBlt(0,0,rect.Width(),rect.Height(),&myDC,0,0,SRCCOPY);
dc.SelectObject(oldpen);
bmp.DeleteObject();
myDC.DeleteDC();
}
void CChildView::OnFileSetpara() //这个是菜单项按钮的点击事件
{
// TODO: 在此添加命令处理程序代码
CSetParaDlg dlg; //对话框类
if(IDOK==dlg.DoModal())
{
m_iX=dlg.m_xaxis;
m_iY=dlg.m_yaxis;
Invalidate();//强行刷新,触发WM_OPAINT消息
}
}
BOOL CChildView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}




MainFrame.cpp

CChildView m_wndView;

CMainFrame::CMainFrame()
: m_pSink( DShowLib::FrameHandlerSink::create( DShowLib::eRGB24, 5 ) ),
m_IsStillImageValid( false )
{
m_pSink->setSnapMode( true ); //m_pSink,m_Grabber均为相机视频流的参数变量
m_Grabber.setSinkType( m_pSink );
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// 创建一个视图以占用框架的工作区
if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
CRect(0, 0, 0, 0), this,AFX_IDW_PANE_FIRST, NULL))
{
TRACE0("未能创建视图窗口\n");
return -1;
}
m_Grabber.setHWND(m_wndView);
updateWindowTitle();
return 0;
}
...全文
357 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouyj-csdn 2017-11-27
  • 打赏
  • 举报
回复
我最后还是仔细研究了SDK开发包,找到了有绘图的函数,这个问题已解决,谢谢各位了
xiaohuh421 2017-11-06
  • 打赏
  • 举报
回复
你不用去修改相机的调用程序. 也不需要去触发OnPaint函数, 触发OnPaint是效率很低的, 要走消息循环. 你应该是定时去调用PaintImage()函数, 争取做到相机绘制一帧, 你就绘制一次. 尽量快就行了.
zgl7903 2017-11-06
  • 打赏
  • 举报
回复
想法截取 相机绘制时代 WM_PAINT, 把自己的绘制放在其后
zhouyj-csdn 2017-11-03
  • 打赏
  • 举报
回复
如果我不调用Invalidate这类函数,那我应该怎么去触发OnPaint函数呢?
zhouyj-csdn 2017-11-03
  • 打赏
  • 举报
回复
引用 1 楼 xiaohuh421 的回复:
你需要不停的调用绘制, 主动调用 , 注意, 不是调用 invalidate这类的函数. 保证跟相机绘制次数一致,或者大于它.
相机的绘制我直接调用的SDK开发包,具体的绘制代码都是封装了,相机有一个参数是FRS,那个好像会影响到画面显示的快慢,但我没办法去修改呀
xiaohuh421 2017-11-03
  • 打赏
  • 举报
回复
你需要不停的调用绘制, 主动调用 , 注意, 不是调用 invalidate这类的函数. 保证跟相机绘制次数一致,或者大于它.

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧