分割窗口后,CView 中显示影像
2017-03-03 11:45
260 查看
在新建MFC类CView1,继承CView
图像显示:
关闭背景刷新,避免图像的闪烁
鼠标操作成员变量
//鼠标操作,移动图像
//鼠标操作,缩放图像
//鼠标左键操作
图像显示:
BITMAPINFO *m_pBinfo_Image = (BITMAPINFO *)(new BYTE[sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD)]); memset(m_pBinfo_Image, 0, sizeof(BITMAPINFOHEADER) + 256*sizeof(RGBQUAD)); m_pBinfo_Image->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);// + 256*sizeof(RGBQUAD); m_pBinfo_Image->bmiHeader.biBitCount = 8; m_pBinfo_Image->bmiHeader.biPlanes = 1; m_pBinfo_Image->bmiHeader.biClrUsed = 256; m_pBinfo_Image->bmiHeader.biWidth = CAMERA_WIDTH; m_pBinfo_Image->bmiHeader.biHeight = CAMERA_HEIGHT; RGBQUAD *pColor = m_pBinfo_Image->bmiColors; int i; for (i=0;i<256;i++) { pColor[i].rgbBlue = pColor[i].rgbGreen = pColor[i].rgbRed = i; } void CView1::OnDraw(CDC* pDC) { CString str; CZgMemDC *pMemDC = new CZgMemDC(pDC); //BITMAPINFO结构定义了Windows设备无关位图(DIB)的度量和颜色信息 BITMAPINFO *pInfo = m_pBinfo_Image ; BYTE *pImgData = m_pImgDataL;//图像内存, int w = CAMERA_WIDTH;//图像大小 int h = CAMERA_HEIGHT; pInfo->bmiHeader.biWidth = w; pInfo->bmiHeader.biHeight = h; CRect rect; GetClientRect(&rect); int cenx = rect.Width()/2; int ceny = rect.Height()/2; int x0 = cenx - m_CenX*m_Scale; int y0 = ceny - (h-1-m_CenY)*m_Scale; CPen *pPenOld,PenRed,PenGreen; PenRed.CreatePen(PS_SOLID,1,RGB(255,0,0)); PenGreen.CreatePen(PS_SOLID,1,RGB(0,255,0)); pPenOld = pMemDC->SelectObject(&PenRed); if( pImgData != NULL ) { HDC hdc = pMemDC->GetSafeHdc(); CBitmap *pOld = (CBitmap*)pMemDC->SelectObject(pImgData); SetStretchBltMode(hdc, COLORONCOLOR); StretchDIBits(hdc, x0, y0, w*m_Scale, h*m_Scale, 0, 0, w, h, pImgData, pInfo, DIB_RGB_COLORS, SRCCOPY); pMemDC->SelectObject(pOld); } pMemDC->MoveTo(0,ceny); pMemDC->LineTo(cenx*2,ceny); pMemDC->MoveTo(cenx,0); pMemDC->LineTo(cenx,ceny*2); pMemDC->SelectObject(pPenOld); PenRed.DeleteObject(); PenGreen.DeleteObject(); delete pMemDC; }
关闭背景刷新,避免图像的闪烁
BOOL CView1::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default return TRUE; return CView::OnEraseBkgnd(pDC); }
鼠标操作成员变量
double m_CenX,m_CenY,m_Scale; double m_LBD_CenX,m_LBD_CenY; CPoint m_LBD_pt; bool m_bLBD;
//鼠标操作,移动图像
void CView1::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if (m_bLBD && (nFlags&MK_LBUTTON)==MK_LBUTTON) { int w = CAMERA_WIDTH; int h = CAMERA_HEIGHT; m_CenX = m_LBD_CenX - (point.x - m_LBD_pt.x)/m_Scale; m_CenY = m_LBD_CenY + (point.y - m_LBD_pt.y)/m_Scale; m_CenX = max(0.0,min(w-1.0,m_CenX)); m_CenY = max(0.0,min(h-1.0,m_CenY)); Invalidate(FALSE); } CView::OnMouseMove(nFlags, point); }
//鼠标操作,缩放图像
BOOL CViewLeft::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { // TODO: Add your message handler code here and/or call default if (1) { if (zDelta > 0) { m_Scale *= 1.1892071150027210667174999705605; } else { m_Scale /= 1.1892071150027210667174999705605; } Invalidate(FALSE); } return CView::OnMouseWheel(nFlags, zDelta, pt); }
//鼠标左键操作
void CView1::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_LBD_CenX = m_CenX; m_LBD_CenY = m_CenY; m_LBD_pt = point; m_bLBD = true; CView::OnLButtonDown(nFlags, point); } void CView1::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default m_bLBD = false; CView::OnLButtonUp(nFlags, point); }
相关文章推荐
- QT5-控件-QScrollArea-可以用于把一个窗口分割为多个-比如根据图片大小显示滚动条
- 分割窗口显示图片(转)
- 【数字图像处理】 二.MFC单文档分割窗口显示图片
- jSplitPane设置分割窗口左右显示区域的大小
- 我用CSplitterWnd分割完窗口为什么显示不出来,,,请高手指教
- MFC的CView窗口中显示iplimage图像
- OpenGL/MFC下静态分割窗口显示PNG图片
- Qt5 去掉窗口标题栏,去掉任务栏显示,窗口置顶的方法
- ABBYY FineReader窗口中不显示字符怎样解决
- Android窗口管理服务WindowManagerService显示窗口动画的原理分析
- Pyqt4 实现窗口全屏显示
- 如何取消IE窗口的全屏显示
- 分割窗口QSplitter
- FLex3中弹出窗口包含TabNavigator时标签页的标题可能显示不完全的问题及解决方法
- 如何使cmd窗口正确显示utf-8编码的文字
- OpenCV一个窗口显示多张图片
- mfc的项目里,想要实现点击tabcontrol的每个tab,切换到不同窗口显示不同摄像头的实时画
- 3.IDA-数据显示窗口(导出窗口、导入窗口、String窗口、...窗口)
- 在指定位置显示窗口
- Qt 结构体 正则表达 居中显示 页面置顶 页面全局化 标题命名 标题最大化等按钮失效 去标题栏令窗口不可移动