您的位置:首页 > 其它

工作线程的全局函数中如何控制picture control进行图像显示

2015-06-19 11:23 197 查看
我们知道在对话框类class Ctldmfc1Dlg : public CDialogEx获取控件的

CDC *pDC=GetDlgItem(ID)->GetDC();//CWnd::GetDlgItem()返回ID标示的控件或者子窗口的指针,然后h获取CDC类的指针,图形指针,
HDC hDC=pDC->GetSafeHdc();//获取pDC指向的设备的句柄
CRect rect;
GetDlgItem(ID)->GetClientRect(&rect);//获取客户区的坐标,并且保存在rect里
CvvImage cimg;
cimg.CopyOf(image);
cimg.DrawToHDC(hDC,&rect);
ReleaseDC(pDC);//释放指针


但是如果在工作线程的全局函数中,不存在CWnd::GetDlgItem()函数,如果定义CWnd 类的对象调用的时候,代码如下:

CWnd Cwnd;
CDC* pDC;
pDC= Cwnd.GetDlgItem(IDC_STATIC_PIC)->GetDC();
HDC hDC=pDC->GetSafeHdc();
CRect rect;
Cwnd.GetDlgItem(IDC_STATIC_PIC)->GetClientRect(&rect);


则会出现如下问题:

ASSERT(::IsWindow(m_hWnd));


但是用如下代码实现的时候,则是没有问题的

CWnd *pWnd =  AfxGetMainWnd();//AfxGetMainWnd如果被主线程调用则获取MFC主窗口指针,如果被应用程序的次线程调用,该函数返回与引起该调用线程连接的主窗口。
HWND hHwnd = pWnd->m_hWnd;//获取CWnd类数据成员,是类型 HWND的公共变量①
HWND Hwnd  = ::GetDlgItem(hHwnd,IDC_STATIC_PIC);
HDC hDC=::GetDC(Hwnd);
CRect rect;
pWnd->GetDlgItem(IDC_STATIC_PIC)->GetClientRect(&rect);
CDC *pDC;
pDC=pWnd->GetDC();
CvvImage cimg;
cimg.CopyOf(&(IplImage)frame);
cimg.DrawToHDC(hDC,&rect);
pWnd->ReleaseDC(pDC);


对于①m_hWnd这个成员变量,最早是定义在类CWnd中,而且是类CWnd的第一个数据成员它是窗口类的一个句柄,凡是从CWnd派生的类都有这个句柄,凡是以CWnd派生的类定义的对象内部也都有这个句柄,它是类或者对象标识自己的句柄。凡是窗口都有一个句柄用来标识自己,在CWnd类中将这个句柄作为一个成员变量直接封装了,所以CWnd类的成员函数都没有句柄这个参数了,比如::ShowWindow(HWND hWnd),在CWnd类或者派生类中,这个函数就没有参数了,CWnd::ShowWindow(),其实这个函数实现很简单,就是调用了::ShowWindow(HWND hWnd),因为在类里已经封装好了,所以也不需要在传递参数了。

获得窗口类的句柄方法如下:

1、this->m_hWnd;

2、GetSafeHwnd();

3、AfxGetMainWnd()->m_hWnd;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: