CVVImage类
OPENCVhighgui.h中定义的CvvImage类,可以很好的实现opencv和windowsMFC显示接口。
将CvvImage.cpp和CvvImage.h加入到工程中后,可以很容易的在windows窗口中显示图像。
void CDistance::DrawPicToHDC(IplImage *img, UINT ID) //自己添加的类函数,前面需添加声明
{
CDC *pDC = GetDlgItem(ID)->GetDC(); //GetDlgItem(ID)通过资源ID获取对话框控件内的指针;这句话表示获取某控件内的设备绘图指针
HDC hDC= pDC->GetSafeHdc();//获取该DC指针的句柄
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);//获取控件的坐标范围
CvvImage cimg;
cimg.CopyOf( img ); // 复制图片
cimg.DrawToHDC( hDC, &rect ); // 将图片绘制到显示控件的指定区域内
ReleaseDC( pDC );
}
void CDistance::OnPaint() //OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。当Windows或应用程序请求重画应用程序窗口的一部分时,框架调用这个成员函数。
{
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CDialogEx::OnPaint()
CRect rectL;
GetDlgItem(IDC_AddSiftImg)->GetClientRect(&rectL);此处获得坐标范围只是为了根据控件的范围来重新构图
int row,colume;
row=rectL.bottom-rectL.top;
colume=rectL.right-rectL.left;
IplImage *resizeimage=cvCreateImage(cvSize(colume,row), siftimg->depth, siftimg->nChannels);
cvResize(siftimg,resizeimage);
DrawPicToHDC(resizeimage, IDC_AddSiftImg);//IDC_AddSiftImg是资源ID
}
以以上程序为例:
资源ID:IDC_AddSiftImg
指针:GetDlgItem(IDC_AddSiftImg)
类:CDC *pDC=GetDlgItem(IDC_AddSiftImg)->GetDC();
句柄: HDC hDC=pDC->GetSafeHdc()
HINSTANCE:
HANDLE:
HWND:
HPEN:
HBITMAP:
HDC:
CWnd:
CDC:
句柄和类的相互转换:
1.句柄构造类
1.1
CDC *pDC = CDC::FromHandle(hDC); //MFC不保证什么时候删除DC
CBitmap *pBmp = CBitmap::FromHandle(hBitmap)
1.2
CDC dc;
dc.Attach(hDC); //窗口绑定,永久的,一直到你删除它
//..........//
dc.Detach(hDC); //当不用的时候要销毁
2.从类得到句柄
CDC dc;
HDC hDC;
hDC = dc.GetSafeHdc();
CDC类下面有4个子类:
(CDC是进行设备环境处理的类,GDI和GDI+显示类库需要这个设备显示对象(包括图像,画笔,线条,画刷等))
1.
//
2.
//For
void CMainWindow::OnLButtonDown (UINT nFlags, CPoint point)
{
CRect rect;
GetClientRect (&rect);
CClientDC dc (this);
dc.MoveTo (rect.left, rect.top);
dc.LineTo (rect.right, rect.bottom);
dc.MoveTo (rect.right, rect.top);
dc.LineTo (rect.left, rect.bottom);
}
3.
//For
不仅是客户区,还包括窗口客户区以外的部分(如窗口标题栏、菜单栏等)需要需要重画时,系统向程序发出WM_NCPAINT消息。因标准窗口的客户区以外部分为窗口必需部分,因而WM_NCPAINT消息将默认被发送到DefWindowProc函数进行默认处理。程序可通过截获该消息来实现窗口其他部分的自定义绘制。使用的是CWindowDC
4.
上面这4个子类由于构造和析构函数在获取和释放DC的时候会调用合适的函数,所以可以直接使用,不用释放DC,而CDC就要释放资源RealseDC()
实例1:
实例2:
void
//注:CreateDC()
CDC等设备上下分类,都含有一个类的成员变量:m_nHdc;即HDC类型的句柄.
参考: