[求助][已解决]MFC+OpenCV在子窗体中显示图片 20160312
2016-03-12 16:36
274 查看
程序预期功能:
在父窗体中画一个按键(Button1),点击按键(Button1)然后跳出子窗体(son_window_IDD_DIALOG_BG),显示图像。(OPEN/CLOSE是用来打开和关闭摄像头的,father_window里面的image control控件用于显示视频,三者和本次问题无关)目前遇到的问题是:
我不知道怎么配置CDC/HDC/CRECT/CWND之类的参数。如图,双击屏幕之后,程序停止。
代码如下(仅我有修改部分):
在子窗体.cpp中的全局变量IplImage* src = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy2head.jpg");//OpenCV里面的加载图像语句 CRect rect; CDC *pDC; HDC hDC; CWnd *pwnd;
在子窗体.cpp中的OnLButtonDblClk中
void CTestDlg::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 pwnd = GetDlgItem(IDC_ShowImage); pDC =pwnd->GetDC(); <span style="font-family: Arial, Helvetica, sans-serif;">//DEBUG中,这里开始出错 </span> hDC= pDC->GetSafeHdc(); pwnd->GetClientRect(&rect); CvvImage m_CvvImage; // OpenCV中的显示类 m_CvvImage.CopyOf(src,1); // <span style="font-family: Arial, Helvetica, sans-serif;">OpenCV中的显示用函数</span> m_CvvImage.DrawToHDC(hDC, &rect); // <span style="font-family: Arial, Helvetica, sans-serif;">OpenCV中的显示用的</span> CDialogEx::OnLButtonDblClk(nFlags, point); }
问题总结:
1. 在子窗体里面有没有初始化函数?我在类向导里面没有找到。该怎么初始化呢?2.以下
CRect rect;
CDC *pDC;
HDC hDC;
CWnd *pwnd;
参考http://blog.csdn.net/yam_killer/article/details/7661449
都是什么用途?网上查阅之后,大概理解就是
DC是设备描述表,一种包含设备信息的数据结构。
HDC是DC的句柄,API中的一个类似指针的数据类型。
我的理解是:用来标识每一个窗口的,相当于编号。
CDC是MFC的DC的一个类我理解不了了,它和DC有什么不一样?
窗体显示的过程大概是什么样?需要哪些步骤?以及这些名词都是代表什么意义?有没有谁可以简单的解释一下各种关系?
3.我想试试是不是DC、HDC配置错了,所以在父窗体中运行了一个例子,但是通过了,也不知道为啥。
父窗体下功能是:
点击(OPEN),显示图像。
代码如下(也仅我有修改部分)
父窗体.cpp文件中的全局变量
IplImage* src = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy2head.jpg"); CRect rect; CDC *pDC; HDC hDC; CWnd *pwnd;
父窗体.cpp文件中的OnInitDialog
// TODO: 在此添加额外的初始化代码 pwnd = GetDlgItem(IDC_ShowImage); pDC =pwnd->GetDC(); hDC= pDC->GetSafeHdc(); pwnd->GetClientRect(&rect);
父窗体.cpp文件中的OPEN按键消息
void CsubwindowDlg::OnClickedButtonOpen() { // TODO: 在此添加控件通知处理程序代码 // 测试 CvvImage m_CvvImage; m_CvvImage.CopyOf(src,1); m_CvvImage.DrawToHDC(hDC, &rect); // 设置计时器,每10ms触发一次事件 }
父窗体.cpp文件中的CLOSE按键消息
void CsubwindowDlg::OnClickedButtonClose() { // TODO: 在此添加控件通知处理程序代码 ReleaseDC(pDC); }
配置过程都一样。
麻烦大家看一下啦,谢谢。
最后,语文不好~废话较多。。见谅
***问题原因和解决方案***
子窗体.cpp文件中的 pwnd = GetDlgItem(IDC_STATIC); IDC_STATIC一开始写错了,使得返回的pwnd是空指针。注意从新配置如下
在子窗体.cpp中的OnLButtonDblClk中
void CTestDlg::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 <span style="color:#ff0000;">pwnd = GetDlgItem(<span style="font-family: 'lucida Grande', Verdana, 'Microsoft YaHei'; font-size: 14px; line-height: 23px;">IDC_STATIC</span>); //这里如果返回空指针会出错。</span> pDC =pwnd->GetDC(); <span style="font-family: Arial, Helvetica, sans-serif;">//DEBUG中,这里开始出错 </span> hDC= pDC->GetSafeHdc(); pwnd->GetClientRect(&rect); CvvImage m_CvvImage; // OpenCV中的显示类 m_CvvImage.CopyOf(src,1); // <span style="font-family: Arial, Helvetica, sans-serif;">OpenCV中的显示用函数</span> m_CvvImage.DrawToHDC(hDC, &rect); // <span style="font-family: Arial, Helvetica, sans-serif;">OpenCV中的显示用的</span> CDialogEx::OnLButtonDblClk(nFlags, point); }
同时,在父窗体的图片显示控件的IDD在子窗体中不能识别,会使pwnd得到空指针。
相关文章推荐
- docker 磁盘映射时访问时出现Permission denied
- Linux内核分析 03
- Linux内核分析第三周学习博客——跟踪分析Linux内核的启动过程
- 【转】Linux常用命令大全
- 20135323符运锦----第三周:构建一个简单的Linux系统MenuOS
- OpenCV的轮廓查找和填充
- tomcat配置 —— 各个目录的作用
- hadoop系列文档6-对官方MapReduce 过程的翻译(二)
- hadoop系列文档5-对官方MapReduce 过程的翻译(一)
- OpenCV学习笔记资料大集锦
- Apache Shiro 使用手冊 链接文件夹整理
- 跟踪分析Linux内核的启动过程小解
- 跟踪分析Linux内核的启动过程
- Linux--01入门
- linux splice使用示例 (使用socket服务于单用户的回射服务器)
- Java中常用的网站
- 分布式-在win7上安装linux操作系统
- Apache和PHP的安装
- Inna and Choose Options
- 在嵌入式linux下搭建Boa Webserver