MFC 或 DuiVision获取DC的方法总结

在MFC或者 DuiVision中获取DC绘图的一些方法:
MFC :
有窗口的话,获取窗口指针或句柄,然后:
全局函数通过控件ID获取;
HWND itemhWnd = ::GetDlgItem(m_pDlgBase->GetSafeHwnd()/* 父窗口句柄*/, IDC_STATIC_IMAGE /*控件ID*/);
HDC hdc = ::GetDC(itemhWnd);
hdc可以转换成CDC: CDC *cdcFP = CDC::FromHandle(hdc);
有控件指针或对象的话直接获取DC即可;
eg:
CEdit * p; 或者 CEdit edObj;
p->GetDC(); edObj.GetDC();

DuiVision中:
直接全局函数获取即可
CDuiPicture* pWnd = static_cast<CDuiPicture*>(m_pDlgBase->GetControl(_T("fingerImg")));
HDC hdc = ::GetDC(pWnd->GetPaintHWnd());
同样可以转成CDC:CDC *cdcFP = CDC::FromHandle(hdc);
如果DuiVision中使用windows原生控件则可以现获取原生控件句柄,然后获取DC;首先的创建出一个原生的控件。
eg: CDC *cdcFP = pWnd->GetNativeWnd()->GetDC(); //直接获取一个CDC对象
或者:pWnd->GetNativeHWnd(); //获取窗口句柄,然后通过 ::GetDC获取dc,再转换或者直接使用。

关于 HDC CDC以及相互转换
方法一: 此方法在设备结束时不会销毁原来的资源(即:hDC,hBitmap)
CDC *pDC = CDC::FromHandle(hDC);
方法二: 此方法在设备结束时会销毁原来的资源(即:hDC,hBitmap)
CDC dc;
dc.Attach(hDC);
当然,如果有了CDC对象, 直接获取他的成员m_hDC也可以,eg: HDC hdcFP = cdcFP->m_hDC

首先:CDC 不可以释放. FromHandle 是通过 HDC 来创建了一个CDC 对象,以方便操作,释放 DC 的操作应该针对于HDC 而非此CDC , 如果释放了它   pDC->ReleaseDC,就会造成隐患.  
  HDC   hDC   =   GetDC(hWnd);  
  CDC   *pDC   =   CDC::FromHandle(hDC);   
这两者是指向的一个DC对象,只能释放一次,而这个释放应该针对 hDC 而非 pDC.  
然后:GetDC和ReleaseDC的调用匹配,CreateDC和DeleteDC的调用匹配。
GetDC是从窗口获取現有的DC,而CreateDC是创建DC,所以ReleaseDC和DeleteDC的作用一个是释放,一个是销毁。
一般使用CDC类比较好一点, 可以对图像质量进行设置等操作。
one eg:
void fun()
{
CDuiPicture* pWnd = static_cast<CDuiPicture*>(m_pDlgBase->GetControl(_T("fingerImg")));
HDC hdc = ::GetDC(pWnd->GetPaintHWnd());
CDC *cdcFP = CDC::FromHandle(hdc);
if (NULL == cdcFP)
{
return;
}
HDC hdcFP = cdcFP->m_hDC;// 这里的 hdcFP 和 hdc 是同一个东西。相同对象,需要注意。
if (NULL == hdcFP)
{
return;
}
cdcFP->SetStretchBltMode(HALFTONE);

cimFP = new CImage();
cimFP->Create(width, height, 8);
cimFP->SetColorTable(0, 256, g_GrayTable);
for (int i = 0; i < height; i++)
{
memcpy(cimFP->GetPixelAddress(0, i), (unsigned char*)pImgBuf + width * i, height);
}
//缩放显示 大小:140*150
cimFP->StretchBlt(hdcFP, 135, 50, 130, 160, 0, 0, width, height, SRCCOPY);
if (cimFP)
{
cimFP->Destroy();
delete cimFP;
}
return;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值