MFC 或 DuiVision获取DC的方法总结

xiaoxiao2021-02-28  118

在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; }
转载请注明原文地址: https://www.6miu.com/read-37762.html

最新回复(0)